<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:doc="urn:oid:1.0.10303.28.2.1.3"
           xmlns:cnf="urn:oid:1.0.10303.28.2.1.2"
           xmlns:exp="urn:iso:std:iso:10303:28:ed-2:2005:schema:common"
           targetNamespace="urn:oid:1.0.10303.28.2.1.3"
           elementFormDefault="unqualified"
           attributeFormDefault="unqualified"><!--The value for exp.xsd below provides the location of the Base XML Schema (see Annex C). The value for cnf.xsd below provides the location of the configuration language XML schema (see Annex B).--><xs:import schemaLocation="cnf.xsd" namespace="urn:oid:1.0.10303.28.2.1.2"/>
   <xs:import schemaLocation="ex.xsd"
              namespace="urn:iso:std:iso:10303:28:ed-2:2005:schema:common"/>
   <xs:element name="iso_10303_28">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="exp:header" minOccurs="0"/>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
               <xs:element ref="doc:schema_population"/>
               <xs:element ref="exp:uos"/>
               <xs:element ref="doc:express"/>
               <xs:element ref="doc:schema"/>
               <xs:element ref="cnf:configuration"/>
            </xs:choice>
         </xs:sequence>
         <xs:attribute name="version" type="xs:string" use="required"/>
         <xs:attribute name="edo" type="xs:anyURI" use="optional"/>
      </xs:complexType>
   </xs:element>
   <xs:element name="schema_population">
      <xs:complexType>
         <xs:attribute name="governing_schema" type="xs:IDREF" use="required"/>
         <xs:attribute name="governed_sections" type="xs:IDREFS" use="optional"/>
         <xs:attribute name="determination_method" type="xs:normalizedString"
                       default="section_boundary"/>
      </xs:complexType>
   </xs:element>
   <xs:element name="express" nillable="true">
      <xs:complexType>
         <xs:simpleContent>
            <xs:extension base="xs:string">
               <xs:attribute name="schemaLocation" type="exp:Seq-anyURI" use="optional"/>
               <xs:attribute name="id" type="xs:ID" use="required"/>
               <xs:attribute name="schema_identifier" type="xs:normalizedString" use="optional"/>
               <xs:attribute name="schema_name" type="xs:normalizedString" use="optional"/>
               <xs:attribute name="schema_version" type="xs:normalizedString" use="optional"/>
            </xs:extension>
         </xs:simpleContent>
      </xs:complexType>
   </xs:element>
   <!-- EXPRESS MODEL SCHEMA --><!-- This set of declarations defines a model of the EXPRESS language
     as specified by ISO 10303-11.2:2004.
--><!-- This specification was developed as a DTD by Eurostep 
     for the STEP Modules Repository Project, 
     and is here incorporated by permission.
--><!--                    data type                                --><!-- represents the structure of an EXPRESS data type referenece --><xs:group name="datatype">
      <xs:sequence>
         <xs:element ref="doc:aggregate" minOccurs="0" maxOccurs="unbounded"/>
         <xs:choice>
            <xs:element ref="doc:typename"/>
            <xs:element ref="doc:builtintype"/>
         </xs:choice>
      </xs:sequence>
   </xs:group>
   <!--                    identifiers                                  --><!-- identifier = an EXPRESS identifier =the name of a named element --><!-- identifiers = a list of EXPRESS identifiers                     --><xs:simpleType name="identifier">
      <xs:restriction base="xs:string"/>
   </xs:simpleType>
   <xs:simpleType name="identifiers">
      <xs:list itemType="doc:identifier"/>
   </xs:simpleType>
   <!--                    express.text                                 --><!-- represents a body of unparsed EXPRESS text                      --><xs:simpleType name="express.text">
      <xs:restriction base="xs:string"/>
   </xs:simpleType>
   <!--                    description                                --><!-- The original DTD version of this used an XML parameter entity --><!-- to allow the structure of the description element to be       --><!-- externally specified.                                         --><xs:simpleType name="description.content">
      <xs:restriction base="xs:string"/>
   </xs:simpleType>
   <xs:element name="description" type="doc:description.content"/>
   <!--                  graphic.element                              --><!-- represents an EXPRESS-G reference symbol                      --><xs:element name="graphic.element">
      <xs:complexType>
         <xs:attribute name="image" type="xs:string" use="optional"/>
         <xs:attribute name="page" type="xs:string" use="required"/>
         <xs:attribute name="xcoord" type="xs:string" use="optional"/>
         <xs:attribute name="ycoord" type="xs:string" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!--                     express_model                             --><!-- This is the document element, containing one or more schemas. --><xs:element name="express_model">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:element ref="doc:application" minOccurs="0"/>
            <xs:element ref="doc:schema" minOccurs="1" maxOccurs="unbounded"/>
         </xs:sequence>
         <xs:attribute name="language_version" default="1">
            <xs:simpleType>
               <xs:restriction base="xs:string">
                  <xs:enumeration value="1"/>
                  <xs:enumeration value="2"/>
                  <xs:enumeration value="3"/>
               </xs:restriction>
            </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="reference" type="xs:string" use="optional"/>
         <!--    reference is the source of the schema, for example ISO 10303-41        --><xs:attribute name="description.file" type="xs:string" use="optional"/>
         <!-- The rcs attributes are keywords for RCS source control systems     --><!--    rcs.date      $Date: 2003/07/18 21:50:20 $                      --><!--    rcs.revision  $Revision: 1.14 $                                 --><xs:attribute name="rcs.date" type="xs:string" use="required"/>
         <xs:attribute name="rcs.revision" type="xs:string" use="required"/>
      </xs:complexType>
   </xs:element>
   <xs:element name="application">
      <xs:complexType>
         <xs:attribute name="name" type="xs:string" use="optional"/>
         <xs:attribute name="owner" type="xs:string" use="optional"/>
         <xs:attribute name="url" type="xs:string" use="optional"/>
         <xs:attribute name="version" type="xs:string" use="optional"/>
         <xs:attribute name="source" type="xs:string" use="required"/>
      </xs:complexType>
   </xs:element>
   <!--                 EXPRESS language elements                     --><!--                 SCHEMA declaration                            --><xs:element name="schema">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:element ref="doc:interface" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="doc:constant" minOccurs="0" maxOccurs="unbounded"/>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
               <xs:element ref="doc:entity"/>
               <xs:element ref="doc:function"/>
               <xs:element ref="doc:procedure"/>
               <xs:element ref="doc:rule"/>
               <xs:element ref="doc:subtype.constraint"/>
               <xs:element ref="doc:type"/>
            </xs:choice>
            <xs:element ref="doc:graphic.element" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="id" type="xs:ID" use="required"/>
         <xs:attribute name="schemaLocation" type="exp:Seq-anyURI" use="optional"/>
         <xs:attribute name="name" type="doc:identifier" use="optional"/>
         <xs:attribute name="version" type="doc:identifier" use="optional"/>
         <xs:attribute name="schemaIdentifier" type="xs:normalizedString" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!--              interface (USE and REFERENCE)                    --><xs:element name="interface">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:interfaced.item" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="doc:described.item" minOccurs="0" maxOccurs="unbounded"/>
         </xs:sequence>
         <xs:attribute name="kind" default="USE">
            <xs:simpleType>
               <xs:restriction base="xs:string">
                  <xs:enumeration value="USE"/>
                  <xs:enumeration value="REFERENCE"/>
               </xs:restriction>
            </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="schema" type="doc:identifier" use="required"/>
      </xs:complexType>
   </xs:element>
   <!-- interfaced.item
    REFERENCE FROM schema (interfaced.item .name AS .alias)
--><xs:element name="interfaced.item">
      <xs:complexType>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
         <xs:attribute name="alias" type="doc:identifier" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!-- described.item
  A description of an interfaced.item.
  The described.item specifies what kind of language element the 
  interfaced.item is, and may include other documentation.

  item is the EXPRESS identifier for the interfaced.item
  attribute is used to describe attributes of an interfaced ENTITY
    item is the name of the entity
    attribute is the name of the attribute
 --><xs:element name="described.item">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="item" type="doc:identifier" use="required"/>
         <xs:attribute name="attribute" type="doc:identifier" use="optional"/>
         <xs:attribute name="kind" default="ENTITY">
            <xs:simpleType>
               <xs:restriction base="xs:string">
                  <xs:enumeration value="ENTITY"/>
                  <xs:enumeration value="TYPE"/>
                  <xs:enumeration value="ATTRIBUTE"/>
                  <xs:enumeration value="FUNCTION"/>
                  <xs:enumeration value="PROCEDURE"/>
                  <xs:enumeration value="CONSTANT"/>
               </xs:restriction>
            </xs:simpleType>
         </xs:attribute>
      </xs:complexType>
   </xs:element>
   <!--              CONSTANT declaration                     --><xs:element name="constant">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:group ref="doc:datatype"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
         <xs:attribute name="expression" type="doc:express.text" use="required"/>
      </xs:complexType>
   </xs:element>
   <!--              TYPE declaration                        --><xs:element name="type">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:element ref="doc:aggregate" minOccurs="0" maxOccurs="unbounded"/>
            <xs:choice>
               <xs:element ref="doc:typename"/>
               <xs:element ref="doc:builtintype"/>
               <xs:element ref="doc:enumeration"/>
               <xs:element ref="doc:select"/>
            </xs:choice>
            <xs:element ref="doc:where" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="doc:graphic.element" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
      </xs:complexType>
   </xs:element>
   <!-- typename = reference to a defined data type by name --><xs:element name="typename">
      <xs:complexType>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
      </xs:complexType>
   </xs:element>
   <!-- builtintype = a data type identified by an EXPRESS keyword --><xs:element name="builtintype">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:graphic.element" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="type" use="required">
            <xs:simpleType>
               <xs:restriction base="xs:string">
                  <xs:enumeration value="BINARY"/>
                  <xs:enumeration value="BOOLEAN"/>
                  <xs:enumeration value="GENERIC"/>
                  <xs:enumeration value="GENERICENTITY"/>
                  <xs:enumeration value="INTEGER"/>
                  <xs:enumeration value="LOGICAL"/>
                  <xs:enumeration value="NUMBER"/>
                  <xs:enumeration value="REAL"/>
                  <xs:enumeration value="STRING"/>
               </xs:restriction>
            </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="width" type="doc:express.text" use="optional"/>
         <!--      Width specification for BINARY or STRING --><xs:attribute name="fixed" type="xs:boolean" default="false"/>
         <!--      Fixed specification for BINARY or STRING --><xs:attribute name="precision" type="doc:express.text" use="optional"/>
         <!--      Precision specification for REAL --><xs:attribute name="typelabel" type="doc:identifier" use="optional"/>
         <!--      Type label on GENERIC or GENERIC_ENTITY --></xs:complexType>
   </xs:element>
   <!-- aggregate = an aggregation type constructor   --><xs:element name="aggregate">
      <xs:complexType>
         <xs:attribute name="type" default="SET">
            <xs:simpleType>
               <xs:restriction base="xs:string">
                  <xs:enumeration value="AGGREGATE"/>
                  <xs:enumeration value="ARRAY"/>
                  <xs:enumeration value="BAG"/>
                  <xs:enumeration value="LIST"/>
                  <xs:enumeration value="SET"/>
               </xs:restriction>
            </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="optional" type="xs:boolean" default="false"/>
         <!--      OPTIONAL specification for ARRAY --><xs:attribute name="unique" type="xs:boolean" default="false"/>
         <!--      UNIQUE specification for ARRAY or LIST or AGGREGATE  --><xs:attribute name="lower" type="doc:express.text" use="optional"/>
         <!--      lower-bound specification, or LoIndex for ARRAY --><xs:attribute name="upper" type="doc:express.text" use="optional"/>
         <!--      upper-bound specification, or HiIndex for ARRAY --><xs:attribute name="typelabel" type="doc:identifier" use="optional"/>
         <!--      Type label on AGGREGATE --></xs:complexType>
   </xs:element>
   <!-- select = a select type constructor   --><xs:element name="select">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:graphic.element" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="extensible" type="xs:boolean" default="false"/>
         <xs:attribute name="genericentity" type="xs:boolean" default="false"/>
         <xs:attribute name="basedon" type="doc:identifier" use="optional"/>
         <xs:attribute name="selectitems" type="doc:identifiers" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!-- enumeration = an enumeration type constructor   --><xs:element name="enumeration">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:graphic.element" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="extensible" type="xs:boolean" default="false"/>
         <xs:attribute name="basedon" type="doc:identifier" use="optional"/>
         <xs:attribute name="items" type="doc:identifiers" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!--              ENTITY declaration                      --><xs:element name="entity">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:element ref="doc:explicit" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="doc:derived" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="doc:inverse" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="doc:unique" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="doc:where" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="doc:graphic.element" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
         <xs:attribute name="abstract.entity" type="xs:boolean" default="false"/>
         <xs:attribute name="abstract.supertype" type="xs:boolean" default="false"/>
         <xs:attribute name="supertypes" type="doc:identifiers" use="optional"/>
         <xs:attribute name="super.expression" type="doc:express.text" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!-- explicit = an explicit attribute declaration   --><xs:element name="explicit">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:group ref="doc:datatype"/>
            <xs:element ref="doc:redeclaration" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
         <xs:attribute name="optional" type="xs:boolean" default="false"/>
      </xs:complexType>
   </xs:element>
   <!-- derived = a derived attribute declaration   --><xs:element name="derived">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:group ref="doc:datatype"/>
            <xs:element ref="doc:redeclaration" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
         <xs:attribute name="expression" type="doc:express.text" use="required"/>
      </xs:complexType>
   </xs:element>
   <!-- inverse = an inverse attribute declaration   --><xs:element name="inverse">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:element ref="doc:inverse.aggregate" minOccurs="0"/>
            <xs:element ref="doc:redeclaration" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
         <xs:attribute name="entity" type="doc:identifier" use="required"/>
         <xs:attribute name="attribute" type="doc:identifier" use="required"/>
      </xs:complexType>
   </xs:element>
   <!-- inverse.aggregate = multiplicity specification for inverse attribute
     type is SET or BAG
     lower is lower-bound specification
     upper is upper-bound specification
  --><xs:element name="inverse.aggregate">
      <xs:complexType>
         <xs:attribute name="type" default="SET">
            <xs:simpleType>
               <xs:restriction base="xs:string">
                  <xs:enumeration value="BAG"/>
                  <xs:enumeration value="SET"/>
               </xs:restriction>
            </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="lower" type="doc:express.text" use="optional"/>
         <xs:attribute name="upper" type="doc:express.text" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!-- redeclaration = the attribute being redeclared by this attribute --><xs:element name="redeclaration">
      <xs:complexType>
         <xs:attribute name="entity-ref" type="doc:identifier" use="required"/>
         <xs:attribute name="old_name" type="doc:identifier" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!-- where = a rule declaration                                --><!-- used for both local rules and global rules   --><xs:element name="where">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="label" type="doc:identifier" use="optional"/>
         <xs:attribute name="expression" type="doc:express.text" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!-- unique = a UNIQUE rule declaration   --><xs:element name="unique">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:element ref="doc:unique.attribute" minOccurs="1" maxOccurs="unbounded"/>
         </xs:sequence>
         <xs:attribute name="label" type="doc:identifier" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!-- unique.attribute - a key attribute in a UNIQUE rule --><xs:element name="unique.attribute">
      <xs:complexType>
         <xs:attribute name="entity-ref" type="doc:identifier" use="optional"/>
         <xs:attribute name="attribute" type="doc:identifier" use="required"/>
      </xs:complexType>
   </xs:element>
   <!--              SUBTYPE_CONSTRAINT declaration                    --><xs:element name="subtype.constraint">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:element ref="doc:graphic.element" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
         <xs:attribute name="entity" type="doc:identifier" use="required"/>
         <xs:attribute name="abstract.supertype" type="xs:boolean" default="false"/>
         <xs:attribute name="totalover" type="doc:identifiers" use="optional"/>
         <xs:attribute name="super.expression" type="doc:express.text" use="optional"/>
      </xs:complexType>
   </xs:element>
   <!--              algorithms                              --><!--              FUNCTION declaration                    --><xs:element name="function">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:element ref="doc:parameter" minOccurs="0" maxOccurs="unbounded"/>
            <xs:group ref="doc:datatype"/>
            <!-- represents the return type of the function --><xs:element ref="doc:algorithm"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
      </xs:complexType>
   </xs:element>
   <!--              PROCEDURE declaration                    --><xs:element name="procedure">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:element ref="doc:parameter" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="doc:algorithm" minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
      </xs:complexType>
   </xs:element>
   <!--              parameter declaration                    --><xs:element name="parameter">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:group ref="doc:datatype"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
      </xs:complexType>
   </xs:element>
   <!-- algorithm represents the function/procedure body,
     including local variable declarations, as a string --><xs:element name="algorithm" type="doc:express.text"/>
   <!--              RULE declaration                    --><xs:element name="rule">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="doc:description" minOccurs="0"/>
            <xs:element ref="doc:algorithm" minOccurs="0"/>
            <xs:element ref="doc:where" minOccurs="1" maxOccurs="unbounded"/>
         </xs:sequence>
         <xs:attribute name="name" type="doc:identifier" use="required"/>
         <xs:attribute name="appliesto" type="doc:identifiers" use="required"/>
      </xs:complexType>
   </xs:element>
</xs:schema>