<?xml version="1.0" encoding="UTF-8"?>
<!-- This software and related documentation are proprietary to       -->
<!-- Unigraphics Solutions Inc. (c) 2001. Unigraphics Solutions Inc.  -->
<!-- All Rights Reserved.                                             -->
<!--                                                                  -->
<!-- Restricted Rights Legend: This commercial computer software and  -->
<!-- related documentation are provided with restricted rights. Use,  -->
<!-- duplication or disclosure by the U.S. Government is subject to   -->
<!-- the protections and restrictions as set forth in the Unigraphics -->
<!-- Solutions Inc. commercial license for the software and/or        -->
<!-- documentation as prescribed in DOD FAR 227-7202-3(a), or for     -->
<!-- Civilian agencies, in FAR 27.404(b)(2)(i), and any successor or  -->
<!-- similar regulation, as applicable.                               -->
<!--                                                                  -->
<!--  Unigraphics Solutions Inc., 13736 Riverport Drive,              -->
<!--  Maryland Heights, MO 63043-4826.                                -->
<!--                                                                  -->
<!--                                                                  -->
<xsd:schema targetNamespace="http://www.plmxml.org/Schemas/PLMXMLSchema" xmlns:plm="http://www.plmxml.org/Schemas/PLMXMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xml:lang="en">
  <xsd:annotation>
    <xsd:documentation>
    
                        PLMXML Schema
                        
    </xsd:documentation>
    <xsd:appinfo source="http://www.plmxml.org/Schemas/PLMXMLSchema">
      <version name="PLMXMLSchema.xsd" date="2003-01-20" version="3.0" status="release"/>
    </xsd:appinfo>
  </xsd:annotation>
  <xsd:attributeGroup name="idGroup">
    <xsd:annotation>
      <xsd:documentation>
      The 'id' attribute is used for references between elements. It 
      should not be use to encode other information.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:attributeGroup>
  <!-- -->
  <xsd:complexType name="IdBase" abstract="true">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=IdObject</xsd:appinfo>
    </xsd:annotation>
    <xsd:attributeGroup ref="plm:idGroup"/>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="DescriptionType">
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="anyURIType">
    <xsd:annotation>
      <xsd:documentation>
      plm:anyURIType is used in place of xsd:anyURI, since we want to allow
      filenames as well as genuine URIs.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="ApplicationRefType">
    <xsd:annotation>
      <xsd:documentation>
      The ApplicationRef element is meant to relate the parent element (Part, Representation, etc) 
      back to the owning entity in the sending  application.

      Attributes:

      application:     the context in which the contents of the label and version attributes 
                       make sense. Whether this field includes an application version number 
                       is up to the application, as long as it starts with something identifiable 
                       to the sending application.

      label:           the string which identifies the application entity - the value of this field
                       is only meaningful to the sending/authoring application. The receiving 
                       application can compare the contents of the attribute to test if two entities 
                       are the 'same' entity. But the actual value is meaningless to the receiving 
                       application.

      version:         the optional string attribute which identifies the version of the application 
                       entity. This attribute can only be used to test if the versions of an entity 
                       are the same (i.e. the test is only meaningful if the label attribute values 
                       are the same). No version ordering can be deduced from the value. Similar to 
                       the label attribute, the version attribute contents are meaningless to the 
                       receiving application.
    </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="application" type="xsd:string" use="required"/>
    <xsd:attribute name="label" type="xsd:string" use="required"/>
    <xsd:attribute name="version" type="xsd:string" use="optional"/>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="DescriptionBase" abstract="true">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=DescriptionObject</xsd:appinfo>
      <xsd:documentation>
      The DescriptionBase type is an abstract base type for PLM XML types which have optional 
      description and ApplicationRef.
			         
      Sub-elements:
			
      Description      Readable textual description of the element.
      ApplicationRef   A means of uniquely identifying the element in terms understood by the
                       sending system. More than one is allowed (at most one per Application).
       </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:IdBase">
        <xsd:sequence>
          <xsd:element name="Description" type="plm:DescriptionType" minOccurs="0"/>
          <xsd:element name="ApplicationRef" type="plm:ApplicationRefType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <!--xsd:simpleType name="EntityRefType">
    <xsd:restriction base="plm:anyURIType"/>
  </xsd:simpleType -->
  <!-- -->
  <xsd:attributeGroup name="referenceGroup">
    <xsd:attribute name="location" type="plm:anyURIType" use="optional"/>
    <xsd:attribute name="load" type="xsd:boolean" default="false"/>
  </xsd:attributeGroup>
  <!-- -->
  <xsd:simpleType name="uriReferenceListType">
    <xsd:list itemType="plm:anyURIType"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="IntegerListType">
    <xsd:list itemType="xsd:integer"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="BooleanListType">
    <xsd:list itemType="xsd:boolean"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="FloatListType">
    <xsd:list itemType="xsd:float"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="DoubleListType">
    <xsd:list itemType="xsd:double"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="VectorType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:length value="3"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="DirectionType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:length value="3"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="PositionType">
    <xsd:simpleContent>
      <xsd:extension base="plm:VectorType">
        <xsd:attributeGroup ref="plm:idGroup"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="NormalType">
    <xsd:simpleContent>
      <xsd:extension base="plm:VectorType">
        <xsd:attributeGroup ref="plm:idGroup"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="MatrixType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:minLength value="1"/>
      <xsd:maxLength value="16"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="TransformationType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="general"/>
      <xsd:enumeration value="general3"/>
      <xsd:enumeration value="rotate"/>
      <xsd:enumeration value="translate"/>
      <xsd:enumeration value="scale"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="TransformType">
    <xsd:simpleContent>
      <xsd:extension base="plm:MatrixType">
        <xsd:attributeGroup ref="plm:idGroup"/>
        <xsd:attribute name="type" type="plm:TransformationType" default="general"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="BoxBoundType">
    <xsd:annotation>
      <xsd:documentation>
      This is a legacy box type. The 'Bound' element should be used.
      </xsd:documentation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">output=ignore</xsd:appinfo>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="LowCorner" type="plm:VectorType"/>
      <xsd:element name="HighCorner" type="plm:VectorType"/>
    </xsd:sequence>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="SphereBoundType">
    <xsd:annotation>
      <xsd:documentation>
      This is a legacy sphere bound type. The 'Bound' element should be used.
      </xsd:documentation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">output=ignore</xsd:appinfo>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="Radius" type="xsd:double"/>
      <xsd:element name="Centre" type="plm:VectorType"/>
    </xsd:sequence>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="BoundingType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="box"/>
      <xsd:enumeration value="sphere"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="BoundType">
    <xsd:annotation>
      <xsd:documentation>
      This is a box or sphere-shaped bound in 3-space.
      
      Attributes:
      
      type:          'box' or 'sphere'
      values:        6 or 4 doubles. If a box, these are the coordinates of
                     the centre, followed by xwidth/2, ywidth/2, zwidth/2.
                     If a sphere, these are centre, radius.
      transformRef:  Optional transform, to achieve non-aligned boxes.
      
      SubElements:
      Transform:     Optional transform.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="Transform" type="plm:TransformType" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="type" type="plm:BoundingType" default="box"/>
    <xsd:attribute name="values" type="plm:DoubleListType" use="required"/>
    <xsd:attribute name="transformRef" type="xsd:IDREF" use="optional"/>
  </xsd:complexType>
  <!--*** Attributes -->
  <!-- -->
  <xsd:simpleType name="IntegerFieldType">
    <xsd:restriction base="xsd:integer"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="IntegerFieldListType">
    <xsd:list itemType="plm:IntegerFieldType"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="RealFieldType">
    <xsd:restriction base="xsd:double"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="RealFieldListType">
    <xsd:restriction base="plm:DoubleListType"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="StringFieldType">
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="VectorFieldType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:length value="3"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="CoordinateFieldType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:length value="3"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="DirectionFieldType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:length value="3"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="AxisFieldType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:length value="6"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <!--xsd:simpleType name="EntityFieldType">
    <xsd:restriction base="plm:EntityRefType"/>
  </xsd:simpleType -->
  <!-- -->
  <!--xsd:simpleType name="EntityFieldListType">
    <xsd:list itemType="plm:EntityFieldType"/>
  </xsd:simpleType -->
  <!-- -->
  <xsd:simpleType name="AttributeOwnerType">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">output=ignore</xsd:appinfo>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="assembly"/>
      <xsd:enumeration value="instance"/>
      <xsd:enumeration value="body"/>
      <xsd:enumeration value="region"/>
      <xsd:enumeration value="shell"/>
      <xsd:enumeration value="face"/>
      <xsd:enumeration value="loop"/>
      <xsd:enumeration value="edge"/>
      <xsd:enumeration value="fin"/>
      <xsd:enumeration value="vertex"/>
      <xsd:enumeration value="group"/>
      <xsd:enumeration value="surface"/>
      <xsd:enumeration value="curve"/>
      <xsd:enumeration value="point"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="AttributeClassType">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">output=ignore</xsd:appinfo>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="class_01"/>
      <xsd:enumeration value="class_02"/>
      <xsd:enumeration value="class_03"/>
      <xsd:enumeration value="class_04"/>
      <xsd:enumeration value="class_05"/>
      <xsd:enumeration value="class_06"/>
      <xsd:enumeration value="class_07"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="AttributeLegalOwnerType">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">output=ignore</xsd:appinfo>
    </xsd:annotation>
    <xsd:attribute name="name" type="plm:AttributeOwnerType" use="required"/>
  </xsd:complexType>
  <xsd:element name="AttributeLegalOwner" type="plm:AttributeLegalOwnerType"/>
  <!-- -->
  <xsd:complexType name="AttributeClassBase" abstract="true">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">output=ignore</xsd:appinfo>
    </xsd:annotation>
    <xsd:attribute name="name" type="plm:AttributeClassType" use="required"/>
  </xsd:complexType>
  <xsd:element name="AttributeClass" type="plm:AttributeClassBase"/>
  <!-- -->
  <xsd:complexType name="AttributeBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      The Attribute element is an abstract element. Useful attributes
      (ones that include fields) must be derived from the Attribute element
      defined within this schema. The derived attributes will define their 
      data elements to represent data fields.
    
      The derived attributes also need to be set as 'equivalent' to the 
      Attribute element. This enables the new derived attribute to be
      inserted into documents wherever the Attribute element is allowed.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:DescriptionBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Attribute" type="plm:AttributeBase"/>
  <!--*** Base Classes -->
  <!-- -->
  <xsd:complexType name="AttribOwnerBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
        Base class for elements which have PLMXML Attributes, i.e. elements
        derived from plm:AttributeBase.
      
        Attributes:
        
        attributeRefs: reference to Attributes 
       
        SubElements:
      
        Attribute:     any element derived from AttributeBase.
        </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:DescriptionBase">
        <xsd:sequence>
          <xsd:element ref="plm:Attribute" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="attributeRefs" type="xsd:IDREFS" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="AttribOwner" type="plm:AttribOwnerBase"/>
  <!-- -->
  <xsd:complexType name="PropertiesBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Base class for elements which may contain 3D bounds.
      
      SubElements:
      
      BoxBound:      legacy, use Bound in preference
      SphereBound:   legacy, use Bound in preference 
      Bound:         3D bound
      </xsd:documentation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=Entity3D</xsd:appinfo>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:sequence>
          <xsd:element name="BoxBound" type="plm:BoxBoundType" minOccurs="0">
            <xsd:annotation>
              <xsd:appinfo source="PLMXMLSchemaGenerator">output=ignore</xsd:appinfo>
            </xsd:annotation>
          </xsd:element>
          <xsd:element name="SphereBound" type="plm:SphereBoundType" minOccurs="0">
            <xsd:annotation>
              <xsd:appinfo source="PLMXMLSchemaGenerator">output=ignore</xsd:appinfo>
            </xsd:annotation>
          </xsd:element>
          <xsd:element name="Bound" type="plm:BoundType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Properties" type="plm:PropertiesBase" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <xsd:complexType name="ManagedBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      This is an abstract base class for elements which require information such as 
      access control, status and checkout information
      
      Attributes:
      
      accessRefs:   reference to one or more elements derived from AccessControlBase
      statusRef:    reference to element derived from StatusBase
      checkoutRefs: reference to one or more elements derived from CheckoutStatusBase
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:PropertiesBase">
        <xsd:attribute name="accessRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="statusRef" type="plm:anyURIType" use="optional"/>
        <xsd:attribute name="checkoutRefs" type="plm:uriReferenceListType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Managed" type="plm:ManagedBase" substitutionGroup="plm:Properties"/>
  <!-- -->
  <xsd:complexType name="AccessControlBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      AccessControl - abstract base class for Access Control types.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="AccessControl" type="plm:AccessControlBase" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <xsd:complexType name="StatusBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Status - abstract base class for status information types.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Status" type="plm:StatusBase" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <xsd:complexType name="CheckoutStatusBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      CheckoutStatus - abstract base class for Checkout types.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="CheckoutStatus" type="plm:CheckoutStatusBase" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <xsd:complexType name="InternalRepBase" abstract="true">
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="EntityBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Base class for elements which reference an external entity such as a
      face in an XT file.
      
      Attributes:
      
      entityRef:     reference to external entity.
      </xsd:documentation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=EntityObject</xsd:appinfo>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="entityRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="PointBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Base class for elements representing 3D points.
      
      Attributes:
      
      position:      coordinates of point
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EntityBase">
        <xsd:attribute name="position" type="plm:VectorType"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="ReferencePointType">
    <xsd:complexContent>
      <xsd:extension base="plm:EntityBase">
        <xsd:attribute name="position" type="plm:VectorType"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="SamplePointsType">
    <xsd:simpleContent>
      <xsd:extension base="plm:DoubleListType">
        <xsd:attribute name="tolerance" type="xsd:double"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="CurveBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Base class for elements representing parametrised curves in 3-space.
      
      Attributes:
      
      startT:        start parameter
      endT:          end parameter
      
      SubElements:
      
      StartPoint:    optional coordinates of start point
      EndPoint:      optional coordinates of end point
      SamplePoints:  optional coordinates of a sequence of points along curve
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EntityBase">
        <xsd:sequence>
          <xsd:element name="StartPoint" type="plm:ReferencePointType" minOccurs="0"/>
          <xsd:element name="EndPoint" type="plm:ReferencePointType" minOccurs="0"/>
          <xsd:element name="SamplePoints" type="plm:SamplePointsType" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="startT" type="xsd:double" use="optional"/>
        <xsd:attribute name="endT" type="xsd:double" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="PlaneCurveBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Base class for 3D curves which lie in a plane.
      
      Attributes:
      
      origin:        centre of plane
      zAxis:         normal to plane
      xAxis:         x-direction in plane
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:CurveBase">
        <xsd:attribute name="origin" type="plm:VectorType" default="0 0 0"/>
        <xsd:attribute name="zAxis" type="plm:DirectionType" default="0 0 1"/>
        <xsd:attribute name="xAxis" type="plm:DirectionType" default="1 0 0"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="SurfaceBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Base class for elements representing a u-v-parametrised surface in 3-space. 
      
      Attributes:
      
      startU:        lowest U value
      endU:          highest U value
      startV:        lowest V value
      endV:          highest V value
      
      SubElements:
      
      SamplePoints:  optional coordinates of a set of points on the surface
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EntityBase">
        <xsd:sequence>
          <xsd:element name="SamplePoints" type="plm:SamplePointsType" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="startU" type="xsd:double" use="optional"/>
        <xsd:attribute name="endU" type="xsd:double" use="optional"/>
        <xsd:attribute name="startV" type="xsd:double" use="optional"/>
        <xsd:attribute name="endV" type="xsd:double" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="SurfacePositionBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Base class for elements representing a surface which uses an
      X-Y-Z coordinate frame as part of its definition.
      
      Attributes:
      
      origin:        origin of coordinate frame
      zAxis:         Z Axis of coordinate frame
      xAxis:         X Axis of coordinate frame
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:SurfaceBase">
        <xsd:attribute name="origin" type="plm:VectorType" default="0 0 0"/>
        <xsd:attribute name="zAxis" type="plm:DirectionType" default="0 0 1"/>
        <xsd:attribute name="xAxis" type="plm:DirectionType" default="1 0 0"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!--*** Display Control -->
  <!--*** PLMXML Schema to define colours, materials, lights, etc -->
  <!--*** required to support display controls -->
  <!-- -->
  <xsd:simpleType name="RGBFloatType">
    <xsd:restriction base="xsd:float">
      <xsd:minInclusive value="0.0"/>
      <xsd:maxInclusive value="1.0"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="RGBFloatListType">
    <xsd:list itemType="plm:RGBFloatType"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="RGBType">
    <xsd:annotation>
      <xsd:documentation>
      Type representing a Red-Green-Blue colour.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="plm:RGBFloatListType">
      <xsd:length value="3"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="RGBAType">
    <xsd:annotation>
      <xsd:documentation>
      Type representing a colour in Red-Green-Blue-Alpha format.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="plm:RGBFloatListType">
      <xsd:length value="4"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="ShininessType">
    <xsd:restriction base="xsd:float">
      <xsd:minInclusive value="0.0"/>
      <xsd:maxInclusive value="255.0"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="AlphaType">
    <xsd:restriction base="xsd:float">
      <xsd:minInclusive value="0.0"/>
      <xsd:maxInclusive value="1.0"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="MaterialType">
    <xsd:annotation>
      <xsd:documentation>
      Element representing a material type.
      
      Attributes:
      
      name:          descriptive name
      ambient:       ambient colour
      diffuse:       diffuse colour
      specular:      specular colour
      emissive:      emissive colour
      shininess:     shininess coefficient
      alpha:         alpha coefficient
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="ambient" type="plm:RGBType" use="required"/>
        <xsd:attribute name="diffuse" type="plm:RGBType" use="required"/>
        <xsd:attribute name="specular" type="plm:RGBType" default="0.0 0.0 0.0"/>
        <xsd:attribute name="emissive" type="plm:RGBType" default="0.0 0.0 0.0"/>
        <xsd:attribute name="shininess" type="plm:ShininessType" default="0.0"/>
        <xsd:attribute name="alpha" type="plm:AlphaType" default="1.0"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="EntityMaterialType">
    <xsd:annotation>
      <xsd:documentation>
      Element used to associate an entity with a material (colour).
      
      Attributes:
      
      materialRef:   IDREF to the material element.
      
      SubElements:
      
      EntityRef:     Element derived from EntityRef, used to specify which entity
                     is to be associated with the material.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:choice>
          <xsd:element ref="plm:EntityRef" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:choice>
        <xsd:attribute name="materialRef" type="xsd:IDREF" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="AttenuationType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:length value="3"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="IntensityExponentType">
    <xsd:restriction base="xsd:float">
      <xsd:minInclusive value="0.0"/>
      <xsd:maxInclusive value="255.0"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="CutoffAngleType">
    <xsd:restriction base="xsd:float">
      <xsd:minInclusive value="0.0"/>
      <xsd:maxInclusive value="90.0"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="LightSourceBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Base class for elements representing Light Sources
      
      Attributes:
      
      name:          descriptive name
      ambient:       ambient light
      diffuse:       diffuse light
      specular:      specular light
      intensity:     intensity multiplier
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="ambient" type="plm:RGBType" default="0.0 0.0 0.0"/>
        <xsd:attribute name="diffuse" type="plm:RGBType" default="1.0 1.0 1.0"/>
        <xsd:attribute name="specular" type="plm:RGBType" default="1.0 1.0 1.0"/>
        <xsd:attribute name="intensity" type="plm:AlphaType" default="1.0"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="LightSource" type="plm:LightSourceBase"/>
  <!-- -->
  <xsd:complexType name="DirectionalLightType">
    <xsd:annotation>
      <xsd:documentation>
      Directional Light Source (from infinity)
      
      Attributes:
      
      direction:     direction TO the light source.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:LightSourceBase">
        <xsd:attribute name="direction" type="plm:VectorType" default="0.0 0.0 1.0"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="DirectionalLight" type="plm:DirectionalLightType" substitutionGroup="plm:LightSource"/>
  <!-- -->
  <xsd:complexType name="PositionalLightType">
    <xsd:annotation>
      <xsd:documentation>
      Positional Light Source, i.e. point source.
      
      Attributes:
      
      position:      position of light
      direction:     direction in which the light is shining
      cutoffAngle:   semiAngle of cone of light. If absent, the source is not
                     a spotlight, but shines in all directions.
      intensityExponent:  the intensity exponent determines the intensity distribution within the 
                     cone. Higher intensity exponent values result in a more focused light source. 
      attenuation:   the attenuation of the light source within the scene. The three attenuation 
                     values are the factors in a quadratic equation, giving intensity as a function
                     of distance from the source. The values within the attribute are in order: 
                     quadratic, linear and constant.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:LightSourceBase">
        <xsd:attribute name="position" type="plm:VectorType" default="0.0 0.0 1.0"/>
        <xsd:attribute name="direction" type="plm:VectorType" default="0.0 0.0 -1.0"/>
        <xsd:attribute name="cutoffAngle" type="plm:CutoffAngleType" use="optional"/>
        <xsd:attribute name="intensityExponent" type="plm:IntensityExponentType" default="0.0"/>
        <xsd:attribute name="attenuation" type="plm:AttenuationType" default="0.0 0.0 1.0"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="PositionalLight" type="plm:PositionalLightType" substitutionGroup="plm:LightSource"/>
  <!-- -->
  <xsd:simpleType name="ShadingStyleType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="flat"/>
      <xsd:enumeration value="smooth"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="DrawingStyleType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="wireframe"/>
      <xsd:enumeration value="hidden"/>
      <xsd:enumeration value="hiddenMarked"/>
      <xsd:enumeration value="shaded"/>
      <xsd:enumeration value="shadedWithEdges"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="DisplayControlType">
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="drawingStyle" type="plm:DrawingStyleType" default="shaded"/>
        <xsd:attribute name="shadingStyle" type="plm:ShadingStyleType" default="flat"/>
        <xsd:attribute name="backgroundColour" type="plm:RGBType" default="0.0 0.0 0.0"/>
        <xsd:attribute name="lightSourceRefs" type="xsd:IDREFS" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!--*** Reference -->
  <!--*** Schemas for defining references to entities via the data references.-->
  <!-- -->
  <xsd:simpleType name="RefSelectType">
    <xsd:annotation>
      <xsd:documentation>
      This type describes whether the PLMXML reference is
      specifying a single entity or a set of entities.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="single"/>
      <xsd:enumeration value="multiple"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="EntityRefBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Base class for defining a reference to an entity. All entity
      reference elements should be based on this type and defined
      as a substitution class for EntityRef.
  
      Attributes:
      
      name:     Name of the reference
      select:   Type of the reference - single or multiple.  
      contextRef: Context for the reference
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:DescriptionBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="contextRef" type="plm:anyURIType" use="optional"/>
        <xsd:attribute name="select" type="plm:RefSelectType" default="single"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="EntityRef" type="plm:EntityRefBase"/>
  <!-- -->
  <xsd:simpleType name="LocatorRefFormatType">
    <xsd:annotation>
      <xsd:documentation>
    Locator reference format.
    </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="PLMXMLPointer"/>
      <xsd:enumeration value="Unregistered"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="LocatorRefType">
    <xsd:annotation>
      <xsd:documentation>
      Locator reference element. The reference is a URI based reference and
      the syntax of the URI must be pre-defined. Hence the only predefined
      type is currently PLMXMLPointer.
      
      Attributes:
      
      locationRef:  The value of the URI reference.
      type:         Format of the locator reference.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EntityRefBase">
        <xsd:attribute name="locationRef" type="plm:anyURIType" use="required"/>
        <xsd:attribute name="type" type="plm:LocatorRefFormatType" default="PLMXMLPointer"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="LocatorRef" type="plm:LocatorRefType" substitutionGroup="plm:EntityRef"/>
  <!-- -->
  <xsd:complexType name="AttributeRefType">
    <xsd:annotation>
      <xsd:documentation>
      Attribute reference element. The reference is based on a user
      defined named attribute on the host representation. This type
      enables the author to note the attribute name, field name/index
      and the value of the attribute.

      Attributes:
      
      attribute:  The name of the attribute to query, e.g.
                  "COMPANYNAME/Tracking_attribute".
      field:      The name of the field within the attribute.
      index:      The index of the field within the attribute, if its
                  name is not given. (The first field is index 0).
      value:      The value of the attribute to match.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EntityRefBase">
        <xsd:attribute name="attribute" type="xsd:string" use="required"/>
        <xsd:attribute name="field" type="xsd:string" use="optional"/>
        <xsd:attribute name="index" type="xsd:integer" use="optional"/>
        <xsd:attribute name="value" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="AttributeRef" type="plm:AttributeRefType" substitutionGroup="plm:EntityRef"/>
  <!-- -->
  <xsd:complexType name="GUIDRefType">
    <xsd:annotation>
      <xsd:documentation>
      GUID reference element. This simply specifies the GUID of the entity
      being referenced.
      
      Attribute:
    
      guid:       The GUID of the entity referenced, in the form of a string containing 
                  32 hex digits, with arbitrary non-hex spacing characters.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EntityRefBase">
        <xsd:attribute name="guid" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="GUIDRef" type="plm:GUIDRefType" substitutionGroup="plm:EntityRef"/>
  <!--*** Features -->
  <!--*** Enumerated feature exchange. Feature semantics are not supported. -->
  <!-- -->
  <xsd:complexType name="FeatureBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      This abstract datatype describes a single feature within the feature
      tree hierarchy. The feature description contains basic information
      such as name and type, as well as information to link the feature
      to the originating application. Parameter descriptions can also
      be included in the feature description.
    
      Attributes:
    
      name              - (required) display name for the feature
      nextFeature       - (optional) the XML id of the next feature in the 
                          feature hierarchy.
      targetFeature     - (optional) the XML id of the target feature that this
                          feature relies on. The target feature defines which
                          feature forms the resultant entity.
      toolFeature       - (optional) the XML id of the tool feature that this
                          feature relies on.  
      suppressed        - (default=false) TRUE if the feature is suppressed in 
                          the feature tree.
      editable          - (default=false)) TRUE if any parameters of the feature may 
                          be edited.
    
      Elements:  
    
      Type              - (1) element describing the type of feature. This is an 
                          application specific type. The receiving application is not 
                          meant to deduce or interpret the type but could use it to 
                          classify or group the feature.
 
      Parameter         - (0 or many) elements to describe the parameters associated 
                          with the  feature. It is up to the application to decide 
                          what parameters to exchange or describe within the feature 
                          description.
      EntityRef         - (0 or many) references to entities on another representation
                          (e.g. a BRep) expressed as PLMXML references.

      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:sequence>
          <xsd:element name="Type" type="plm:UserEnumDataType"/>
          <xsd:element name="Parameter" type="plm:UserDataElementType" minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element ref="plm:EntityRef" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="required"/>
        <xsd:attribute name="nextFeature" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="targetFeature" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="toolFeature" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="suppressed" type="xsd:boolean" default="false"/>
        <xsd:attribute name="editable" type="xsd:boolean" default="false"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Feature" type="plm:FeatureBase"/>
  <!-- -->
  <xsd:complexType name="EnumFeatureType">
    <xsd:annotation>
      <xsd:documentation>
      Generic feature element which can be used to enumerate
      'any' parameterised feature. No semantic or specialised 
      information is exchanged via this schema.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:FeatureBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="EnumFeature" type="plm:EnumFeatureType" substitutionGroup="plm:Feature"/>
  <!-- -->
  <xsd:complexType name="FeatureTreeType">
    <xsd:annotation>
      <xsd:documentation>
      This datatype describes a feature hierarchy for feature based
      modelling system.
  
      The feature hierarchy is represented via a single linked list of
      set of feature elements that reference the next feature in the 
      hieratchy. The linked list hierachy must describe the features
      in 'replay' order (ie. first operation first in the hierachy).
      There is scope to describe 'tree-like' dependencies via additional
      'dependentFeatures' reference attributes. 
  
      The feature tree is represented within PLMXML as an 'Internal Representation'
      of a part - the FeatureTreeType is based on InternalRepBase and the 
      element FeatureTree is a substitution class for InternalRep.
      
      Attributes:
      
      name           - (required) display name for the feature tree.
      firstFeature   - (optional) the XML id of the first feature in the 
                       feature hierarchy.
      editable       - (optional) TRUE if any features of the feature tree 
                       may be edited.

      Elements:
      
      Type           - (1) element describing the type of feature tree. This is an 
                       application specific type. The receiving application is not 
                       meant to deduce or interpret the type but could use it to 
                       classify feature tree.

      Feature        - (0 or many) the list of features thaat make up the feature tree.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:InternalRepBase">
        <xsd:sequence>
          <xsd:element name="Type" type="plm:UserEnumDataType"/>
          <xsd:element ref="plm:Feature" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="required"/>
        <xsd:attribute name="firstFeature" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="editable" type="xsd:boolean" default="false"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="FeatureTree" type="plm:FeatureTreeType" substitutionGroup="plm:InternalRep"/>
  <!--*** Geometry -->
  <xsd:element name="Point" type="plm:PointBase"/>
  <!-- -->
  <xsd:complexType name="RefPointType">
    <xsd:annotation>
      <xsd:documentation>
      Reference Point element
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:PointBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="RefPoint" type="plm:RefPointType" substitutionGroup="plm:Point"/>
  <!--*** Curve geometry types -->
  <!-- -->
  <xsd:complexType name="LineType">
    <xsd:annotation>
      <xsd:documentation>
      Straight line curve.
      
      Attributes:
      
      origin:        start (T=0).
      direction:     direction of increasing T.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:CurveBase">
        <xsd:attribute name="origin" type="plm:VectorType" use="required"/>
        <xsd:attribute name="direction" type="plm:DirectionType" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="PolyLineType">
    <xsd:annotation>
      <xsd:documentation>
      Polyline, i.e. sequence of connected line-segments.
      
      Attributes:
      
      closed:        true if the end of the polyline equals its start.
      
      SubElements:
      
      Points:        coordinates of the ends of the line segments, in order.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:CurveBase">
        <xsd:sequence>
          <xsd:element name="Points" type="plm:DoubleListType"/>
        </xsd:sequence>
        <xsd:attribute name="closed" type="xsd:boolean" default="false"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="CircleType">
    <xsd:annotation>
      <xsd:documentation>
      Circular curve. The T=0 point is on the positive x-axis of the underlying plane. The
      T=pi/2 point is on the positive y-axis.
      
      Attributes:
      
      radius:        radius
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:PlaneCurveBase">
        <xsd:attribute name="radius" type="xsd:double" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="EllipseType">
    <xsd:annotation>
      <xsd:documentation>
      Elliptical curve. The T=0 point is on the positive x-axis of the underlying plane, at
      a distance 'majorRadius' from the origin. The T=pi/2 point is on the positive y-axis, 
      at a distance 'minorRadius' from the origin.
      
      Attributes:
      
      majorRadius:   major radius.
      minorRadius:   minor radius.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:PlaneCurveBase">
        <xsd:attribute name="majorRadius" type="xsd:double" use="required"/>
        <xsd:attribute name="minorRadius" type="xsd:double" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="SplineDimensionType">
    <xsd:restriction base="xsd:positiveInteger">
      <xsd:minInclusive value="2"/>
      <xsd:maxInclusive value="3"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="SplineCurveFormType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="planar"/>
      <xsd:enumeration value="general"/>
      <xsd:enumeration value="unknown"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="BSplineCurveType">
    <xsd:annotation>
      <xsd:documentation>
      B-Spline curve in 2- or 3-dimensional space.
      
      Attributes:
      
      degree:        degree of the curve.
      dimension:     dimension of the curve. This determines the length of each vector in 
                     'Vertices': if isRational is true, it is 'dimension+1', else it is 'dimension'.
                     Defaults to 3.
      isRational:    true if the spline is rational.
      isPeriodic:    true if the spline is periodic.
      isClosed:      true if the start and end of the curve coincide.
      form:          form of the curve.

      SubElements:
      
      Knots:         knot values, in increasing order, no repetitions.
      KnotMultiplicities: multiplicities of the knots.
      Vertices:      coordinates of the vertices.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:CurveBase">
        <xsd:sequence>
          <xsd:element name="Knots" type="plm:DoubleListType"/>
          <xsd:element name="KnotMultiplicities" type="plm:IntegerListType"/>
          <xsd:element name="Vertices" type="plm:DoubleListType"/>
        </xsd:sequence>
        <xsd:attribute name="degree" type="xsd:positiveInteger" use="required"/>
        <xsd:attribute name="dimension" type="plm:SplineDimensionType" default="3"/>
        <xsd:attribute name="isRational" type="xsd:boolean" use="required"/>
        <xsd:attribute name="isPeriodic" type="xsd:boolean" use="required"/>
        <xsd:attribute name="isClosed" type="xsd:boolean" use="required"/>
        <xsd:attribute name="form" type="plm:SplineCurveFormType" default="unknown"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="CompositeCurveType">
    <xsd:annotation>
      <xsd:documentation>
      Composite Curve, formed by joining curves together end-to-end.
             
      Attributes:
      
      curves:        sequence of curves. NB this attribute name is non-standard,
                     PLMXML conventions require that IDREFS attributes end in 'Refs'.
      isClosed:      true if the end of the last curve coincides with the start
                     of the first.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:CurveBase">
        <xsd:attribute name="curves" type="xsd:IDREFS" use="required"/>
        <xsd:attribute name="isClosed" type="xsd:boolean" default="false"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="SPCurveType">
    <xsd:annotation>
      <xsd:documentation>
      A curve defined in the parameter-space of a surface. The x,y positions
      of the curve correspond to u,v parameters in the surface.
             
      Attributes:
      
      parameterCurve:  reference to a 2-dimensional BSpline curve.
      surface:         reference to a surface.
      
                       NB both these attributes have non-standard names, PLMXML
                       conventions require reference attributes to end in 'Ref'.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:CurveBase">
        <xsd:attribute name="parameterCurve" type="xsd:IDREF" use="required"/>
        <xsd:attribute name="surface" type="xsd:IDREF" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!--*** Curve geometry elements -->
  <xsd:element name="Curve" type="plm:CurveBase"/>
  <xsd:element name="Line" type="plm:LineType" substitutionGroup="plm:Curve"/>
  <xsd:element name="PolyLine" type="plm:PolyLineType" substitutionGroup="plm:Curve"/>
  <xsd:element name="Circle" type="plm:CircleType" substitutionGroup="plm:Curve"/>
  <xsd:element name="Ellipse" type="plm:EllipseType" substitutionGroup="plm:Curve"/>
  <xsd:element name="BSplineCurve" type="plm:BSplineCurveType" substitutionGroup="plm:Curve"/>
  <xsd:element name="CompositeCurve" type="plm:CompositeCurveType" substitutionGroup="plm:Curve"/>
  <xsd:element name="SPCurve" type="plm:SPCurveType" substitutionGroup="plm:Curve"/>
  <!--xsd:element name="SurfacePosition" type="plm:SurfacePositionBase" substitutionGroup="plm:Surface"/-->
  <!-- -->
  <xsd:complexType name="PlaneType">
    <xsd:complexContent>
      <xsd:extension base="plm:SurfacePositionBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="CylinderType">
    <xsd:complexContent>
      <xsd:extension base="plm:SurfacePositionBase">
        <xsd:attribute name="radius" type="xsd:double" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="SphereType">
    <xsd:complexContent>
      <xsd:extension base="plm:SurfacePositionBase">
        <xsd:attribute name="radius" type="xsd:double" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="ConeType">
    <xsd:annotation>
      <xsd:documentation>
      Conical surface. The cone axis is along the Z-Axis of the underlying 
      coordinate frame. The cone radius increases in the direction of the
      Z-Axis.
      
      Attributes:
      
      radius:          radius of the cone at the origin of the coordinate frame.
                       This is zero or positive.
      halfAngle:       the positive angle between the Z-Axis and a line in the
                       cone, in radians.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:SurfacePositionBase">
        <xsd:attribute name="radius" type="xsd:double" use="required"/>
        <xsd:attribute name="halfAngle" type="xsd:double" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="TorusType">
    <xsd:annotation>
      <xsd:documentation>
      Toroidal surface. The axis of the torus is the Z-Axis of the underlying
      coordinate frame.
      
      Attributes:
      
      majorRadius:     major radius 
      minorRadius:     minor radius
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:SurfacePositionBase">
        <xsd:attribute name="majorRadius" type="xsd:double" use="required"/>
        <xsd:attribute name="minorRadius" type="xsd:double" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="BSplineSurfaceType">
    <xsd:annotation>
      <xsd:documentation>
      B-Spline surface, normally in 3-dimensional space.
      
      Attributes:
      
      uDegree:       degree of the surface in U.
      vDegree:       degree of the surface in V.
      dimension:     dimension of the surface. This determines the length of each vector in 
                     'Vertices': if isRational is true, it is 'dimension+1', else it is 'dimension'.
                     Defaults to 3.
      isRational:    true if the surface is rational.
      isUPeriodic:   true if the surface is periodic in U.
      isUPeriodic:   true if the surface is periodic in U.
      isVClosed:     true if the surface is closed in V.
      isVClosed:     true if the surface is closed in V.
      numberOfUVertices: number of U vertices.
      numberOfVVertices: number of V vertices.

      SubElements:
      
      UKnots:        U knot values, in increasing order, no repetitions.
      VKnots:        V knot values, in increasing order, no repetitions.
      UKnotMultiplicities: multiplicities of the U knots.
      VKnotMultiplicities: multiplicities of the V knots.
      Vertices:      coordinates of the vertices.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:SurfaceBase">
        <xsd:sequence>
          <xsd:element name="UKnots" type="plm:DoubleListType"/>
          <xsd:element name="VKnots" type="plm:DoubleListType"/>
          <xsd:element name="UKnotMultiplicities" type="plm:IntegerListType"/>
          <xsd:element name="VKnotMultiplicities" type="plm:IntegerListType"/>
          <xsd:element name="Vertices" type="plm:DoubleListType"/>
        </xsd:sequence>
        <xsd:attribute name="dimension" type="plm:SplineDimensionType" default="3"/>
        <xsd:attribute name="numberOfUVertices" type="xsd:positiveInteger" use="required"/>
        <xsd:attribute name="numberOfVVertices" type="xsd:positiveInteger" use="required"/>
        <xsd:attribute name="uDegree" type="xsd:positiveInteger" use="required"/>
        <xsd:attribute name="vDegree" type="xsd:positiveInteger" use="required"/>
        <xsd:attribute name="isRational" type="xsd:boolean" use="required"/>
        <xsd:attribute name="isUPeriodic" type="xsd:boolean" use="required"/>
        <xsd:attribute name="isVPeriodic" type="xsd:boolean" use="required"/>
        <xsd:attribute name="isUClosed" type="xsd:boolean" use="required"/>
        <xsd:attribute name="isVClosed" type="xsd:boolean" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!--*** Surface geometry elements -->
  <xsd:element name="Surface" type="plm:SurfaceBase"/>
  <xsd:element name="Plane" type="plm:PlaneType" substitutionGroup="plm:Surface"/>
  <xsd:element name="Cylinder" type="plm:CylinderType" substitutionGroup="plm:Surface"/>
  <xsd:element name="Sphere" type="plm:SphereType" substitutionGroup="plm:Surface"/>
  <xsd:element name="Cone" type="plm:ConeType" substitutionGroup="plm:Surface"/>
  <xsd:element name="Torus" type="plm:TorusType" substitutionGroup="plm:Surface"/>
  <xsd:element name="BSplineSurface" type="plm:BSplineSurfaceType" substitutionGroup="plm:Surface"/>
  <!-- -->
  <xsd:complexType name="PlanarCoordinateSystemType">
    <xsd:annotation>
      <xsd:documentation>
      Planar Coordinate system.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EntityBase">
        <xsd:attribute name="origin" type="plm:VectorType" default="0 0 0"/>
        <xsd:attribute name="zAxis" type="plm:DirectionType" default="0 0 1"/>
        <xsd:attribute name="xAxis" type="plm:DirectionType" default="1 0 0"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="CoordinateSystem" type="plm:PlanarCoordinateSystemType"/>
  <!-- -->
  <xsd:complexType name="CompositionType">
    <xsd:annotation>
      <xsd:documentation>
      Geometry composition.
      
      SubElements:
      
      Point:         any elements derived from Point.
      Curve:         any elements derived from Curve.
      Surface:       any elements derived from Surface.
      CoordinateSystem:  coordinate systems.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EntityBase">
        <xsd:sequence>
          <xsd:element name="LocalCoordinateSystem" type="plm:PlanarCoordinateSystemType"/>
          <xsd:choice maxOccurs="unbounded">
            <xsd:element ref="plm:Point"/>
            <xsd:element ref="plm:Curve"/>
            <xsd:element ref="plm:Surface"/>
            <xsd:element ref="plm:CoordinateSystem"/>
          </xsd:choice>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="GeometryComposition" type="plm:CompositionType"/>
  <!-- -->
  <xsd:complexType name="ConstructionGeometryType">
    <xsd:annotation>
      <xsd:documentation>
      Top level construction geometry element.
      
      SubElements:
      
      Point:         any elements derived from Point.
      Curve:         any elements derived from Curve.
      Surface:       any elements derived from Surface.
      CoordinateSystem:     coordinate systems.
      GeometryComposition:  geometry compositions.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EntityBase">
        <xsd:choice maxOccurs="unbounded">
          <xsd:element ref="plm:Point"/>
          <xsd:element ref="plm:Curve"/>
          <xsd:element ref="plm:Surface"/>
          <xsd:element ref="plm:CoordinateSystem"/>
          <xsd:element ref="plm:GeometryComposition"/>
        </xsd:choice>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!--*** View Control -->
  <!--*** Elements for defining view controls -->
  <!-- -->
  <xsd:complexType name="PerspectiveType">
    <xsd:annotation>
      <xsd:documentation>
      Defines a perspective view from a point.
      Toroidal surface. The axis of the torus is the Z-Axis of the underlying
      coordinate frame.
      
      SubElements:
      
      ViewFrom:        eye point
      ViewTo:          point towards which eye is looking
      ViewVertical:    vector which is vertical in the view. Should be
                       perpendicular to (ViewFrom - ViewTo).
      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="ViewFrom" type="plm:VectorType"/>
      <xsd:element name="ViewTo" type="plm:VectorType"/>
      <xsd:element name="ViewVertical" type="plm:VectorType"/>
    </xsd:sequence>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="OrthographicType">
    <xsd:annotation>
      <xsd:documentation>
      Defines a view from infinity (no perspective).
      
      SubElements:
      
      ViewDirection:   direction eye is looking in.
      ViewVertical:    vector which is vertical in the view. Should be
                       perpendicular to ViewDirection.
      ViewTo:          optional point at which eye is looking, only needed
                       if depth is significant in the view.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="ViewDirection" type="plm:VectorType"/>
      <xsd:element name="ViewVertical" type="plm:VectorType"/>
      <xsd:choice minOccurs="0">
        <xsd:element name="ViewTo" type="plm:VectorType"/>
      </xsd:choice>
    </xsd:sequence>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="ViewPortCornerType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:length value="2"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="ViewPortType">
    <xsd:sequence>
      <xsd:element name="ViewPortLow" type="plm:ViewPortCornerType"/>
      <xsd:element name="ViewPortHigh" type="plm:ViewPortCornerType"/>
    </xsd:sequence>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="ViewControlType">
    <xsd:annotation>
      <xsd:documentation>
      Defines a view, i.e. a camera position and optional viewport.
      
      SubElements:
      
      One of Perspective, Orthographic or ViewMatrix (4 by 4).
      
      ViewPort:        optional viewport definition.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:DescriptionBase">
        <xsd:sequence>
          <xsd:choice>
            <xsd:element name="Perspective" type="plm:PerspectiveType"/>
            <xsd:element name="Orthographic" type="plm:OrthographicType"/>
            <xsd:element name="ViewMatrix" type="plm:MatrixType"/>
          </xsd:choice>
          <xsd:element name="ViewPort" type="plm:ViewPortType" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!--*** Texture -->
  <!--*** PLMXML Schema to define textures to support entity display properties. -->
  <!-- -->
  <xsd:simpleType name="TextureDataFormatType">
    <xsd:annotation>
      <xsd:documentation>
      Basic texture data format definition
      
      Determines the length of each data element in the hexBinary data element.
    
      RGBA = 4 bytes of red, green, blue and alpha
      RGB  = 3 bytes of red, green and blue
      LA   = 2 bytes of luminance and alpha
      A    = 1 byte of alpha
      L    = 1 byte of luminance
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="RGBA"/>
      <xsd:enumeration value="RGB"/>
      <xsd:enumeration value="LA"/>
      <xsd:enumeration value="A"/>
      <xsd:enumeration value="L"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="Texture1DDataType">
    <xsd:annotation>
      <xsd:documentation>
      Basic 1D texture data definition 
      </xsd:documentation>
    </xsd:annotation>
    <xsd:simpleContent>
      <xsd:extension base="xsd:hexBinary">
        <xsd:attribute name="level" type="xsd:nonNegativeInteger" use="required"/>
        <xsd:attribute name="width" type="xsd:positiveInteger" use="required"/>
        <xsd:attribute name="border" type="xsd:nonNegativeInteger" default="0"/>
        <xsd:attribute name="location" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="Texture1DType">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="Data" type="plm:Texture1DDataType"/>
    </xsd:choice>
    <xsd:attribute name="format" type="plm:TextureDataFormatType" use="required"/>
    <xsd:attribute name="levels" type="xsd:positiveInteger" default="1"/>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="Texture2DDataType">
    <xsd:annotation>
      <xsd:documentation>
      Basic 2D texture data definition
      </xsd:documentation>
    </xsd:annotation>
    <xsd:simpleContent>
      <xsd:extension base="xsd:hexBinary">
        <xsd:attribute name="level" type="xsd:nonNegativeInteger" use="required"/>
        <xsd:attribute name="width" type="xsd:positiveInteger" use="required"/>
        <xsd:attribute name="height" type="xsd:positiveInteger" use="required"/>
        <xsd:attribute name="border" type="xsd:nonNegativeInteger" default="0"/>
        <xsd:attribute name="location" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="Texture2DType">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="Data" type="plm:Texture2DDataType"/>
    </xsd:choice>
    <xsd:attribute name="format" type="plm:TextureDataFormatType" use="required"/>
    <xsd:attribute name="levels" type="xsd:positiveInteger" default="1"/>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="TextureDataType">
    <xsd:annotation>
      <xsd:documentation>
      Basic texture data definition 
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:choice>
          <xsd:element name="Texture2D" type="plm:Texture2DType"/>
          <xsd:element name="Texture1D" type="plm:Texture1DType"/>
        </xsd:choice>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="TextureMapType">
    <xsd:annotation>
      <xsd:documentation>
      Texture control definition
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="decal"/>
      <xsd:enumeration value="modulate"/>
      <xsd:enumeration value="blend"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="TextureSampleType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="nearest"/>
      <xsd:enumeration value="linear"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="TextureWrapType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="clamp"/>
      <xsd:enumeration value="wrap"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="TextureType">
    <xsd:annotation>
      <xsd:documentation>
      Basic texture definition
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:choice minOccurs="0">
          <xsd:element name="TextureData" type="plm:TextureDataType"/>
        </xsd:choice>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="dataRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="mapping" type="plm:TextureMapType" use="required"/>
        <xsd:attribute name="subsamplingLow" type="plm:TextureSampleType" default="nearest"/>
        <xsd:attribute name="subsamplingHigh" type="plm:TextureSampleType" default="nearest"/>
        <xsd:attribute name="oversampling" type="plm:TextureSampleType" default="nearest"/>
        <xsd:attribute name="wrapping" type="plm:TextureWrapType" default="clamp"/>
        <xsd:attribute name="borderColour" type="plm:RGBAType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="TextureCoordDataType">
    <xsd:annotation>
      <xsd:documentation>
      Texture coordinates 
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="plm:DoubleListType">
      <xsd:minLength value="1"/>
      <xsd:maxLength value="4"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="GeometryParamType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:length value="2"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="TextureCoordType">
    <xsd:simpleContent>
      <xsd:extension base="plm:TextureCoordDataType">
        <xsd:attributeGroup ref="plm:idGroup"/>
        <xsd:attribute name="textureRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="geometryCoord" type="plm:VectorType" use="optional"/>
        <xsd:attribute name="geometryParam" type="plm:GeometryParamType" use="optional"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="EntityTextureType">
    <xsd:annotation>
      <xsd:documentation>
      Texture structures that can be associated with a remote entity.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:sequence>
          <xsd:element name="TextureCoord" type="plm:TextureCoordType" minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element ref="plm:EntityRef" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="textureRef" type="xsd:IDREF" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!--*** Representation -->
  <!-- -->
  <xsd:simpleType name="RepresentationFormatType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="XT"/>
      <xsd:enumeration value="eXT"/>
      <xsd:enumeration value="PLMXML"/>
      <xsd:enumeration value="jXT"/>
      <xsd:enumeration value="JT"/>
      <xsd:enumeration value="XPK"/>
      <xsd:enumeration value="XGL"/>
      <xsd:enumeration value="VRML"/>
      <xsd:enumeration value="STL"/>
      <xsd:enumeration value="SAT"/>
      <xsd:enumeration value="STEP"/>
      <xsd:enumeration value="IGES"/>
      <xsd:enumeration value="UGBkm"/>
      <xsd:enumeration value="UGPrt"/>
      <xsd:enumeration value="SEPrt"/>
      <xsd:enumeration value="SEAsm"/>
      <xsd:enumeration value="IdeasPrt"/>
      <xsd:enumeration value="IdeasAsm"/>
      <xsd:enumeration value="IdeasIDI"/>
      <xsd:enumeration value="Cat4Prt"/>
      <xsd:enumeration value="Cat5Prt"/>
      <xsd:enumeration value="Cat5Asm"/>
      <xsd:enumeration value="SWPrt"/>
      <xsd:enumeration value="SWAsm"/>
      <xsd:enumeration value="IDI"/>
      <xsd:enumeration value="TX"/>
      <xsd:enumeration value="DWG"/>
      <xsd:enumeration value="Unregistered"/>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:element name="InternalRep" type="plm:InternalRepBase"/>
  <!-- -->
  <xsd:complexType name="CompoundRepType">
    <xsd:annotation>
      <xsd:documentation>
      This class represents the 'CompoundRep' element in a PLMXML file.
      
      Attributes:
      
      location:       URI of data source
      load:           True if data is to be loaded at the same time as the PLMXML file.
      format:         Data format. If this is absent, the format is taken from the parent
                      Representation.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attributeGroup ref="plm:referenceGroup"/>
        <xsd:attribute name="format" type="plm:RepresentationFormatType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="RepresentationType">
    <xsd:annotation>
      <xsd:documentation>
      Part Representation.
    
      The Representation element in an PLMXML file refers to a model in some
      particular format, such as XT or jXT. It can refer to the model data in
      another file (an External Representation), or the data can be embedded within
      the Representation element in the XML file (an InternalRepresentation).
	   
      Attributes:
	   
      name:           descriptive name
      format:         data format
      revision:       revision of data
      transformRef:   optional reference to a Transform which positions the data in the
                      coordinate frame of the part.
      location:       URI of data source
      load:           true if data is to be loaded at the same time as the PLMXML file.
      
      equivalentRef:  an optional reference to a Representation which is equivalent to
                      this one (for example, has the same shape). If this attribute is used, 
                      then it should collect together equivalent Representations of                   
                      a Part into a ring, with each Representation using this attribute to 
                      point to the next in the ring.
   
      SubElements:
	   
      Transform:      see transformRef.
      CompoundRep:    the Representation may not have a single location. Instead, it may
                      contain a number of CompoundRep sub-elements, each with its own 
                      location. The representation is the aggregate of these data sources.
      InternalRep:    the Representation may contain one element derived from InternalRep,
                      in which case it should not also have a location attribute.
	   
      May contain elements of type Material, EntityMaterial, TextureData, Texture, or
      EntityTexture.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:sequence>
          <xsd:element name="Transform" type="plm:TransformType" minOccurs="0"/>
          <xsd:element ref="plm:InternalRep" minOccurs="0"/>
          <xsd:element name="CompoundRep" type="plm:CompoundRepType" minOccurs="0" maxOccurs="unbounded"/>
          <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="Material" type="plm:MaterialType"/>
            <xsd:element name="EntityMaterial" type="plm:EntityMaterialType"/>
            <xsd:element name="TextureData" type="plm:TextureDataType"/>
            <xsd:element name="Texture" type="plm:TextureType"/>
            <xsd:element name="EntityTexture" type="plm:EntityTextureType"/>
          </xsd:choice>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="transformRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="format" type="plm:RepresentationFormatType" use="optional"/>
        <xsd:attribute name="revision" type="xsd:decimal" use="optional"/>
        <xsd:attributeGroup ref="plm:referenceGroup"/>
        <xsd:attribute name="equivalentRef" type="xsd:IDREF" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="OccurrenceType">
    <xsd:annotation>
      <xsd:documentation>
      Occurrence. An Occurrence specifies a usage of a Part in an Assembly, by
      specifying a chain of Instances which lead from the Assembly down to the Part, 
      or by a chain of Instances and other Occurrences, which when joined together
      define an Instance chain. It is also possible for an Occurrence to reference
      a ProductView at the end of its Instance chain, rather than a Part.

      The Assembly, which is the parent of the first Instance in the Instance chain, is called
      the 'top Part' of the Occurrence. The Part, which is instanced by the last Instance
      in the Instance chain, is called the 'bottom Part' of the Occurrence.
	   
      Attributes:
	   
      name:           descriptive name
      instanceRefs:   chain of Instances which define the Occurrence.
      pathRefs:       chain of Instances and Occurrences which, when joined together,
                      define an Instance chain. Only one of instanceRefs and pathRefs should
                      be present.
      transformRef:   an optional reference to a Transform which overrides the transform 
                      obtained by accumulating the transforms in the Instance chain. In other
                      words, it specifies the position of the Part in the coordinate frame of
                      the Assembly.
      partRef:        an optional Part to use in place of the 'bottom Part'.

      representationRefs: an optional collection of Representations. If present, these are to
                      be used in preference to any Representations the Part may have itself, 
                      or which may be referenced by the last Instance in the chains. They would
                      normally be different format representations of the same shape.
      materialRef:    reference to a Material element to use when displaying the Part in the
                      position defined by this Occurrence.
      geometryRefs:   optional geometry associated with this Occurrence.

      occurrenceRefs: an Occurrence may have a number of 'child' Occurrences, which this 
                      attribute specifies. A child Occurrence must have an Instance chain which
                      is the same as that of its parent, but with one more Instance added at the 
                      bottom end. An Occurrence is normally only rendered in a view if it has no
                      child Occurrences.
                      
      alternativeOfRef: It is possible for one ProductView to be defined by reference to another
                      ProductView. In this case the first ProductView will contain some
                      Occurrences which override Occurrences in the referenced ProductView.
                      The 'alternativeOfRef' attribute is used to indicate the Occurrence which
                      this Occurrence is overriding. If an Occurrence has an alternativeOfRef
                      attribute, it should not also have an instanceRefs attribute, nor should
                      it have an occurrenceRefs attribute.

      productViewRef: If an Occurrence has a productViewRef, then it is regarded as an Occurrence
                      of that ProductView, not of its 'bottom Part'. In this case, the 'top Part' 
                      of the ProductView must be the same as the 'bottom Part' of the Occurrence. 
                      
      visible:        Flag to indicate the Occurrence is visible. If absent, visible is implied.
                      An Occurrence which references another Occurrence via the
                      alternativeOfRef attribute may override its visibility, i.e. make it
                      visible if invisible or vice-versa.
   
      SubElements:

      Transform:      see transformRef above.
      Representation: see representationRefs above.	   
      
      Material:
      EntityMaterial: Allows the association of a Material with an entity; for example the
                      Occurrence could specify the colour of a face of a body. The entity should
                      be in a Representation specified by this Occurrence, or by the last Instance in
                      the Instance chain, or by the Part of the Occurrence.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:sequence>
          <xsd:element name="Transform" type="plm:TransformType" minOccurs="0"/>
          <xsd:element name="Representation" type="plm:RepresentationType" minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element name="Material" type="plm:MaterialType" minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element name="EntityMaterial" type="plm:EntityMaterialType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="transformRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="occurrenceRefs" type="xsd:IDREFS" use="optional"/>
        <xsd:attribute name="instanceRefs" use="optional">
          <xsd:simpleType>
            <xsd:restriction base="plm:uriReferenceListType">
              <xsd:minLength value="1"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
        <xsd:attribute name="pathRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="partRef" type="plm:anyURIType" use="optional"/>
        <xsd:attribute name="representationRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="materialRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="geometryRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="alternativeOfRef" type="plm:anyURIType" use="optional"/>
        <xsd:attribute name="productViewRef" type="plm:anyURIType" use="optional"/>
        <xsd:attribute name="visible" type="xsd:boolean" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="ProductViewType">
    <xsd:annotation>
      <xsd:documentation>
      ProductView. This is a collection of Occurrences of Parts within one
      Assembly, i.e. it selects certain Occurrences, for example in order to
      display them.

      All the root Occurrences (given by primaryOccurrenceRef or rootRefs) must
      have the same 'top Part'. This is called the 'top Part' of the ProductView.
	   
      Attributes:
	   
      name:           descriptive name
      primaryOccurrenceRef: )  These two attributes are used to specify the root
      rootRefs:             )  Occurrences, i.e. those which are not children of
                               other Occurrences in this ProductView. If there is
                               only one root, either attribute may be used. If there 
                               is more than one root, rootRefs must be used.
      viewControlRef:    optional reference to a ViewControl
      displayControlRef: optional reference to a DisplayControl

      alternativeOfRef:  A ProductView may be defined by reference to another ProductView,
                      in which case it may include Occurrences which override certain
                      corresponding Occurrences in the other ProductView. This attribute
                      is used to specify other ProductView, which must have the same
                      'top Part' as this one.
   
      SubElements:

      Occurrence:     the Occurrences in the ProductView.
      Transform:      Transforms which may be referenced by the Occurrences.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element name="Occurrence" type="plm:OccurrenceType"/>
          <xsd:element name="Transform" type="plm:TransformType"/>
        </xsd:choice>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="primaryOccurrenceRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="rootRefs" type="xsd:IDREFS" use="optional"/>
        <xsd:attribute name="viewControlRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="displayControlRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="alternativeOfRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="PreferredPartUnitsType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="millimetres"/>
      <xsd:enumeration value="metres"/>
      <xsd:enumeration value="inches"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="PartTypesType">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=PartType</xsd:appinfo>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="assembly"/>
      <xsd:enumeration value="minimal"/>
      <xsd:enumeration value="wire"/>
      <xsd:enumeration value="solid"/>
      <xsd:enumeration value="sheet"/>
      <xsd:enumeration value="general"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="InstanceType">
    <xsd:annotation>
      <xsd:documentation>
      Instance, i.e. usage of a Part by an Assembly, with optional Transform.
	   
      Attributes:
	   
      name:            descriptive name.
      quantity:        Quantity of the element referenced. If absent, 1 is implied. If 
                       present, any contained or referenced Transform is ignored.               
      unitRef:         Units for the quantity attribute. If absent, 'each' is implied. An 
                       IDREF to a 'Unit' element.
      instanceType     A 'subtype' string for the instance. No specified semantics.
      sequenceNumber   Serves to identify the instance within its referencing Part. If 
                       present, should be unique within the parent.
      transformRef:    optional Transform which positions the Part in the coordinates
                       of the Assembly.
      materialRef:     optional Material for use when rendering this Instance.

      partRef:         Part being instanced. This should only be used by an 'Instance'
                       element, not one of its derived elements.

      representationRefs: an optional collection of Representations. If present, these are to
                       be used in preference to any Representations the Part may have itself.
                       They would normally be different format representations of the same shape.
                       
      SubElements:
 
      Transform:       see transformRef. (This should not be used in conjunction with
                       transformRef).
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:ManagedBase">
        <xsd:sequence>
          <xsd:element name="Transform" type="plm:TransformType" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="partRef" type="plm:anyURIType" use="optional"/>
        <xsd:attribute name="transformRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="materialRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="quantity" type="xsd:double" use="optional"/>
        <xsd:attribute name="unitRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="instanceType" type="xsd:string" use="optional"/>
        <xsd:attribute name="sequenceNumber" type="xsd:nonNegativeInteger" use="optional"/>
        <xsd:attribute name="representationRefs" type="plm:uriReferenceListType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Instance" type="plm:InstanceType" substitutionGroup="plm:Managed"/>
  <!-- -->
  <xsd:complexType name="InstanceGraphType">
    <xsd:annotation>
      <xsd:documentation>
      InstanceGraph. This is an element used as a container for Parts and Instances
      which form some or all of an assembly graph. 
	   
      Attributes:
	   
      rootInstanceRef: if the graph of Instances and Parts in the InstanceGraph has
                       a single root, which is an Instance, this may be use to
                       indicate it. 
      rootRefs:        however, in general there may be more than one root, and the 
                       roots may be Instances or Parts. The use of this attribute to
                       specify the root(s) is preferred.
      
      viewControlRef:    optional reference to a ViewControl
      displayControlRef: optional reference to a DisplayControl
      
      SubElements:
      
      May contain Instances, Parts, or any element derived from Instance, Part, Structure
      or StructureRevision. May also contain Transforms which may be referenced by Instances.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:PropertiesBase">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="plm:Instance"/>
          <xsd:element ref="plm:Part"/>
          <xsd:element ref="plm:Structure"/>
          <xsd:element ref="plm:StructureRevision"/>
          <xsd:element name="Transform" type="plm:TransformType"/>
        </xsd:choice>
        <xsd:attribute name="rootInstanceRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="rootRefs" type="xsd:IDREFS" use="optional"/>
        <xsd:attribute name="viewControlRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="displayControlRef" type="xsd:IDREF" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="InstanceGraph" type="plm:InstanceGraphType"/>
  <!-- -->
  <xsd:complexType name="StructureDefBase">
    <xsd:annotation>
      <xsd:documentation>
      StructureDef. This element may contain one or more InstanceGraphs, representing
      all or part of one or more assembly graphs. It also contains elements relating
      to its display. 
	   
      Attributes:
	
      name:            descriptive name.
      revision:        revision.
      revisionRuleRef: reference to a RevisionRule which was used to generate this
                       assembly from an Unconfigured Product Structure.
      variantRuleRef:  reference to a VariantRule which was use to generate this
                       assembly.
                       NB: these elements are not defined in this schema.
      
      SubElements:

      This element may contain Representations, DisplayControls, ViewControls, Light
      Sources, ProductViews, Materials, ConstructionGeometry, Parts, or InstanceGraphs.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="plm:InstanceGraph"/>
          <xsd:element ref="plm:Part"/>
          <xsd:element name="Representation" type="plm:RepresentationType"/>
          <xsd:element name="ProductView" type="plm:ProductViewType"/>
          <xsd:element name="DisplayControl" type="plm:DisplayControlType"/>
          <xsd:element name="ViewControl" type="plm:ViewControlType"/>
          <xsd:element ref="plm:LightSource"/>
          <xsd:element name="Material" type="plm:MaterialType"/>
          <xsd:element name="ConstructionGeometry" type="plm:ConstructionGeometryType"/>
        </xsd:choice>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="revision" type="xsd:decimal" use="optional"/>
        <xsd:attribute name="variantRuleRef" type="xsd:anyURI"/>
        <xsd:attribute name="revisionRuleRef" type="xsd:anyURI"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="StructureDef" type="plm:StructureDefBase" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <xsd:complexType name="ProductDefType">
    <xsd:annotation>
      <xsd:documentation>
      ProductDef.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StructureDefBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="ProductDef" type="plm:ProductDefType" substitutionGroup="plm:StructureDef"/>
  <!-- -->
  <xsd:simpleType name="UserValueDataType">
    <xsd:annotation>
      <xsd:documentation>
      Basic types that can be represented by user value entries and tables.

      int       = Data entity is an integer 
      ints      = Data entity is a list of integers
      real      = Data entity is a real
      reals     = Data entity is a list of reals
      boolean   = Data entity is a boolean (true/false)
      booleans  = Data entity is a list of booleans
      reference = Data entity is a reference (anyURI)
      enum      = Data entity is an enumeration.
      list      = Data entity is a list item.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="int"/>
      <xsd:enumeration value="ints"/>
      <xsd:enumeration value="real"/>
      <xsd:enumeration value="reals"/>
      <xsd:enumeration value="boolean"/>
      <xsd:enumeration value="booleans"/>
      <xsd:enumeration value="string"/>
      <xsd:enumeration value="reference"/>
      <xsd:enumeration value="enum"/>
      <xsd:enumeration value="list"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="UserListElementType">
    <xsd:annotation>
      <xsd:documentation>
      This element defines a single entry in a UserList. The 'value' attribute 
      must contain data of the type specified by the 'type' attribute in the owning list.

      Attributes:

      value:          data value (required).
      description:    textual description of the value.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="value" type="xsd:string" use="required"/>
    <xsd:attribute name="description" type="xsd:string" use="optional"/>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="UserListDataType">
    <xsd:annotation>
      <xsd:documentation>
      This element defines a list of user specified data items. Each item in the 
      list is of the same type - as specified by the 'type' attribute'.

      Attributes:

      name:           descriptive name
      type:           type of data items, i.e. int, ints, etc. 

      SubElements:

      Item:           One element per data item. (At least one).
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttributeBase">
        <xsd:choice>
          <xsd:element name="Item" type="plm:UserListElementType" maxOccurs="unbounded"/>
        </xsd:choice>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="type" type="plm:UserValueDataType" default="string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="UserList" type="plm:UserListDataType" substitutionGroup="plm:Attribute"/>
  <!-- -->
  <xsd:complexType name="UserDataElementType">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=UserValue</xsd:appinfo>
      <xsd:documentation>
      This element defines a single title/value pair in a UserData table.

      Attributes:

      title:          name of this entry in the table.
      value:          value of the entry.
      type:           datatype of the value - int, ints, real, reals, boolean, booleans,
                      string, reference, enum or list.
      format:
      editable:       false if this value should not be modified by the receiving application.
      dataRef:        If type is 'enum' or 'list', then a UserList element should be specified
                      either by dataRef, or by being included as a sub-element. In the 'enum'
                      case, the UserList gives the valid values of the enum; in the 'list'
                      case, 'value' is ignored and the UserList IS the value of this entry in
                      the table.    

      minInclusive:   Minimum value allowed (inclusive).
      minExclusive:   Minimum value allowed (exclusive).
      maxInclusive:   Maximum value allowed (inclusive).
      maxExclusive:   Maximum value allowed (exclusive).
      stepValue:      Allowed values go from min to max in steps of 'stepValue'.
      minLength:      Minimum list length allowed (only for type="list").
      maxLength:      Maximum list length allowed (ditto).

      SubElements:

      UserList:       May contain a single UserList element (see dataRef above).
      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="UserList" type="plm:UserListDataType" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="title" type="xsd:string" use="required"/>
    <xsd:attribute name="value" type="xsd:string" use="required"/>
    <xsd:attribute name="type" type="plm:UserValueDataType" default="string"/>
    <xsd:attribute name="format" type="xsd:string" use="optional"/>
    <xsd:attribute name="dataRef" type="plm:anyURIType" use="optional"/>
    <xsd:attribute name="editable" type="xsd:boolean" default="false"/>
    <xsd:attribute name="minInclusive" type="xsd:double" use="optional"/>
    <xsd:attribute name="minExclusive" type="xsd:double" use="optional"/>
    <xsd:attribute name="maxInclusive" type="xsd:double" use="optional"/>
    <xsd:attribute name="maxExclusive" type="xsd:double" use="optional"/>
    <xsd:attribute name="stepValue" type="xsd:double" use="optional"/>
    <xsd:attribute name="minLength" type="xsd:nonNegativeInteger" use="optional"/>
    <xsd:attribute name="maxLength" type="xsd:nonNegativeInteger" use="optional"/>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="UserDataType">
    <xsd:annotation>
      <xsd:documentation>
      The UserData element is a PLMXML Attribute used to represent a table of
      title/value pairs. It is up to communicating applications to agree on the
      meaning of these tables.
    
      UserData is based on the plm:Attribute base class so that it may be substituted
      wherever PLMXML Attributes are permitted. 

      Attributes:

      type:           A string giving the type of UserData. No specified values.

      SubElements:

      UserValue:      One element per entry in the table (at least one).
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttributeBase">
        <xsd:choice>
          <xsd:element name="UserValue" type="plm:UserDataElementType" maxOccurs="unbounded"/>
        </xsd:choice>
        <xsd:attribute name="type" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="UserData" type="plm:UserDataType" substitutionGroup="plm:Attribute"/>
  <!-- -->
  <xsd:complexType name="UserEnumDataType">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=UserEnum</xsd:appinfo>
      <xsd:documentation>
      This element represents a user defined enumeration value. 

      Attributes:

      value:          the enum value (required).
      listRef:        reference to a UserList element which gives the valid
                      values in the enum. 'value' must be one of these values.                            
      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="value" type="xsd:string" use="required"/>
    <xsd:attribute name="listRef" type="plm:anyURIType" use="optional"/>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="XTDataType">
    <xsd:annotation>
      <xsd:documentation>
      This class represents the &lt;XTData&gt; element in a PLMXML
      file, which is used to embed XT files in a Representation 
      element, for example: 

        &lt;Representation ...&gt;
          &lt;XTRep&gt;
            &lt;XTData&gt;T51 : TRANSMIT FILE 
    created by modeller version 130021217 SCH_1300212_130060 
    12 1 63 2 3 0 0 0 0 1e3 1e-8 0 0 0 1 0 1 1 4 5 6 7 8 9 10 
    81 1 2 63 11 1 0 0 0 0 1 ...
            &lt;/XTData&gt;
          &lt;/XTRep&gt;
        &lt;/Representation&gt;
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="XTRepType">
    <xsd:annotation>
      <xsd:documentation>
      XT Representation component of the PLMXML Schema
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:InternalRepBase">
        <xsd:sequence>
          <xsd:element name="XTData" type="plm:XTDataType"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="XTRep" type="plm:XTRepType" substitutionGroup="plm:InternalRep"/>
  <!-- -->
  <xsd:simpleType name="MassPropertyUnitType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="grams,millimetres">
        <xsd:annotation>
          <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=GramsMillimetres</xsd:appinfo>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="grams,centimetres">
        <xsd:annotation>
          <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=GramsCentimetres</xsd:appinfo>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="kilograms,metres">
        <xsd:annotation>
          <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=KilogramsMetres</xsd:appinfo>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="pounds,feet">
        <xsd:annotation>
          <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=PoundsFeet</xsd:appinfo>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="pounds,inches">
        <xsd:annotation>
          <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=PoundsInches</xsd:appinfo>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:attributeGroup name="MassPropertyGroup">
    <xsd:attribute name="error" type="plm:RealFieldType" use="optional"/>
  </xsd:attributeGroup>
  <!-- -->
  <xsd:complexType name="MassPropertyRealType">
    <xsd:simpleContent>
      <xsd:extension base="plm:RealFieldType">
        <xsd:attributeGroup ref="plm:MassPropertyGroup"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="LengthType">
    <xsd:simpleContent>
      <xsd:restriction base="plm:MassPropertyRealType"/>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="AreaType">
    <xsd:simpleContent>
      <xsd:restriction base="plm:MassPropertyRealType"/>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="VolumeType">
    <xsd:simpleContent>
      <xsd:restriction base="plm:MassPropertyRealType"/>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="DensityType">
    <xsd:simpleContent>
      <xsd:restriction base="plm:MassPropertyRealType"/>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="MassType">
    <xsd:simpleContent>
      <xsd:restriction base="plm:MassPropertyRealType"/>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="MassPropertyVectorType">
    <xsd:simpleContent>
      <xsd:extension base="plm:VectorFieldType">
        <xsd:attributeGroup ref="plm:MassPropertyGroup"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="CentreOfMassType">
    <xsd:simpleContent>
      <xsd:restriction base="plm:MassPropertyVectorType"/>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:simpleType name="MassPropertyArrayFieldType">
    <xsd:restriction base="plm:DoubleListType">
      <xsd:length value="3"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="MassPropertyArrayType">
    <xsd:simpleContent>
      <xsd:extension base="plm:MassPropertyArrayFieldType">
        <xsd:attributeGroup ref="plm:MassPropertyGroup"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="MomentsOfInertiaType">
    <xsd:simpleContent>
      <xsd:restriction base="plm:MassPropertyArrayType"/>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="ProductsOfInertiaType">
    <xsd:simpleContent>
      <xsd:restriction base="plm:MassPropertyArrayType"/>
    </xsd:simpleContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="MassPropertyType">
    <xsd:annotation>
      <xsd:documentation>
      PLMXML Attribute describing mass properties.
      </xsd:documentation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">ChildElementOccurrences=1</xsd:appinfo>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttributeBase">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element name="Length" type="plm:LengthType"/>
          <xsd:element name="Area" type="plm:AreaType"/>
          <xsd:element name="Volume" type="plm:VolumeType"/>
          <xsd:element name="Density" type="plm:DensityType"/>
          <xsd:element name="Mass" type="plm:MassType"/>
          <xsd:element name="CentreOfMass" type="plm:CentreOfMassType"/>
          <xsd:element name="MomentsOfInertia" type="plm:MomentsOfInertiaType"/>
          <xsd:element name="ProductsOfInertia" type="plm:ProductsOfInertiaType"/>
        </xsd:choice>
        <xsd:attribute name="units" type="plm:MassPropertyUnitType" default="kilograms,metres"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="MassProperties" type="plm:MassPropertyType" substitutionGroup="plm:Attribute"/>
  <!-- -->
  <xsd:simpleType name="RequestIdType">
    <xsd:annotation>
      <xsd:documentation>
		  Request identifier.
		  </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="QueryBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
			The abstract datatype and element for Query elements.
			</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Query" type="plm:QueryBase"/>
  <!-- -->
  <xsd:complexType name="RequestType">
    <xsd:annotation>
      <xsd:documentation>
      The element describing the data context for PLMXML request.
      This effectively identifies the part or application
      context for the request.

      Attributes:
      name:          (optional) name of the data context or part.
      format:        (required) the format of the context.
      context:       (required) the location or identifier of the 
                     data context. NB the name is 'context', not
                     'contextRef'.

      SubElements:
      
      Query          (required) the query itself. Note that this
                     is an abstract element, so a substitution
                     element must be used.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:choice>
      <xsd:element ref="plm:Query" maxOccurs="unbounded"/>
    </xsd:choice>
    <xsd:attribute name="name" type="xsd:string" use="optional"/>
    <xsd:attribute name="format" type="plm:RepresentationFormatType" use="required"/>
    <xsd:attribute name="context" type="xsd:string" use="required"/>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="DocumentBase" abstract="true">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=DocumentBase</xsd:appinfo>
      <xsd:documentation>
      This class corresponds to a top-level element in a PLMXML file. 
      Document and RequestDocument are derived classes of this, which 
      correspond to 'PLMXML' and 'PLMXMLRequest' elements, respectively.

      Attributes:

      author:        Author.
      date:          Date modified.
      time:          Time modified.
      language:      Language used, e.g. in comments.
      schemaVersion: Version of the schema this file was written for, e.g. "2.0".
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:DescriptionBase">
        <xsd:attribute name="schemaVersion" type="xsd:decimal" use="required"/>
        <xsd:attribute name="author" type="xsd:string" use="required"/>
        <xsd:attribute name="time" type="xsd:time" use="required"/>
        <xsd:attribute name="date" type="xsd:date" use="required"/>
        <xsd:attribute name="language" type="xsd:language" default="en"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="PLMXMLRequestType">
    <xsd:annotation>
      <xsd:documentation>
      The main PLMXML data request element. This element must appear within it's own document.
      The element contains a number of fields for describing the context of the request 
      (e.g. the part name, etc) and the type of data to be returned. The application making the 
      request provides it's own context within the data request element via the 'requestId' 
      attribute. This attribute value must be returned in the resultant PLMXML document. 
      This enables the application to match PLMXML documents with the data request.
     
      Attributes:
    
      application:    (mandatory) Name of the application making the request.
      requestId:      (mandatory) Application supplied identifier for the 
                      request. This value will be returned in the resulting
                      PLMXML document.

      Elements:
    
      Request:        (optional) The application part context and request. 
    </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:DocumentBase">
        <xsd:sequence>
          <xsd:element name="Request" type="plm:RequestType"/>
        </xsd:sequence>
        <xsd:attribute name="application" type="xsd:string" use="required"/>
        <xsd:attribute name="requestId" type="plm:RequestIdType" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="PLMXMLRequest" type="plm:PLMXMLRequestType">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=RequestDocument</xsd:appinfo>
    </xsd:annotation>
  </xsd:element>
  <!-- -->
  <xsd:simpleType name="RepQueryType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="XT"/>
      <xsd:enumeration value="JT"/>
      <xsd:enumeration value="jXT"/>
      <xsd:enumeration value="All"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="TristripControl">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="facets"/>
      <xsd:enumeration value="tristrips"/>
      <xsd:enumeration value="facetsAndTristrips"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="FacetsetControl">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="unspecified"/>
      <xsd:enumeration value="perFace"/>
      <xsd:enumeration value="perMaterial"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="FacetControlsType">
    <xsd:annotation>
      <xsd:documentation>
      This type gives the parameters which control a facet generation
      operation.
    
      Attributes:
    
      curveAngularTol:     max angular change between chords along edge
      curveDistanceTol:    max edge/chord distance
      surfaceAngularTol:   max angular change between facets
      surfaceDistanceTol:  max face/facet distance
      tristripControl :    whether tristrips allowed
      facetsetControl:     whether facetsets are created per face, per material, or
                           unspecified
    
      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="curveAngularTol" type="xsd:double" use="optional"/>
    <xsd:attribute name="curveDistanceTol" type="xsd:double" use="optional"/>
    <xsd:attribute name="surfaceAngularTol" type="xsd:double" use="optional"/>
    <xsd:attribute name="surfaceDistanceTol" type="xsd:double" use="optional"/>
    <xsd:attribute name="tristripControl" type="plm:TristripControl" use="optional"/>
    <xsd:attribute name="facetsetControl" type="plm:FacetsetControl" use="optional"/>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="RepresentationQueryType">
    <xsd:annotation>
      <xsd:documentation>
      This datatype is used to describe a representation query. The
      element is defined as a substitution element for the abstract
      Query element.
      
      Attributes:
      
      type:       (required) The type of representation requested.
                  Currently, this is : XT, JT, jXT or All
      label:      (optional) If a suitable application label is specified
                  the request must return the representation matching the
                  specified label.
                  If no label is specified, then the request must return
                  a PLMXML document that identifies all the appropriate 
                  representations in the specified context.
    </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:QueryBase">
        <xsd:sequence>
          <xsd:element name="FacetControls" type="plm:FacetControlsType" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="type" type="plm:RepQueryType" use="required"/>
        <xsd:attribute name="label" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="RepresentationQuery" type="plm:RepresentationQueryType" substitutionGroup="plm:Query"/>
  <!-- -->
  <xsd:complexType name="ProductDefQueryType">
    <xsd:annotation>
      <xsd:documentation>
      This datatype is used to describe a product structure query. The
      element is defined as a substitution element for the abstract
      Query element.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:QueryBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="ProductDefQuery" type="plm:ProductDefQueryType" substitutionGroup="plm:Query"/>
  <!-- -->
  <xsd:complexType name="FeatureQueryType">
    <xsd:annotation>
      <xsd:documentation>
      This datatype is used to describe a Feature/FeatureTree query. The
      element is defined as a substitution element for the abstract
      Query element.
    
      Attributes:
    
      label:    (optional) If a suitable application label is specified
                the request must return the feature matching the
                specified label.
                If no label is specified, then the request must return
                an PLMXML document that specifies the whole feature tree 
                within the specified context.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:QueryBase">
        <xsd:attribute name="label" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="FeatureQuery" type="plm:FeatureQueryType" substitutionGroup="plm:Query"/>
  <!-- -->
  <xsd:complexType name="AnnotationQueryType">
    <xsd:annotation>
      <xsd:documentation>
      This datatype is used to describe an Annotation query. The
      element is defined as a substitution element for the abstract
      Query element.
    
      Attributes:
   
      label:    (optional) If a suitable application label is specified
                the request must return the annotation matching the
                specified label.
                If no label is specified, then the request must return
                an PLMXML document that specifies all the annotations 
                within the specified context.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:QueryBase">
        <xsd:attribute name="label" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="AnnotationQuery" type="plm:AnnotationQueryType" substitutionGroup="plm:Query"/>
  <!-- -->
  <xsd:simpleType name="RequestResultType">
    <xsd:annotation>
      <xsd:documentation>
      The request return types.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="Success"/>
      <xsd:enumeration value="InvalidRequest"/>
      <xsd:enumeration value="ContextNotIdentified"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="RequestSeverityType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="none"/>
      <xsd:enumeration value="mild"/>
      <xsd:enumeration value="severe"/>
      <xsd:enumeration value="aborted"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="RequestInformationType">
    <xsd:annotation>
      <xsd:documentation>
      This datatype is used to return status information to the user
      within the resultant PLMXML document. The element is in the form
      of a PLMXML attribute. This implies that an PLMXML docuemnt could 
      just be returned with one RequestInformation element in it - 
      useful for returning errors and no data.
    
      Attributes:
    
      requestId:     (required) The application request identifier.
      result:        (default=Success) Indicates success or failure with a code.
      description:   (optional) textual description of failure, etc. 
    </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttributeBase">
        <xsd:attribute name="requestId" type="plm:RequestIdType" use="required"/>
        <xsd:attribute name="result" type="plm:RequestResultType" default="Success"/>
        <xsd:attribute name="description" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="RequestInformation" type="plm:RequestInformationType" substitutionGroup="plm:Attribute"/>
  <!-- -->
  <xsd:complexType name="MarkupType">
    <xsd:annotation>
      <xsd:documentation>
      The redline markup element for PLMXML - is a simple annotation
      type that describes its textual data via the xhtml spec. Thus
      the text can include format and font information as per a 
      normal html document.
      The redline element(s) is defined via simple polyline geometric
      element and references to related entities can be made via the 
      'EntityRef' element.
      </xsd:documentation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">output=ignore</xsd:appinfo>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttributeBase">
        <xsd:sequence>
          <xsd:element name="html">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:any namespace="http://www.w3.org/1999/xhtml" processContents="skip" maxOccurs="unbounded"/>
              </xsd:sequence>
              <xsd:anyAttribute namespace="http://www.w3.org/1999/xhtml"/>
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="Redline" type="plm:PolyLineType" minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element ref="plm:EntityRef" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="author" type="xsd:string" use="optional"/>
        <xsd:attribute name="time" type="xsd:time" use="optional"/>
        <xsd:attribute name="date" type="xsd:date" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Markup" type="plm:MarkupType" substitutionGroup="plm:Attribute"/>
  <!-- -->
  <xsd:complexType name="PLMXMLType">
    <xsd:annotation>
      <xsd:documentation>
      This defines the type of the outermost element in a PLMXML file.

      This schema definition, in W3C format, can represent the following data in 
      various combinations and permutations :

         Product definition via instance graph and occurrence view representations
         Part representation via facet representation and/or external refs to XT files
         Attribute information
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:DocumentBase">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element name="ProductDef" type="plm:ProductDefType"/>
          <xsd:element ref="plm:StructureDef"/>
          <xsd:element name="Representation" type="plm:RepresentationType"/>
          <xsd:element name="ConstructionGeometry" type="plm:ConstructionGeometryType"/>
          <xsd:element ref="plm:Structure"/>
          <xsd:element ref="plm:StructureRevision"/>
          <xsd:element ref="plm:Attribute"/>
          <xsd:element ref="plm:AttribOwner"/>
        </xsd:choice>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="PLMXML" type="plm:PLMXMLType">
    <xsd:annotation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=Document</xsd:appinfo>
    </xsd:annotation>
  </xsd:element>
  <!-- ============================================================================== -->
  <!-- ============================================================================== -->
  <!-- ============================================================================== -->
  <!--                                                                                -->
  <!--           PDM schema, now incorporated with PLMXMLSchema                       -->
  <!--                                                                                -->
  <!-- -->
  <!-- ************************* Structure *********************************** -->
  <!-- -->
  <xsd:complexType name="StructureBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      This is a base type for objects which can be revisioned and support hierarchical, 
      configurable structure.
      
      Attributes:
      
      name:        Descriptive name
      optionRefs:  Options. Each Option gives the full set of allowed values for this
                   product. ProductRevisions may specify an Option with a sub-set of allowed values.
      subType:     A 'sub-type' string. No specified semantics. This can be used where 
                   simple customised sub-types have been defined and a full PLMXML schema
                   extension is not appropriate.
      
      releaseStatusRefs: Reference to one or more ReleaseStatus elements, which give release 
                   dates and effectivities.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:ManagedBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="optionRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="subType" type="xsd:string" use="optional"/>
        <xsd:attribute name="releaseStatusRefs" type="plm:uriReferenceListType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Structure" type="plm:StructureBase" substitutionGroup="plm:Managed"/>
  <!-- -->
  <!-- ************************* StructureRevision *********************** -->
  <!-- -->
  <xsd:complexType name="StructureRevisionBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      This is a revision of a Structure.
      
      Attributes:
    
      name:          Descriptive name
      revision:      Identifies the revision. Could be numeric, alphabetic, or a mixture.
      version:       Gives the current 'version' of this revision. The version captures
                     changes en route to the next revision of this Product. 
      masterRef:     Reference to the Structure of which this is a version.
      optionRefs:    Options. Each Option gives the set of allowed values for this
                     StructureRevision. 
      releaseStatusRefs: Reference to one or more ReleaseStatus elements, which give release 
                     dates and effectivities.
      instanceRefs:  Reference to elements derived from StructureInstance, which define the
                     hierarchical structure. Both StructureRevision and StructureRevisionView
                     can have instanceRefs. In the case of StructureRevision, the element is
                     then representing a 'default' or 'unspecified' view.
      subType:       See Structure.
      simplifiedRepRefs: If an assembly has replacement representations (that is, in case the
                     assembly structure is not important in some context, then the replacement      
                     representations can be used).

      Elements:
                     
      VariantDefault    
      VariantRuleCheck  
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:ManagedBase">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="plm:VariantDefault"/>
          <xsd:element ref="plm:VariantRuleCheck"/>
        </xsd:choice>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="revision" type="xsd:string" use="required"/>
        <xsd:attribute name="version" type="xsd:nonNegativeInteger" use="optional"/>
        <xsd:attribute name="masterRef" type="plm:anyURIType" use="required"/>
        <xsd:attribute name="optionRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="releaseStatusRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="instanceRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="subType" type="xsd:string" use="optional"/>
        <xsd:attribute name="simplifiedRepRefs" type="plm:uriReferenceListType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="StructureRevision" type="plm:StructureRevisionBase" substitutionGroup="plm:Managed"/>
  <!-- -->
  <!-- ************************* StructureRevisionView ****************************** -->
  <!-- -->
  <xsd:complexType name="StructureRevisionViewBase">
    <xsd:annotation>
      <xsd:documentation>
      This is a base type for elements representing a 'view' (design, 
      manufacturing, etc) of a StructureRevision.
	   
      Attributes:
	   
      name:           descriptive name
      revisionRef:    Specifies the StructureRevision of which this is a view.
      viewRef:        A reference to a view element (e.g. 'design')
      instanceRefs:   if an assembly, these are the Instances it references
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:ManagedBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="revisionRef" type="plm:anyURIType" use="optional"/>
        <xsd:attribute name="viewRef" type="plm:anyURIType" use="optional"/>
        <xsd:attribute name="instanceRefs" type="xsd:IDREFS" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="StructureRevisionView" type="plm:StructureRevisionViewBase" substitutionGroup="plm:Managed"/>
  <!-- -->
  <!-- ************************* Part ***************************************** -->
  <!-- -->
  <xsd:complexType name="PartType">
    <xsd:annotation>
      <xsd:documentation>
      Part. This is used in the representation of configured product structure.
	   
      Attributes:
      
      representationRefs: Representations of the Part.
      materialRef:    an optional Material for use when displaying the Part.
      preferredUnits: the units preferred when presenting this Part to the user. Note 
                      that this does NOT affect any numerical values representing lengths
                      in the PLMXML file - these are always in metres.
      geometryRefs:   geometry elements referenced by the Part.
      annotation3DGroupRefs: reference to any 3D Annotation groups associated with the Part.
                             (note: these are not defined within this schema). 
       
      type:           assembly, minimal, wire, solid, sheet or general.
      partRefs:       if an assembly, it is also possible to 'instance' other Parts
                      directly without the need for an actual Instance element. However
                      this is limited to cases where information stored on the Instance
                      (such as Transform) is not required.      
   
      SubElements:

      Representation: see representationRefs.
      Occurrence:     if an assembly, this Part may have certain Occurrences singled out, so
                      that, for example, they can have different Materials associated, or can
                      be repositioned.
      </xsd:documentation>
      <xsd:appinfo source="PLMXMLSchemaGenerator">sdkname=Part</xsd:appinfo>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StructureRevisionViewBase">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element name="Occurrence" type="plm:OccurrenceType"/>
          <xsd:element name="Representation" type="plm:RepresentationType"/>
        </xsd:choice>
        <xsd:attribute name="type" type="plm:PartTypesType" use="optional"/>
        <xsd:attribute name="partRefs" type="xsd:IDREFS" use="optional"/>
        <xsd:attribute name="representationRefs" type="xsd:IDREFS" use="optional"/>
        <xsd:attribute name="materialRef" type="xsd:IDREF" use="optional"/>
        <xsd:attribute name="preferredUnits" type="plm:PreferredPartUnitsType" default="millimetres"/>
        <xsd:attribute name="geometryRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="annotation3DGroupRefs" type="plm:uriReferenceListType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Part" type="plm:PartType" substitutionGroup="plm:StructureRevisionView"/>
  <!-- -->
  <!-- ************************* Product ****************************** -->
  <!-- -->
  <xsd:complexType name="ProductType">
    <xsd:annotation>
      <xsd:documentation>
      This is the revision-independent Product, derived from Structure.
      It corresponds to the STEP 'product'.
      
      Attributes:
      
      productId:        The identifier of the Product, unique in some context, e.g. an 
                        Organisation.
      alternateForRef:  An 'alternate' Product is one which is substitutable, in all 
                        contexts, for a particular Product. If this is an 'alternate'
                        Product, then this attribute references the Product for which this
                        is an alternate.

      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StructureBase">
        <xsd:attribute name="productId" type="xsd:string" use="optional"/>
        <xsd:attribute name="alternateForRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Product" type="plm:ProductType" substitutionGroup="plm:Managed"/>
  <!-- -->
  <!-- ************************* ProductRevision *********************** -->
  <!-- -->
  <xsd:complexType name="ProductRevisionType">
    <xsd:annotation>
      <xsd:documentation>
      This is a revision of a Product. It corresponds to STEP 'product_definition_formation'.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StructureRevisionBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="ProductRevision" type="plm:ProductRevisionType" substitutionGroup="plm:StructureRevision"/>
  <!-- -->
  <!-- ************************* ProductRevisionView ******************* -->
  <!-- -->
  <xsd:complexType name="ProductRevisionViewType">
    <xsd:annotation>
      <xsd:documentation>
      This is a 'view' (e.g. 'design', 'manufacturing', 'maintenance') of a revision of a 
      Product. 

      Attributes:
      
      releaseStatusRefs: Reference to ReleaseStatus elements giving release date and
                         effectivity information for this revision.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:PartType">
        <xsd:attribute name="releaseStatusRefs" type="plm:uriReferenceListType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="ProductRevisionView" type="plm:ProductRevisionViewType" substitutionGroup="plm:Part"/>
  <!-- -->
  <!-- ****************************** View ****************************** -->
  <!-- -->
  <xsd:complexType name="ViewType">
    <xsd:annotation>
      <xsd:documentation>
      This is a 'view' (e.g. 'design', 'manufacturing', 'maintenance'). Referenced by a 
      ProductRevisionView. Corresponds to iMAN 'BOMView'.
      
      Attributes:
      
      name:   Name of the view (e.g. 'design').
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="View" type="plm:ViewType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- ****************************** StructureInstance ****************************** -->
  <!-- -->
  <xsd:complexType name="StructureInstanceBase">
    <xsd:annotation>
      <xsd:documentation>
      A base type for instancing relations between Structure, StructureRevision and
      StructureRevisionView elements.
	   
      Attributes:
	   
      instancedRef     Reference to instanced element. This should be derived from 
                       StructureRevisionView, StructureRevision, or Structure. In the latter 
                       cases some other context must determine which view or revision is 
                       intended.
      effectivityRefs  Reference to effectivity elements.
      
      SubElements:
 
      VariantCondition:  An optional VariantConditions
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:InstanceType">
        <xsd:sequence>
          <xsd:element ref="plm:VariantCondition" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="instancedRef" type="plm:anyURIType" use="optional"/>
        <xsd:attribute name="effectivityRefs" type="plm:uriReferenceListType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="StructureInstance" type="plm:StructureInstanceBase" substitutionGroup="plm:Instance"/>
  <!-- -->
  <!-- ********************* ProductInstance ****************************** -->
  <!-- -->
  <xsd:complexType name="ProductInstanceType">
    <xsd:annotation>
      <xsd:documentation>
      An Instance between Product, ProductRevision, or ProductRevisionView elements.
      
      Attributes:
      
      substituteForRef:  A ProductInstance may be a 'substitute' for another, which means
                       that it may be used instead, but only in the context of their common
                       parent assembly. If this is a substitute for another ProductInstance,
                       then this attribute references it.

      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StructureInstanceBase">
        <xsd:attribute name="substituteForRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="ProductInstance" type="plm:ProductInstanceType" substitutionGroup="plm:StructureInstance"/>
  <!-- -->
  <!-- ************************* ConfigurationContext ******************* -->
  <!-- -->
  <xsd:complexType name="ConfigurationContextType">
    <xsd:annotation>
      <xsd:documentation>
      This element acts as a context for effectivities. An Effectivity can reference a
      ConfigurationContext element to indicate that the Effectivity is only applicable
      to that ConfigurationContext. 
      
      Attributes:
       
      configId:   Unique identifier.
      name:       Descriptive name
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:ManagedBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="configId" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="ConfigurationContext" type="plm:ConfigurationContextType" substitutionGroup="plm:Managed"/>
  <!-- -->
  <!-- ********************* Effectivity ****************************** -->
  <!-- -->
  <xsd:complexType name="EffectivityType">
    <xsd:annotation>
      <xsd:documentation>
      Effectivity Base class.
      
      contextRef: the Product, ProductRevision, or ConfigurationContext in which this 
                  Effectivity applies. If absent, then the Effectivity is relevant for all 
                  Products and ProductRevisions which use the element to which the 
                  Effectivity is attached.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="contextRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Effectivity" type="plm:EffectivityType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- *********************** Date Effectivity ****************************** -->
  <!-- -->
  <xsd:complexType name="DateEffectivityType">
    <xsd:annotation>
      <xsd:documentation>
      Date Effectivity. Indicates that an element is effective between two specified dates.
      If the start date or end date is omitted, the effectivity is open-ended in that
      direction.

      Attributes:
     
      start:      Start date and time.
      end:        End date and time.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EffectivityType">
        <xsd:attribute name="start" type="xsd:dateTime" use="optional"/>
        <xsd:attribute name="end" type="xsd:dateTime" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="DateEffectivity" type="plm:DateEffectivityType" substitutionGroup="plm:Effectivity"/>
  <!-- -->
  <!-- *********************** Lot Effectivity ******************************* -->
  <!-- -->
  <xsd:complexType name="LotEffectivityType">
    <xsd:annotation>
      <xsd:documentation>
      Lot Effectivity. Indicates that an element is effective only for a certain 'lot' or
      batch. 
      If the start date or end date is omitted, the effectivity is open-ended in that
      direction.

      Attributes:
     
      lot:        Lot identifier.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EffectivityType">
        <xsd:attribute name="lot" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="LotEffectivity" type="plm:LotEffectivityType" substitutionGroup="plm:Effectivity"/>
  <!-- -->
  <!-- *********************** SerialNumber Effectivity ********************** -->
  <!-- -->
  <xsd:complexType name="SerialNumberEffectivityType">
    <xsd:annotation>
      <xsd:documentation>
      Serial Number Effectivity. Indicates that an element is effective for a range of
      serial numbers. If the start or end is omitted, the effectivity is open-ended in that
      direction.

      Attributes:
     
      start:      Start serial number.
      end:        End serial number.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:EffectivityType">
        <xsd:attribute name="start" type="xsd:string" use="optional"/>
        <xsd:attribute name="end" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="SerialNumberEffectivity" type="plm:SerialNumberEffectivityType" substitutionGroup="plm:Effectivity"/>
  <!-- -->
  <!-- ********************* Option ************************************************ -->
  <!-- -->
  <xsd:simpleType name="OptionScopeType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="public"/>
      <xsd:enumeration value="private"/>
      <xsd:enumeration value="legacy"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:simpleType name="OptionTypesType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="enum"/>
      <xsd:enumeration value="string"/>
      <xsd:enumeration value="int"/>
      <xsd:enumeration value="real"/>
      <xsd:enumeration value="logical"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="OptionValueType">
    <xsd:attribute name="v" type="xsd:string"/>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="OptionType">
    <xsd:annotation>
      <xsd:documentation>
      Option. This element specifies the valid values for an Option, either as a set of
      allowed values (i.e. an enum), or as a range of values of a particular type.

      Attributes:

      name:          Option name.
      scope:         Option scope.
      type:          Option type - enum, string, int, real or logical.

      SubElements:

      Value:         If the Option is of type enum, it should contain a sequence of Value
                     sub-elements giving the allowed values.

      GreaterThan:        ) If the Option type is not enum, then its allowed values are                   
      GreaterThanOrEqual: ) given by a range, which is specified by a GreaterThan or 
      LessThan:           ) GreaterThanOrEqual element, followed by a LessThan or
      LessThanOrEqual:    ) LessThanOrEqual element. These are all of type OptionValueType.

      Default:       Following these elements there may be a Default element giving a
                     default value for the Option.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:sequence>
          <xsd:choice>
            <xsd:choice maxOccurs="unbounded">
              <xsd:element name="Value" type="plm:OptionValueType"/>
            </xsd:choice>
            <xsd:sequence>
              <xsd:choice>
                <xsd:element name="GreaterThan" type="plm:OptionValueType"/>
                <xsd:element name="GreaterThanOrEqual" type="plm:OptionValueType"/>
              </xsd:choice>
              <xsd:choice>
                <xsd:element name="LessThan" type="plm:OptionValueType"/>
                <xsd:element name="LessThanOrEqual" type="plm:OptionValueType"/>
              </xsd:choice>
            </xsd:sequence>
          </xsd:choice>
          <xsd:element name="Default" type="plm:OptionValueType" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="scope" type="plm:OptionScopeType" use="optional"/>
        <xsd:attribute name="type" type="plm:OptionTypesType" default="enum"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Option" type="plm:OptionType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- ********************* Operand *************************************** -->
  <!-- -->
  <xsd:complexType name="OperandBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Operand - abstract base class for Operands (arguments of operators).
      </xsd:documentation>
    </xsd:annotation>
  </xsd:complexType>
  <xsd:element name="Operand" type="plm:OperandBase"/>
  <!-- -->
  <!-- ********************* Statement ************************************* -->
  <!-- -->
  <xsd:complexType name="StatementBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Statement - abstract base class for statements.
      </xsd:documentation>
    </xsd:annotation>
  </xsd:complexType>
  <xsd:element name="Statement" type="plm:StatementBase"/>
  <!-- -->
  <!-- ********************* StatementListType ****************************** -->
  <!-- -->
  <xsd:complexType name="StatementListType">
    <xsd:annotation>
      <xsd:documentation>
      StatementList - a list of statements.

      SubElements:

      Contains a non-empty sequence of elements derived from Statement.      
      </xsd:documentation>
    </xsd:annotation>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element ref="plm:Statement"/>
    </xsd:choice>
  </xsd:complexType>
  <!-- -->
  <!-- ********************* Expression ************************************ -->
  <!-- -->
  <xsd:complexType name="ExpressionBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Expression - abstract base class for Expressions.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:OperandBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Expression" type="plm:ExpressionBase" substitutionGroup="plm:Operand"/>
  <!-- -->
  <!-- ********************* LogicalExpression ****************************** -->
  <!-- -->
  <xsd:complexType name="LogicalExpressionBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      LogicalExpression - abstract base class for expressions returning a logical result.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:ExpressionBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="LogicalExpression" type="plm:LogicalExpressionBase" substitutionGroup="plm:Expression"/>
  <!-- -->
  <!-- ********************* And ********************************************* -->
  <!-- -->
  <xsd:complexType name="AndType">
    <xsd:annotation>
      <xsd:documentation>
      And - a type of logical expression.

      SubElements:

      At least two sub-elements, derived from LogicalExpression. The And expression
      returns true if all its sub-elements return true.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:LogicalExpressionBase">
        <xsd:choice minOccurs="2" maxOccurs="unbounded">
          <xsd:element ref="plm:LogicalExpression"/>
        </xsd:choice>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="And" type="plm:AndType" substitutionGroup="plm:LogicalExpression"/>
  <!-- -->
  <!-- ********************* Or ********************************************** -->
  <!-- -->
  <xsd:complexType name="OrType">
    <xsd:annotation>
      <xsd:documentation>
      Or - a type of logical expression.

      SubElements:

      At least two sub-elements, derived from LogicalExpression. The Or expression
      returns true if any of its sub-elements return true.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:LogicalExpressionBase">
        <xsd:choice minOccurs="2" maxOccurs="unbounded">
          <xsd:element ref="plm:LogicalExpression"/>
        </xsd:choice>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Or" type="plm:OrType" substitutionGroup="plm:LogicalExpression"/>
  <!-- -->
  <!-- ********************* Not ******************************************** -->
  <!-- -->
  <xsd:complexType name="NotType">
    <xsd:annotation>
      <xsd:documentation>
      Not - a type of logical expression.

      SubElements:

      One sub-element, derived from LogicalExpression. The Not expression returns 
      true if its sub-element returns false.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:LogicalExpressionBase">
        <xsd:choice>
          <xsd:element ref="plm:LogicalExpression"/>
        </xsd:choice>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Not" type="plm:NotType" substitutionGroup="plm:LogicalExpression"/>
  <!-- -->
  <!-- ********************* OptionIs **************************************** -->
  <!-- -->
  <xsd:simpleType name="LogicalOperationType">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="eq"/>
      <xsd:enumeration value="ne"/>
      <xsd:enumeration value="gt"/>
      <xsd:enumeration value="ge"/>
      <xsd:enumeration value="lt"/>
      <xsd:enumeration value="le"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="OptionIsType">
    <xsd:annotation>
      <xsd:documentation>
      OptionIs - a logical expression which returns true if a given Option has a
      particular relation to a given value (default equality relation).
      
      Attributes:

      optionRef:   Reference to the Option.
      value:       Specified value for the Option.
      operation:   The operation. For example if operation is "gt", then OptionIs
                   returns true if the option is greater than 'value'.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:LogicalExpressionBase">
        <xsd:attribute name="optionRef" type="plm:anyURIType" use="required"/>
        <xsd:attribute name="value" type="xsd:string" use="required"/>
        <xsd:attribute name="operation" type="plm:LogicalOperationType" default="eq"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="OptionIs" type="plm:OptionIsType" substitutionGroup="plm:LogicalExpression"/>
  <!-- -->
  <!-- ************************ Set **************************************** -->
  <!-- -->
  <xsd:complexType name="SetType">
    <xsd:annotation>
      <xsd:documentation>
      Set. A Statement which sets an Option to a particular value.

      Attributes:

      optionRef:   Reference to the Option.
      value:       Specified value for the Option.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StatementBase">
        <xsd:attribute name="optionRef" type="plm:anyURIType" use="required"/>
        <xsd:attribute name="value" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Set" type="plm:SetType" substitutionGroup="plm:Statement"/>
  <!-- -->
  <!-- ************************ SetDefault *********************************** -->
  <!-- -->
  <xsd:complexType name="SetDefaultType">
    <xsd:annotation>
      <xsd:documentation>
      SetDefault. A Statement which sets an Option to a particular value, if it
      is unset. Unlike the Set Statement, it will not override an existing value.

      Attributes:

      optionRef:   Reference to the Option.
      value:       Specified value for the Option.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StatementBase">
        <xsd:attribute name="optionRef" type="plm:anyURIType" use="required"/>
        <xsd:attribute name="value" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="SetDefault" type="plm:SetDefaultType" substitutionGroup="plm:Statement"/>
  <!-- -->
  <!-- ************************ Fix ****************************************** -->
  <!-- -->
  <xsd:complexType name="FixType">
    <xsd:annotation>
      <xsd:documentation>
      Fix. A Statement which sets an Option to a particular value, and fixes it.
      Subsequent Set, SetDefault, or Fix Statements are not allowed to modify it.

      Attributes:

      optionRef:   Reference to the Option.
      value:       Specified value for the Option.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StatementBase">
        <xsd:attribute name="optionRef" type="plm:anyURIType" use="required"/>
        <xsd:attribute name="value" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Fix" type="plm:FixType" substitutionGroup="plm:Statement"/>
  <!-- -->
  <!-- ********************* Message **************************************** -->
  <!-- -->
  <xsd:complexType name="MessageBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      Message - abstract base class for Message Statements.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StatementBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Message" type="plm:MessageBase" substitutionGroup="plm:Statement"/>
  <!-- -->
  <!-- ********************* CheckMessage ************************************* -->
  <!-- -->
  <xsd:complexType name="CheckMessageType">
    <xsd:annotation>
      <xsd:documentation>
      Check Message. This is used in VariantRuleChecks.

      Attributes:

      message:     String message to output.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:MessageBase">
        <xsd:attribute name="message" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="CheckMessage" type="plm:CheckMessageType" substitutionGroup="plm:Message"/>
  <!-- -->
  <!-- ********************* InformMessage **************************************** -->
  <!-- -->
  <xsd:complexType name="InformMessageType">
    <xsd:annotation>
      <xsd:documentation>
      Inform Message. Outputs an informative message.

      Attributes:

      message:     String message to output.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:MessageBase">
        <xsd:attribute name="message" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="InformMessage" type="plm:InformMessageType" substitutionGroup="plm:Message"/>
  <!-- -->
  <!-- ********************* WarnMessage ******************************************* -->
  <!-- -->
  <xsd:complexType name="WarnMessageType">
    <xsd:annotation>
      <xsd:documentation>
      Warn Message. Outputs a warning message.

      Attributes:

      message:     String message to output.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:MessageBase">
        <xsd:attribute name="message" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="WarnMessage" type="plm:WarnMessageType" substitutionGroup="plm:Message"/>
  <!-- -->
  <!-- ********************* ErrorMessage ******************************************* -->
  <!-- -->
  <xsd:complexType name="ErrorMessageType">
    <xsd:annotation>
      <xsd:documentation>
      Error Message. Outputs an error message.

      Attributes:

      message:     String message to output.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:MessageBase">
        <xsd:attribute name="message" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="ErrorMessage" type="plm:ErrorMessageType" substitutionGroup="plm:Message"/>
  <!-- -->
  <!-- ********************* ConditionalStatement ****************************** -->
  <!-- -->
  <xsd:complexType name="ConditionalStatementType">
    <xsd:annotation>
      <xsd:documentation>
      ConditionalStatement. This is an If ... Then ... Else ... Statement.

      SubElements:

      First, an element derived from LogicalExpression.

      Then:         StatementList element, executed if the LogicalExpression returns true.
      Else:         Optional StatementList element, executed if the LogicalExpression
                    returns false.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StatementBase">
        <xsd:sequence>
          <xsd:element ref="plm:LogicalExpression"/>
          <xsd:element name="Then" type="plm:StatementListType"/>
          <xsd:element name="Else" type="plm:StatementListType" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="If" type="plm:ConditionalStatementType" substitutionGroup="plm:Statement"/>
  <!-- -->
  <!-- ********************* VariantRule ****************************** -->
  <!-- -->
  <xsd:complexType name="VariantRuleType">
    <xsd:annotation>
      <xsd:documentation>
      VariantRule. This specifies a configuration by giving specified values for
      a set of Options.
      
      Attributes:
      
      name:          Descriptive name
      configuredRef: The StructureRevision this VariantRule is associated with, if any.
      
      SubElements:

      A non-empty sequence of Set Statements, which specify values for a set of
      Options.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:sequence>
          <xsd:element ref="plm:Set" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="configuredRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="VariantRule" type="plm:VariantRuleType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- ********************* VariantRuleCheck ****************************** -->
  <!-- -->
  <xsd:complexType name="VariantRuleCheckType">
    <xsd:annotation>
      <xsd:documentation>
      VariantRuleCheck. This outputs a Check Message if a condition is true.
      
      SubElements:

      An element derived from LogicalExpression.
      A Check element.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:sequence>
          <xsd:element ref="plm:LogicalExpression"/>
          <xsd:element ref="plm:CheckMessage"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="VariantRuleCheck" type="plm:VariantRuleCheckType"/>
  <!-- -->
  <!-- ********************* VariantDefault ****************************** -->
  <!-- -->
  <xsd:complexType name="VariantDefaultBase" abstract="true">
    <xsd:annotation>
      <xsd:documentation>
      VariantDefault. An abstract base class for Variant Defaults.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="VariantDefault" type="plm:VariantDefaultBase"/>
  <!-- -->
  <!-- ********************* VariantDefaultFixed ****************************** -->
  <!-- -->
  <xsd:complexType name="VariantDefaultFixedType">
    <xsd:annotation>
      <xsd:documentation>
      VariantDefaultFixed. This is a collection of 'SetDefault' Statements.

      SubElements:
 
      A non-empty sequence of SetDefault Statements, which set the values of some
      Options, if they are not already set.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:VariantDefaultBase">
        <xsd:choice maxOccurs="unbounded">
          <xsd:element ref="plm:SetDefault"/>
        </xsd:choice>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="VariantDefaultFixed" type="plm:VariantDefaultFixedType" substitutionGroup="plm:VariantDefault"/>
  <!-- -->
  <!-- ********************* VariantDefaultDerived ****************************** -->
  <!-- -->
  <xsd:complexType name="VariantDefaultDerivedType">
    <xsd:annotation>
      <xsd:documentation>
      VariantDefaultDerived. A set of SetDefault Statements which depend on a 
      LogicalExpression.

      SubElements:

      An element derived from LogicalExpression.
      A non-empty sequence of SetDefault Statements, which are executed if the
          expression returns true.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:VariantDefaultBase">
        <xsd:sequence>
          <xsd:element ref="plm:LogicalExpression"/>
          <xsd:element ref="plm:SetDefault" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="VariantDefaultDerived" type="plm:VariantDefaultDerivedType" substitutionGroup="plm:VariantDefault"/>
  <!-- -->
  <!-- ********************* VariantCondition ****************************** -->
  <!-- -->
  <xsd:complexType name="VariantConditionType">
    <xsd:annotation>
      <xsd:documentation>
      VariantCondition. This contains a logical expression which determines whether
      the Instance it is attached to is 'loaded', i.e. appears in the configuration.

      SubElements:

      A single element derived from LogicalExpression.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:sequence>
          <xsd:element ref="plm:LogicalExpression"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="VariantCondition" type="plm:VariantConditionType"/>
  <!-- -->
  <!-- ***************************** Unit ****************************** -->
  <!-- -->
  <xsd:complexType name="UnitComponentType">
    <xsd:annotation>
      <xsd:documentation>
      Component of a unit of measurement
			
      Attributes:
			
      exponent:    power to which unit is raised, e.g. seconds**2
      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="exponent" type="xsd:double" use="required"/>
  </xsd:complexType>
  <!-- -->
  <xsd:complexType name="UnitType">
    <xsd:annotation>
      <xsd:documentation>
      Unit - a unit of measurement, e.g. kilogram/metre**2
		
      Based on the SI system, this specifies exponents for each of the 7 
      fundamental units. 

      SubElements:

      Metre:         a UnitComponent element giving the length exponent.
      ...etc...
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:sequence>
          <xsd:element name="Metre" type="plm:UnitComponentType" minOccurs="0"/>
          <xsd:element name="Kilogram" type="plm:UnitComponentType" minOccurs="0"/>
          <xsd:element name="Second" type="plm:UnitComponentType" minOccurs="0"/>
          <xsd:element name="Ampere" type="plm:UnitComponentType" minOccurs="0"/>
          <xsd:element name="Mole" type="plm:UnitComponentType" minOccurs="0"/>
          <xsd:element name="Candela" type="plm:UnitComponentType" minOccurs="0"/>
          <xsd:element name="Kelvin" type="plm:UnitComponentType" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Unit" type="plm:UnitType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- *************************** Owner ****************************** -->
  <!-- -->
  <xsd:complexType name="OwnerBase">
    <xsd:annotation>
      <xsd:documentation>
      Base class for entities which can 'own' objects (people, organisations, users, 
      sites, etc).
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Owner" type="plm:OwnerBase" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- ************************ Person ***************************************** -->
  <!-- -->
  <xsd:complexType name="PersonType">
    <xsd:annotation>
      <xsd:documentation>
      An individual Person.

      Attributes:

      firstName:    first name.
      middleNames:  middle names and/or initials.
      lastName:     last (family) name.
      userId:       user Id.
      addressRef:   optional reference to an Address element.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:OwnerBase">
        <xsd:attribute name="firstName" type="xsd:string" use="optional"/>
        <xsd:attribute name="middleNames" type="xsd:string" use="optional"/>
        <xsd:attribute name="lastName" type="xsd:string" use="optional"/>
        <xsd:attribute name="userId" type="xsd:string" use="optional"/>
        <xsd:attribute name="addressRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Person" type="plm:PersonType" substitutionGroup="plm:Owner"/>
  <!-- -->
  <!-- ************************ User ***************************************** -->
  <!-- -->
  <xsd:complexType name="UserType">
    <xsd:annotation>
      <xsd:documentation>
      A User, i.e. a user account on a computer system.

      Attributes:

      userId:        User Id.
      personRef:     optional reference to a Person element.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:OwnerBase">
        <xsd:attribute name="userId" type="xsd:string" use="required"/>
        <xsd:attribute name="personRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="User" type="plm:UserType" substitutionGroup="plm:Owner"/>
  <!-- -->
  <!-- ************************ Organisation  *********************************** -->
  <!-- -->
  <xsd:complexType name="OrganisationType">
    <xsd:annotation>
      <xsd:documentation>
      An organisation, i.e. a group of people or users. Organisations are hierarchical.
      People/Users are associated with organisations by means of an OrganisationMember 
      element, which also specifies a Role.

      Attributes:

      name:             Name of Organisation.
      address:          Optional reference to Address.
      organisationRefs: Reference to sub-organisations.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:OwnerBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="organisationRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="addressRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Organisation" type="plm:OrganisationType" substitutionGroup="plm:Owner"/>
  <!-- -->
  <!-- ************************ Role ************************************ -->
  <!-- -->
  <xsd:complexType name="RoleType">
    <xsd:annotation>
      <xsd:documentation>
      A Role, e.g. "Designer", "Test Engineer", "Chairman", which a Person 
      plays in an organisation.
			
      Attributes:

      name:         The name of the role, i.e. "Designer".
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Role" type="plm:RoleType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- ************************ OrganisationMember *********************** -->
  <!-- -->
  <xsd:complexType name="OrganisationMemberType">
    <xsd:annotation>
      <xsd:documentation>
      This element is used to associate a Person/User with an Organisation, and to 
      assign an optional Role to that Person/User within that Organisation. A person
      may have more than one Role in an Organisation.
      
      Attributes:

      memberRef:        Reference to a Person or User.
      organisationRef:  The Organisation.
      roleRef:          The Role.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:OwnerBase">
        <xsd:attribute name="memberRef" type="plm:anyURIType" use="required"/>
        <xsd:attribute name="organisationRef" type="plm:anyURIType" use="required"/>
        <xsd:attribute name="roleRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="OrganisationMember" type="plm:OrganisationMemberType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- ************************ ResourcePool **************************** -->
  <!-- -->
  <xsd:complexType name="ResourcePoolType">
    <xsd:annotation>
      <xsd:documentation>
      This is a class of people/users within an organisation, e.g. all people in 
      Company A with role 'programmer'. As such it references an organisation and 
      a role. It can be used as a resource without specifying a particular person.

      Attributes:

      organisationRef:  The Organisation.
      roleRef:          The Role.	
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="organisationRef" type="plm:anyURIType" use="optional"/>
        <xsd:attribute name="roleRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="ResourcePool" type="plm:ResourcePoolType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- ************************ Address *********************** -->
  <!-- -->
  <xsd:complexType name="AddressType">
    <xsd:annotation>
      <xsd:documentation>
      An address for a Person or Organisation.

      Attributes:

      internalLocation:   Room, mailbox, etc.
      streetNumber:
      street:             Name of street, road, lane, etc.
      town:               Village, Town, City, etc.
      region:             Region, County, State, etc.
      country:            Country.
      postalCode:         PostCode, ZIP, etc.
      emailAddress:
      telephone:
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="internalLocation" type="xsd:string" use="optional"/>
        <xsd:attribute name="streetNumber" type="xsd:string" use="optional"/>
        <xsd:attribute name="street" type="xsd:string" use="optional"/>
        <xsd:attribute name="town" type="xsd:string" use="optional"/>
        <xsd:attribute name="region" type="xsd:string" use="optional"/>
        <xsd:attribute name="postalCode" type="xsd:string" use="optional"/>
        <xsd:attribute name="country" type="xsd:string" use="optional"/>
        <xsd:attribute name="emailAddress" type="xsd:string" use="optional"/>
        <xsd:attribute name="telephone" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Address" type="plm:AddressType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- ************************ Site  *********************************** -->
  <!-- -->
  <xsd:complexType name="SiteType">
    <xsd:annotation>
      <xsd:documentation>
      A Site in the sense of a particular software installation, database,
      or location.
      
      Attributes:
      
      name           Name of the Site
      siteId         Identifying Id of the Site
      addressRef     Optional reference to Address element.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:OwnerBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="siteId" type="xsd:string" use="optional"/>
        <xsd:attribute name="addressRef" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Site" type="plm:SiteType" substitutionGroup="plm:Owner"/>
  <!-- -->
  <!-- *********************** Access Control **************************** -->
  <!-- -->
  <xsd:simpleType name="AccessIntentEnum">
    <xsd:annotation>
      <xsd:documentation>
      Simple Access Control enum.

      reference:  read-only
      modifiable: read-write
      noAccess:   may not be accessed at all.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="reference"/>
      <xsd:enumeration value="modifiable"/>
      <xsd:enumeration value="noAccess"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- -->
  <xsd:complexType name="AccessIntentType">
    <xsd:annotation>
      <xsd:documentation>
      Simple access control element. Specifies a set of owners, and read/write access.
      
      Attributes:
 
      intent:      reference, modifiable or noAccess.
      ownerRefs    Reference to one or more owners. These should be elements 
                   derived from plm:OwnerBase, e.g. Person, Organisation, Site, etc.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AccessControlBase">
        <xsd:attribute name="ownerRefs" type="plm:uriReferenceListType" use="optional"/>
        <xsd:attribute name="intent" type="plm:AccessIntentEnum" default="modifiable"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="AccessIntent" type="plm:AccessIntentType" substitutionGroup="plm:AccessControl"/>
  <!-- -->
  <!-- *********************** StatusInfo ******************************** -->
  <!-- -->
  <xsd:complexType name="StatusInfoType">
    <xsd:annotation>
      <xsd:documentation>
      Simple status information.
      
      Attributes:
      
      dateCreated:       Date and time created.  
      dateModified:      Date and time last modified.
      lastModifiedBy:    Person or User who last modified this element.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:StatusBase">
        <xsd:attribute name="dateCreated" type="xsd:dateTime" use="optional"/>
        <xsd:attribute name="dateModified" type="xsd:dateTime" use="optional"/>
        <xsd:attribute name="lastModifiedBy" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="StatusInfo" type="plm:StatusInfoType" substitutionGroup="plm:Status"/>
  <!-- -->
  <!-- *********************** Checkout ******************************** -->
  <!-- -->
  <xsd:complexType name="CheckoutType">
    <xsd:annotation>
      <xsd:documentation>
      Checkout information.
      
      Attributes:
      
      by:           Person etc. holding the checkout. Derived from OwnerBase.
      date:         Date and time checked out.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:CheckoutStatusBase">
        <xsd:attribute name="date" type="xsd:dateTime" use="optional"/>
        <xsd:attribute name="by" type="plm:anyURIType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="Checkout" type="plm:CheckoutType" substitutionGroup="plm:CheckoutStatus"/>
  <!-- -->
  <!-- ************************* Associated Files/Datasets ********************** -->
  <!-- -->
  <xsd:complexType name="AssociatedDataSetType">
    <xsd:annotation>
      <xsd:documentation>
      Attribute used to associate a DataSet with a PLM XML element.

      Attributes:
      
      dataSetRef: uri reference to DataSet
      role:       role/purpose of DataSet. No specified values.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttributeBase">
        <xsd:attribute name="dataSetRef" type="plm:anyURIType" use="required"/>
        <xsd:attribute name="role" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="AssociatedDataSet" type="plm:AssociatedDataSetType" substitutionGroup="plm:Attribute"/>
  <!-- -->
  <xsd:complexType name="ExternalFileType">
    <xsd:annotation>
      <xsd:documentation>
      Represents an external file.

      Attributes:
      
      locationRef: uri of the file
      format:      format of the file. This should determine which applications
                   can read the file. There is no fixed set of values for this, but
                   will often correspond to the file extension, e.g. "doc", "txt".
                   If the format is the same as a Representation format, e.g. "JT",
                   then the same format string should be used.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="locationRef" type="plm:anyURIType" use="required"/>
        <xsd:attribute name="format" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="ExternalFile" type="plm:ExternalFileType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <xsd:complexType name="DataSetType">
    <xsd:annotation>
      <xsd:documentation>
      Represents a DataSet (collection of files)

      Attributes:
      
      name:        name of the DataSet.
      version:     version number.
      type:        type of DataSet. No specified values.
      memberRefs:  uri references to the members of the DataSet. These should be
                   plm:ExternalFile elements.
      releaseStatusRefs: Reference to one or more ReleaseStatus elements, which give release 
                   dates and effectivities.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:ManagedBase">
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="version" type="xsd:nonNegativeInteger" use="optional"/>
        <xsd:attribute name="type" type="xsd:string" use="optional"/>
        <xsd:attribute name="memberRefs" type="plm:uriReferenceListType" use="required"/>
        <xsd:attribute name="releaseStatusRefs" type="plm:uriReferenceListType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="DataSet" type="plm:DataSetType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
  <!-- ********************* ReleaseStatus ******************************* -->
  <!-- -->
  <xsd:complexType name="ReleaseStatusType">
    <xsd:annotation>
      <xsd:documentation>
      ReleaseStatus. Specifies date of release, and effectivities.

      Attributes:
      
      name:            Descriptive name.
      dateReleased:    Date and time released.
      effectivityRefs: Reference to Effectivity elements.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="plm:AttribOwnerBase">
        <xsd:attribute name="name" type="xsd:string"/>
        <xsd:attribute name="dateReleased" type="xsd:dateTime" use="optional"/>
        <xsd:attribute name="effectivityRefs" type="plm:uriReferenceListType" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="ReleaseStatus" type="plm:ReleaseStatusType" substitutionGroup="plm:AttribOwner"/>
  <!-- -->
</xsd:schema>
