<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
         targetNamespace = "http://www.sbml.org/sbml/level1"
         xmlns:naa = "http://www.sbml.org/sbml/level1"
         elementFormDefault = "qualified">

  <xsd:annotation>
    <xsd:documentation>
      File name : sbml.xsd
      Author : D. Lucio, J. Schaff, A. Finney, M. Hucka, H. Sauro
      Description : XML Schema for the Systems Biology Markup Language Level 1
      Version : 1
      Modified : $Date: 2008-06-26 13:24:00 -0700 (Thu, 26 Jun 2008) $
      Revision: $Id: sbml.xsd 7155 2008-06-26 20:24:00Z mhucka $

      Copyright 2002-2003 California Institute of Technology and Japan Science
      and Technology Corporation.
      
      This library is free software; you can redistribute it and/or modify it
      under the terms of the GNU Lesser General Public License as published
      by the Free Software Foundation; either version 2.1 of the License, or
      any later version.
      
      This file 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.  The software 
      and documentation provided hereunder is on an "as is" basis, and the
      California Institute of Technology and Japan Science and Technology
      Corporation have no obligations to provide maintenance, support,
      updates, enhancements or modifications.  In no event shall the
      California Institute of Technology or the Japan Science and Technology
      Corporation be liable to any party for direct, indirect, special,
      incidental or consequential damages, including lost profits, arising
      out of the use of this software and its documentation, even if the
      California Institute of Technology and/or Japan Science and Technology
      Corporation have been advised of the possibility of such damage.  See
      the GNU Lesser General Public License for more details.
      
      You should have received a copy of the GNU Lesser General Public License
      along with this library; if not, write to the Free Software Foundation,
      Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
    </xsd:documentation>
  </xsd:annotation>

  <!-- SName -->
  <xsd:simpleType name="SName">

    <xsd:annotation>
      <xsd:documentation>
         SName type used for expressing names of components in a model
      </xsd:documentation>
    </xsd:annotation>

    <xsd:restriction base="xsd:string">
      <xsd:pattern value="(_|[a-z]|[A-Z])(_|[a-z]|[A-Z]|[0-9])*"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- SBase -->
  <xsd:complexType name="SBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
        Designed to allow a modeler or a package to attach
        information to each component.
      </xsd:documentation>
    </xsd:annotation>

    <xsd:sequence>
      <xsd:element name="notes" minOccurs="0">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:any namespace="http://www.w3.org/1999/xhtml"
                     processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="annotations" minOccurs="0">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>


  <!-- Parameter -->
  <xsd:complexType name="Parameter">

    <xsd:complexContent>
      <xsd:extension base="naa:SBase">
        <xsd:attribute name="name"  use="required"/>
        <xsd:attribute name="value" type="xsd:double" use="required"/>
        <xsd:attribute name="units" type="naa:SName" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- UnitKind -->
  <xsd:simpleType name="UnitKind">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="ampere"/>
      <xsd:enumeration value="becquerel"/>
      <xsd:enumeration value="candela"/>
      <xsd:enumeration value="celsius"/>
      <xsd:enumeration value="coulomb"/>
      <xsd:enumeration value="dimensionless"/>
      <xsd:enumeration value="farad"/>
      <xsd:enumeration value="gram"/>
      <xsd:enumeration value="gray"/>
      <xsd:enumeration value="henry"/>
      <xsd:enumeration value="hertz"/>
      <xsd:enumeration value="item"/>
      <xsd:enumeration value="joule"/>
      <xsd:enumeration value="katal"/>
      <xsd:enumeration value="kelvin"/>
      <xsd:enumeration value="kilogram"/>
      <xsd:enumeration value="liter"/>
      <xsd:enumeration value="litre"/>
      <xsd:enumeration value="lumen"/>
      <xsd:enumeration value="lux"/>
      <xsd:enumeration value="meter"/>
      <xsd:enumeration value="metre"/>
      <xsd:enumeration value="mole"/>
      <xsd:enumeration value="newton"/>
      <xsd:enumeration value="ohm"/>
      <xsd:enumeration value="pascal"/>
      <xsd:enumeration value="radian"/>
      <xsd:enumeration value="second"/>
      <xsd:enumeration value="siemens"/>
      <xsd:enumeration value="sievert"/>
      <xsd:enumeration value="steradian"/>
      <xsd:enumeration value="tesla"/>
      <xsd:enumeration value="volt"/>
      <xsd:enumeration value="watt"/>
      <xsd:enumeration value="weber"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- Unit -->
  <xsd:complexType name="Unit">
    <xsd:complexContent>
      <xsd:extension base="naa:SBase">
        <xsd:attribute name="kind" type="naa:UnitKind" use="required"/>
        <xsd:attribute name="exponent" type="xsd:integer" default="1"/>
        <xsd:attribute name="scale" type="xsd:integer" default="1"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- UnitDefinition -->
  <xsd:complexType name="UnitDefinition">
    <xsd:complexContent>
      <xsd:extension base="naa:SBase">
        <xsd:sequence>
          <xsd:element name="listOfUnits" minOccurs="0">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="unit" type="naa:Unit" maxOccurs="unbounded"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="name" type="naa:SName" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- Compartment -->
  <xsd:complexType name="Compartment">
    <xsd:complexContent>
      <xsd:extension base="naa:SBase">
        <xsd:attribute name="name" type="naa:SName" use="required"/>
        <xsd:attribute name="volume" type="xsd:double" default="1"/>
        <xsd:attribute name="units" type="naa:SName" use="optional"/>
        <xsd:attribute name="outside" type="naa:SName" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- Specie -->
  <xsd:complexType name="Specie">
    <xsd:complexContent>
      <xsd:extension base="naa:SBase">
        <xsd:attribute name="name" type="naa:SName" use="required"/>
        <xsd:attribute name="compartment" type="naa:SName" use="required"/>
        <xsd:attribute name="initialAmount" type="xsd:double" use="required"/>
        <xsd:attribute name="units" type="naa:SName" use="optional"/>
        <xsd:attribute name="boundaryCondition" use="optional" type="xsd:boolean" default="false"/>
        <xsd:attribute name="charge" type="xsd:integer" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>


  <!-- ListOfParameter  -->
  <xsd:element name="listOfParameters">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="parameter" type="naa:Parameter" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>


  <!-- Rule -->
  <xsd:simpleType name="RuleType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="scalar"/>
      <xsd:enumeration value="rate"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:complexType name="Rule" abstract="true">
    <xsd:complexContent>
      <xsd:extension base="naa:SBase">
        <xsd:attribute name="formula" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="AlgebraicRule">
    <xsd:complexContent>
      <xsd:extension base="naa:Rule"/>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="AssignmentRule" abstract="true">
    <xsd:complexContent>
      <xsd:extension base="naa:Rule">
        <xsd:attribute name="type" type="naa:RuleType" default="scalar"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="CompartmentVolumeRule">
    <xsd:complexContent>
      <xsd:extension base="naa:AssignmentRule">
        <xsd:attribute name="compartment" type="naa:SName" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="SpecieConcentrationRule">
    <xsd:complexContent>
      <xsd:extension base="naa:AssignmentRule">
        <xsd:attribute name="specie" type="naa:SName" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="ParameterRule">
    <xsd:complexContent>
      <xsd:extension base="naa:AssignmentRule">
        <xsd:attribute name="name" type="naa:SName" use="required"/>
        <xsd:attribute name="units" type="naa:SName" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>


  <!-- Reaction -->
  <xsd:element name="specieReference">
    <xsd:complexType>
      <xsd:complexContent>
        <xsd:extension base="naa:SBase">
          <xsd:attribute name="specie" type="xsd:string" use="required"/>
          <xsd:attribute name="stoichiometry" use="optional" type="xsd:integer" default="1"/>
          <xsd:attribute name="denominator" use="optional" type="xsd:integer" default="1"/>
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
  </xsd:element>


  <xsd:complexType name="KineticLaw">
    <xsd:complexContent>
      <xsd:extension base="naa:SBase">
        <xsd:sequence>
          <xsd:element ref="naa:listOfParameters" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="formula" type="xsd:string" use="required"/>
        <xsd:attribute name="timeUnits" type="naa:SName" use="optional"/>
        <xsd:attribute name="substanceUnits" type="naa:SName" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>


  <xsd:complexType name="Reaction">
    <xsd:complexContent>
      <xsd:extension base="naa:SBase">
        <xsd:sequence>
          <xsd:element name="listOfReactants">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element ref="naa:specieReference" maxOccurs="unbounded"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="listOfProducts">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element ref="naa:specieReference" maxOccurs="unbounded"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="kineticLaw" type="naa:KineticLaw" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="naa:SName" use="required"/>
        <xsd:attribute name="reversible" use="optional" type="xsd:boolean" default="true"/>
        <xsd:attribute name="fast" use="optional" type="xsd:boolean" default="false"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- Model -->
  <xsd:complexType name="Model">
    <xsd:complexContent>
      <xsd:extension base="naa:SBase">

        <xsd:sequence>
          <xsd:element name="listOfUnitDefinitions" minOccurs="0">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="unitDefinition" type="naa:UnitDefinition" maxOccurs="unbounded"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>

          <xsd:element name="listOfCompartments">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="compartment" type="naa:Compartment" maxOccurs="unbounded"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>

          <xsd:element name="listOfSpecies">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="specie" type="naa:Specie" maxOccurs="unbounded"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>

          <xsd:element ref="naa:listOfParameters" minOccurs="0"/>
          <xsd:element name="listOfRules" minOccurs="0">
            <xsd:complexType>
              <xsd:choice maxOccurs="unbounded">
                <xsd:element name="algebraicRule" type="naa:AlgebraicRule" minOccurs="0"/>
                <xsd:element name="compartmentVolumeRule" type="naa:CompartmentVolumeRule"
                             minOccurs="0"/>
                <xsd:element name="specieConcentrationRule" type="naa:SpecieConcentrationRule"
                             minOccurs="0"/>
                <xsd:element name="parameterRule" type="naa:ParameterRule" minOccurs="0"/>
              </xsd:choice>
            </xsd:complexType>
          </xsd:element>

          <xsd:element name="listOfReactions">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="reaction" type="naa:Reaction" maxOccurs="unbounded"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>

        </xsd:sequence>
        <xsd:attribute name="name" type="naa:SName" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- Top-level elements allowed in an SBML document. -->
  <xsd:complexType name="sbmlDocument">
    <xsd:sequence>
      <xsd:element name="model" type="naa:Model"/>
    </xsd:sequence>
    <xsd:attribute name="level" type="xsd:positiveInteger" use="required"/>
    <xsd:attribute name="version" type="xsd:positiveInteger" use="required"/>
  </xsd:complexType>

  <xsd:element name="sbml" type="naa:sbmlDocument"/>

  <!-- The end. -->

</xsd:schema>
