<?xml version="1.0" encoding="UTF-8"?>
<!--
 * Filename    : sbo-mathml.xsd
 * This is a reduced version of the XML Schema for MathML 2.0.  It
 * corresponds to the subset of MathML 2.0 used in SBO.
 *
 * It extends the MathML subset for SBML created by Andrew Finney and Michael Hucka.
 *
 * Copyright (C)  Melanie Courtot 2006
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more
 * details. http://www.gnu.org/licenses/gpl.txt
 *
 * Melanie Courtot
 * Computational Neurobiology, EMBL-EBI, Wellcome-Trust Genome Campus. Hinxton CB10 1SD, UK. courtot@ebi.ac.uk
-->
<xs:schema 	xmlns="http://www.w3.org/1998/Math/MathML"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               targetNamespace="http://www.w3.org/1998/Math/MathML"
               elementFormDefault="qualified"
               attributeFormDefault="unqualified">
    <xs:attributeGroup name="MathAttributes">
        <xs:attribute name="class" type="xs:NMTOKENS" use="optional"/>
        <xs:attribute name="style" type="xs:string" use="optional"/>
        <xs:attribute name="id" type="xs:ID" use="optional"/>
    </xs:attributeGroup>
    <xs:complexType name="MathBase">
        <xs:attributeGroup ref="MathAttributes"/>
    </xs:complexType>

    <!--I need to create a CiAttributes group to make possible ci type="vector" -->
    <xs:attributeGroup name="CiAttributes">
        <xs:attribute name="type" type="xs:string" use="optional"/>
        <xs:attribute name="definitionURL" type="xs:string" use="optional"/>
        <xs:attributeGroup ref="MathAttributes"/>
    </xs:attributeGroup>
    <xs:attributeGroup name="CnAttributes">
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="e-notation"/>
                    <xs:enumeration value="integer"/>
                    <xs:enumeration value="rational"/>
                    <xs:enumeration value="real"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attributeGroup ref="MathAttributes"/>
    </xs:attributeGroup>
    <xs:complexType name="SepType"/>
    <xs:complexType name="Cn" mixed="true">
        <xs:choice minOccurs="0">
            <xs:element name="sep" type="SepType"/>
        </xs:choice>
        <xs:attributeGroup ref="CnAttributes"/>
    </xs:complexType>
    <xs:complexType name="Ci">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attributeGroup ref="CiAttributes"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:simpleType name="CsymbolURI">
        <xs:restriction base="xs:string">
            <xs:enumeration value="http://www.sbml.org/sbml/symbols/time"/>
            <xs:enumeration value="http://www.sbml.org/sbml/symbols/delay"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="Csymbol">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="encoding" use="required" fixed="text"/>
                <xs:attribute name="definitionURL" type="CsymbolURI" use="required"/>
                <xs:attributeGroup ref="MathAttributes"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="NodeContainer">
        <xs:complexContent>
            <xs:extension base="MathBase">
                <xs:group ref="Node"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="Apply">
        <xs:complexContent>
            <xs:extension base="MathBase">
                <xs:sequence>
                    <xs:choice>
                        <xs:element name="ci" type="Ci"/>
                        <xs:element name="csymbol" type="Csymbol"/>
                        <xs:element name="eq" type="MathBase"/>
                        <xs:element name="neq" type="MathBase"/>
                        <xs:element name="gt" type="MathBase"/>
                        <xs:element name="lt" type="MathBase"/>
                        <xs:element name="geq" type="MathBase"/>
                        <xs:element name="leq" type="MathBase"/>
                        <xs:element name="plus" type="MathBase"/>
                        <xs:element name="minus" type="MathBase"/>
                        <xs:element name="times" type="MathBase"/>
                        <xs:element name="divide" type="MathBase"/>
                        <xs:element name="power" type="MathBase"/>
                        <xs:sequence>
                            <xs:element name="root" type="MathBase"/>
                            <xs:element name="degree" type="NodeContainer" minOccurs="0"/>
                        </xs:sequence>
                        <xs:element name="abs" type="MathBase"/>
                        <xs:element name="exp" type="MathBase"/>
                        <xs:element name="ln" type="MathBase"/>
                        <xs:sequence>
                            <xs:element name="log" type="MathBase"/>
                            <xs:element name="logbase" type="NodeContainer" minOccurs="0"/>
                        </xs:sequence>
                        <xs:element name="floor" type="MathBase"/>
                        <xs:element name="ceiling" type="MathBase"/>
                        <xs:element name="factorial" type="MathBase"/>
                        <xs:element name="and" type="MathBase"/>
                        <xs:element name="or" type="MathBase"/>
                        <xs:element name="xor" type="MathBase"/>
                        <xs:element name="not" type="MathBase"/>
                        <xs:element name="sin" type="MathBase"/>
                        <xs:element name="cos" type="MathBase"/>
                        <xs:element name="tan" type="MathBase"/>
                        <xs:element name="sec" type="MathBase"/>
                        <xs:element name="csc" type="MathBase"/>
                        <xs:element name="cot" type="MathBase"/>
                        <xs:element name="sinh" type="MathBase"/>
                        <xs:element name="cosh" type="MathBase"/>
                        <xs:element name="tanh" type="MathBase"/>
                        <xs:element name="sech" type="MathBase"/>
                        <xs:element name="csch" type="MathBase"/>
                        <xs:element name="coth" type="MathBase"/>
                        <xs:element name="arcsin" type="MathBase"/>
                        <xs:element name="arccos" type="MathBase"/>
                        <xs:element name="arctan" type="MathBase"/>
                        <xs:element name="arcsec" type="MathBase"/>
                        <xs:element name="arccsc" type="MathBase"/>
                        <xs:element name="arccot" type="MathBase"/>
                        <xs:element name="arcsinh" type="MathBase"/>
                        <xs:element name="arccosh" type="MathBase"/>
                        <xs:element name="arctanh" type="MathBase"/>
                        <xs:element name="arcsech" type="MathBase"/>
                        <xs:element name="arccsch" type="MathBase"/>
                        <xs:element name="arccoth" type="MathBase"/>
                        <xs:element name="sum" type="MathBase"/>
                        <!-- if we have product, it can also contains bvar -->
                        <xs:sequence>
                            <xs:element name="product" type="MathBase"/>
                            <xs:element name="bvar" type="Bvar" maxOccurs="unbounded" minOccurs="0"/>
                        </xs:sequence>
                        <xs:element name="selector" type="MathBase"/>
                        <xs:element name="lowlimit" type="Limit"/>
                        <xs:element name="uplimit" type="Limit"/>
                    </xs:choice>
                    <!-- we can have an apply containing only ci -->
                    <xs:group ref="Node" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="Piece">
        <xs:complexContent>
            <xs:extension base="MathBase">
                <xs:group ref="Node" minOccurs="2" maxOccurs="2"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="Otherwise">
        <xs:complexContent>
            <xs:extension base="MathBase">
                <xs:group ref="Node"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="Piecewise">
        <xs:complexContent>
            <xs:extension base="MathBase">
                <xs:sequence>
                    <xs:element name="piece" type="Piece" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="otherwise" type="Otherwise" minOccurs="0" maxOccurs="1"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:attributeGroup name="AnnotationAttributes">
        <xs:attributeGroup ref="MathAttributes"/>
        <xs:attribute name="encoding" type="xs:string" use="required"/>
    </xs:attributeGroup>
    <xs:complexType name="Annotation">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attributeGroup ref="AnnotationAttributes"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="Annotation-xml">
        <xs:sequence maxOccurs="unbounded">
            <xs:any processContents="skip"/>
        </xs:sequence>
        <xs:attributeGroup ref="AnnotationAttributes"/>
    </xs:complexType>
    <!-- the semantics element can have a definitionURL attribute and contain a lambda element -->
    <xs:complexType name="Semantics">
        <xs:complexContent>
            <xs:extension base="MathBase">
                <xs:sequence>
                    <xs:element name="lambda" type="Lambda"/>
                </xs:sequence>
                <xs:attribute name="definitionURL" type="xs:string" use="optional"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:group name="Node">
        <xs:choice>
            <xs:element name="apply" type="Apply"/>
            <xs:element name="cn" type="Cn"/>
            <xs:element name="ci" type="Ci"/>
            <xs:element name="csymbol" type="Csymbol"/>
            <xs:element name="true" type="MathBase"/>
            <xs:element name="false" type="MathBase"/>
            <xs:element name="notanumber" type="MathBase"/>
            <xs:element name="pi" type="MathBase"/>
            <xs:element name="infinity" type="MathBase"/>
            <xs:element name="exponentiale" type="MathBase"/>
            <xs:element name="semantics" type="Semantics"/>
            <xs:element name="piecewise" type="Piecewise"/>
            <xs:element name="sum" type="MathBase"/>
            <!-- if we have product, it can also contains bvar -->
            <xs:sequence>
                <xs:element name="product" type="MathBase"/>
                <xs:element name="bvar" type="Bvar" maxOccurs="unbounded" minOccurs="0"/>
            </xs:sequence>
            <xs:element name="selector" type="MathBase"/>
            <xs:element name="lowlimit" type="Limit"/>
            <xs:element name="uplimit" type="Limit"/>
        </xs:choice>
    </xs:group>
    <xs:complexType name="Limit">
        <xs:complexContent>
            <xs:extension base="MathBase">
                <xs:sequence>
                    <xs:choice>
                        <xs:element name="ci" type="Ci"/>
                        <xs:element name="cn" type="Cn"/>
                    </xs:choice>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Bvar">
        <xs:complexContent>
            <xs:extension base="MathBase">
                <xs:sequence>
                    <xs:element name="ci" type="Ci"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="Lambda">
        <xs:complexContent>
            <xs:extension base="MathBase">
                <xs:sequence>
                    <xs:element name="bvar" type="Bvar"
                                minOccurs="0" maxOccurs="unbounded"/>
                    <xs:group ref="Node"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="Math">
        <xs:complexContent>
            <xs:extension base="MathBase">
                <xs:choice>
                    <xs:group ref="Node"/>
                    <xs:element name="lambda" type="Lambda"/>
                </xs:choice>
            </xs:extension>
        </xs:complexContent>
        <!--Most <math> elements in SBO can have a variety of constructs, but in the definitions of user-defined functions, <math> elements must contain a single <lambda>.  The way this is handled in this schema is through the use of a group element that permits either a lambda or a more general MathML content tree.  The latter is expressed in this schema using a complex type called "Node".  It is called a node because it is a node of a tree structure.-->
    </xs:complexType>
    <xs:element name="math" type="Math">
        <!--This is the top-level element for a 'math' container in SBO.-->
    </xs:element>
</xs:schema>

