<?xml version="1.0"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
      datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
      ns="http://www.w3.org/2001/XMLSchema"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:doc="http://www.jenitennison.com/doc">

<doc:p>
  RELAX NG schema for XML Schema by <doc:link 
  href="mailto:mail@jenitennison.com">Jeni Tennison</doc:link>. Based on 
  <doc:link href="http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/">XML 
  Schema Part I: Structures Recommendation</doc:link> and <doc:link 
  href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/">XML Schema Part 
  II: Datatypes</doc:link>.
</doc:p>
<doc:changes date="2001-11-24">
  <doc:p>
    Amended to comply with 10 August 2001 Tutorial.
  </doc:p>
  <doc:change>Removed key attributes.</doc:change>
  <doc:change>Replaced not element with except elements.</doc:change>
  <doc:change>
    Replaced multiple consecutive optional attributes to use the 
    zeroOrMore/choice pattern.
  </doc:change>
  <doc:change>
    Removed interleave elements inside list elements (which are no longer 
    permitted).
  </doc:change>
</doc:changes>
<doc:changes date="2004-10-12">
  <doc:p>Amended to comply with final version of RNG.</doc:p>
  <doc:change>Changed to avoid conflicting ID types.</doc:change>
</doc:changes>

<define name="openAttrs">
  <doc:p>
    This allows any number of attributes that are not in the XML Schema 
    namespace or are in no namespace.  This is somewhat more complicated than 
    the XML Schema anyAttribute equivalent. 
  </doc:p>
  <zeroOrMore>
    <attribute>
      <anyName>
        <except>
          <nsName />
          <nsName ns="" />
          <name>xml:lang</name>
        </except>
      </anyName>
      <text />
    </attribute>
  </zeroOrMore>
</define>

<define name="annotated">
  <doc:p>
    This allows any number of attributes that are not in the XML Schema 
    namespace or are in no namespace, an optional id attribute of type ID, 
    and an optional annotation element.  This is used as the basis for many 
    element content models.
  </doc:p>
  <ref name="openAttrs" />
  <optional>
    <attribute name="id">
      <data type="ID" />
    </attribute>
  </optional>
  <optional>
    <ref name="annotation" />
  </optional>
</define>

<define name="schemaTop">
  <doc:p>
    This gives the content model of the top level of the schema.
  </doc:p>
  <choice>
    <ref name="redefinable" />
    <ref name="topLevelElement" />
    <ref name="topLevelAttribute" />
    <ref name="notation" />
  </choice>
</define>

<define name="redefinable">
  <doc:p>
    This gives the components that can be redefined within the redefine 
    element.  They also occur at the top level of the schema.
  </doc:p>
  <choice>
    <ref name="topLevelSimpleType" />
    <ref name="topLevelComplexType" />
    <ref name="namedGroup" />
    <ref name="namedAttributeGroup" />
  </choice>
</define>

<define name="formChoice">
  <doc:p>
    This gives the values for the various form attributes: 
    elementFormDefault and attributeFormDefault on the schema element, and
    the form attributes on the element and attribute elements.
  </doc:p>
  <choice>
    <value>qualified</value>
    <value>unqualified</value>
  </choice>
</define>

<define name="reducedDerivationControl">
  <doc:p>
    This gives the values that can be taken in the lists used to control
    derivation by extension or restriction (this is 'reduced' derivation
    because some derivation can involve substitution).  This RELAX NG schema, 
    like the XML Schema Recommendation here, allows the keywords 'extension' and 
    'restriction' to be repeated any number of times.
  </doc:p>
  <list>
    <zeroOrMore>
      <choice>
        <value>extension</value>
        <value>restriction</value>
      </choice>
    </zeroOrMore>
  </list>
</define>

<define name="derivationSet">
  <doc:p>
    This specifies the possible values for attributes that control derivation.
  </doc:p>
  <choice>
    <value>#all</value>
    <ref name="reducedDerivationControl" />
  </choice>
</define>

<start>
  <doc:p>
    This is the beginning point for the schema, and defines the schema 
    element.
  </doc:p>
  <element name="schema" 
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-schema">
    <ref name="openAttrs" />
    <zeroOrMore>
      <choice>
        <attribute name="version">
          <data type="token" />
        </attribute>
        <attribute name="finalDefault">
          <ref name="derivationSet" />
        </attribute>
        <attribute name="blockDefault">
          <ref name="blockSet" />
        </attribute>
        <attribute name="attributeFormDefault">
          <ref name="formChoice" />
        </attribute>
        <attribute name="elementFormDefault">
          <ref name="formChoice" />
        </attribute>
        <attribute name="id">
          <data type="ID" />
        </attribute>
        <attribute name="xml:lang">
          <data type="language" />
        </attribute>
      </choice>
    </zeroOrMore>
    <choice>
      <group>
        <doc:p>
          If a targetNamespace attribute is specified on the schema 
          element, then the namespace attribute on the import elements 
          that it contains are optional.
        </doc:p>
        <attribute name="targetNamespace">
          <data type="anyURI" />
        </attribute>
        <zeroOrMore>
          <choice>
            <ref name="include" />
            <ref name="importOptionalNamespace" />
            <ref name="redefine" />
            <ref name="annotation" />
          </choice>
        </zeroOrMore>
      </group>
      <zeroOrMore>
        <doc:p>
          If a targetNamespace attribute is not specified on the schema 
          element, then the import elements that it contains must specify 
          a namespace.
        </doc:p>
        <choice>
          <ref name="include" />
          <ref name="importRequiredNamespace" />
          <ref name="redefine" />
          <ref name="annotation" />
        </choice>
      </zeroOrMore>
    </choice>
    <zeroOrMore>
      <ref name="schemaTop" />
      <zeroOrMore>
        <ref name="annotation" />
      </zeroOrMore>
    </zeroOrMore>
  </element>
</start>

<define name="allNNI">
  <doc:p>
    This gives the value type for the maxOccurs attribute, which may be a 
    non-negative number or the keyword 'unbounded'.
  </doc:p>
  <choice>
    <data type="nonNegativeInteger" />
    <value type="token">unbounded</value>
  </choice>
</define>

<define name="occurs">
  <doc:p>
    This specifies the occurs attributes, minOccurs and maxOccurs, as they 
    are normally used.
  </doc:p>
  <zeroOrMore>
    <choice>
      <attribute name="minOccurs">
        <data type="nonNegativeInteger" />
      </attribute>
      <attribute name="maxOccurs">
        <ref name="allNNI" />
      </attribute>
    </choice>
  </zeroOrMore>
</define>

<define name="typeDefParticle">
  <doc:p>
    This gives the possible content of complex types.
  </doc:p>
  <choice>
    <ref name="groupRef" />
    <ref name="all" />
    <ref name="choice" />
    <ref name="sequence" />
  </choice>
</define>

<define name="nestedParticle">
  <doc:p>
    This gives the particles that can make up a model group.
  </doc:p>
  <choice>
    <ref name="localElement" />
    <ref name="groupRef" />
    <ref name="choice" />
    <ref name="sequence" />
    <ref name="any" />
  </choice>
</define>

<define name="fixedOrDefault">
  <doc:p>
    This specifies the relationship between fixed and default attributes on 
    element and attribute elements - if one is present, then the other cannot 
    be.  This is a constraint that cannot be specified using XML Schema.
  </doc:p>
  <choice>
    <empty />
    <attribute name="fixed" />
    <attribute name="default" />
  </choice>
</define>

<define name="attributeType">
  <doc:p>
    This specifies the relationship between the type attribute and the 
    simpleType element child of attribute elements - if one is present, then 
    the other cannot be, although it is possible for neither to be allowed.
  </doc:p>
  <choice>
    <empty />
    <attribute name="type">
      <data type="QName" />
    </attribute>
    <ref name="localSimpleType" />
  </choice>
</define>

<define name="localAttribute">
  <doc:p>
    This describes attribute elements when used in a local context.  They 
    have an optional use attribute, possibly a fixed or default attribute, 
    and then can either have a ref attribute (referring to a top-level 
    attribute) or a name attribute with an optional form attribute and 
    specifying an attribute type.
  </doc:p>
  <element name="attribute" 
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-attribute">
    <ref name="annotated" />
    <optional>
      <attribute name="use">
        <choice>
          <value type="token">optional</value>
          <value type="token">prohibited</value>
          <value type="token">required</value>
        </choice>
      </attribute>
    </optional>
    <ref name="fixedOrDefault" />
    <choice>
      <attribute name="ref">
        <data type="QName" />
      </attribute>
      <group>
        <attribute name="name">
          <data type="NCName" />
        </attribute>
        <optional>
          <attribute name="form">
            <ref name="formChoice" />
          </attribute>
        </optional>        
        <ref name="attributeType" />
      </group>
    </choice>
  </element>
</define>

<define name="topLevelAttribute">
  <doc:p>
    This describes attribute elements when used at the top level of the 
    schema.  They must have a name, may have a fixed or default attribute, 
    and specify their type through a type attribute or child simpleType 
    element.  The name attribute of each attribute element that appears at 
    the top level of the schema is unique.
  </doc:p>
  <element name="attribute"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-attribute">
    <ref name="annotated" />
    <attribute name="name">
      <data type="NCName" />
    </attribute>
    <ref name="fixedOrDefault" />
    <ref name="attributeType" />
  </element>
</define>

<define name="attrDecls">
  <doc:p>
    This gives the model group for specifying the attributes in a complex 
    type, an extension or restriction.
  </doc:p>
  <zeroOrMore>
    <choice>
      <ref name="localAttribute" />
      <ref name="attributeGroupRef" />
    </choice>
  </zeroOrMore>
  <optional>
    <ref name="anyAttribute" />
  </optional>
</define>

<define name="anyAttribute">
  <doc:p>
    This specifies the anyAttribute wildcard.
  </doc:p>
  <element name="anyAttribute"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-anyAttribute">
    <ref name="wildcard" />
  </element>
</define>

<define name="complexTypeModel">
  <doc:p>
    This specifies the content of a complexType element.  As children, it can 
    have a simpleContent, a complexContent or a model group.  Only if it has 
    one of the latter two, may it have a mixed attribute.  This latter 
    constraint is something that cannot be specified in XML Schema.
  </doc:p>
  <choice>
    <ref name="simpleContent" />
    <group>
      <optional>
        <attribute name="mixed">
          <data type="boolean" />
        </attribute>
      </optional>
      <choice>
        <ref name="complexContent" />
        <group>
          <optional>
            <ref name="typeDefParticle" />
          </optional>
          <ref name="attrDecls" />
        </group>
      </choice>
    </group>
  </choice>
</define>

<define name="complexType">
  <doc:p>
    This specifies the basic content of a complexType element.
  </doc:p>
  <ref name="annotated" />
  <ref name="complexTypeModel" />
</define>

<define name="topLevelComplexType">
  <doc:p>
    This specifies the model for a complexType element at the top level of 
    the schema.  It must have a name, which provides a unique identifier 
    within the type symbol space.  It may have abstract, block and/or final 
    attributes.  Otherwise it is the same as other complexTypes.
  </doc:p>
  <element name="complexType"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-complexType">
    <ref name="complexType" />
    <attribute name="name">
      <data type="NCName" />
    </attribute>
    <zeroOrMore>
      <choice>
        <attribute name="abstract">
          <data type="boolean" />
        </attribute>
        <attribute name="block">
          <ref name="derivationSet" />
        </attribute>
        <attribute name="final">
          <ref name="derivationSet" />
        </attribute>
      </choice>
    </zeroOrMore>
  </element>
</define>

<define name="localComplexType">
  <doc:p>
    This specifies the model for a local complexType element.
  </doc:p>
  <element name="complexType"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-complexType">
    <ref name="complexType" />
  </element>
</define>

<define name="complexRestriction">
  <doc:p>
    This describes a restriction element within a complexContent element 
    (i.e. one that restricts a complex type).  It has a base attribute, may 
    contain a model group and may contain attribute declarations of various 
    sorts.
  </doc:p>
  <element name="restriction"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-complexContent::restriction">
    <ref name="annotated" />
    <attribute name="base">
      <data type="QName" />
    </attribute>
    <optional>
      <ref name="typeDefParticle" />
    </optional>
    <ref name="attrDecls" />
  </element>
</define>

<define name="extensionType">
  <doc:p>
    This specifies the basic model for an extension element: adding a 
    required base attribute to the model used for most components.
  </doc:p>
  <ref name="annotated" />
  <attribute name="base">
    <data type="QName" />
  </attribute>
</define>

<define name="complexExtension">
  <doc:p>
    This describes an extension element within a complexContent element 
    (i.e. one that restricts a complex type).  It may contain a model group 
    and may contain attribute declarations of various sorts.
  </doc:p>
  <element name="extension"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-complexContent::extension">
    <ref name="extensionType" />
    <optional>
      <ref name="typeDefParticle" />
    </optional>
    <ref name="attrDecls" />
  </element>
</define>

<define name="complexContent">
  <doc:p>
    This describes a complexContent element.  It may have a mixed attribute, 
    and either a restriction or extension element as content.
  </doc:p>
  <element name="complexContent"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-complexContent">
    <ref name="annotated" />
    <optional>
      <attribute name="mixed">
        <data type="boolean" />
      </attribute>
    </optional>
    <choice>
      <ref name="complexRestriction" />
      <ref name="complexExtension" />
    </choice>
  </element>
</define>

<define name="simpleRestriction">
  <doc:p>
    This describes a restriction element that appears within a simpleContent 
    or simpleType element (i.e. one that restricts a simple type).  Its 
    content follows the simple restriction model that is detailed below, and 
    may include attribute declarations.
  </doc:p>
  <element name="restriction"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-simpleContent::restriction">
    <ref name="annotated" />
    <ref name="simpleRestrictionModel" />
    <ref name="attrDecls" />
  </element>
</define>

<define name="simpleExtension">
  <doc:p>
    This describes an extension element that appears within a simpleContent 
    element (i.e. one that extends a simple type).  Like other extensions, it 
    has a base type, but it can only be used to add attributes.
  </doc:p>
  <element name="extension"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-simpleContent::extension">
    <ref name="extensionType" />
    <ref name="attrDecls" />
  </element>
</define>

<define name="simpleContent">
  <doc:p>
    This describes a simpleContent element, whose content can either hold a 
    restriction or extension element.
  </doc:p>
  <element name="simpleContent"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-simpleContent">
    <ref name="annotated" />
    <choice>
      <ref name="simpleRestriction" />
      <ref name="simpleExtension" />
    </choice>
  </element>
</define>

<define name="blockSet">
  <doc:p>
    This gives the possible values for block attributes on element elements, 
    which includes substitution amongst the list of possible values.  This 
    RELAX NG schema, like the XML Schema Recommendation, allows each of the 
    keywords 'extension', 'restriction' and 'substitution' to occur more than 
    once within the list.
  </doc:p>
  <choice>
    <value type="token">#all</value>
    <list>
      <zeroOrMore>
        <choice>
          <value>extension</value>
          <value>restriction</value>
          <value>substitution</value>
        </choice>
      </zeroOrMore>
    </list>
  </choice>
</define>

<define name="element">
  <doc:p>
    This describes the basic content model of an element element.  It is 
    annotated, may have a fixed or default attribute, and may have nillable 
    and/or block attributes.  Its type may be specified through a type 
    attribute, a local simple type or a local complex type - the choice 
    between these methods is something that cannot be indicated with XML 
    Schema.  This content is optionally followed by some identify constraints.
  </doc:p>
  <ref name="annotated" />
  <ref name="fixedOrDefault" />
  <zeroOrMore>
    <choice>
      <attribute name="nillable">
        <data type="boolean" />
      </attribute>
      <attribute name="block">
        <ref name="blockSet" />
      </attribute>
    </choice>
  </zeroOrMore>
  <choice>
    <empty />
    <attribute name="type">
      <data type="QName" />
    </attribute>
    <ref name="localSimpleType" />
    <ref name="localComplexType" />
  </choice>
  <zeroOrMore>
    <ref name="identityConstraint" />
  </zeroOrMore>
</define>

<define name="topLevelElement">
  <doc:p>
    This describes an element element that appears at the top level of the 
    schema.  On top of the basic content for an element element, it has to 
    have a name, which is a unique identifier in the element symbol space.  It 
    may have substitutionGroup, abstract and/or final attributes.
  </doc:p>
  <element name="element"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-element">
    <ref name="element" />
    <attribute name="name">
      <data type="NCName" />
    </attribute>
    <zeroOrMore>
      <choice>
        <attribute name="substitutionGroup">
          <data type="QName" />
        </attribute>
        <attribute name="abstract">
          <data type="boolean" />
        </attribute>
        <attribute name="final">
          <ref name="derivationSet" />
        </attribute>
      </choice>
    </zeroOrMore>
  </element>
</define>

<define name="localElement">
  <doc:p>
    This describes an element element that appears locally, within a 
    complexType or group element.  It may have minOccurs and/or maxOccurs 
    attributes.  If it has a ref attribute, then that&apos;s all it can 
    have.  Otherwise, it must have a name and specifies its type in the same 
    way as the basic element content model described above.  It may in this 
    case also have a form element.  These constraints on local elements 
    cannot be described within XML Schema.
  </doc:p>
  <element name="element"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-element">
    <ref name="occurs" />
    <choice>
      <attribute name="ref">
        <data type="QName" />
      </attribute>
      <group>
        <ref name="element" />
        <attribute name="name">
          <data type="NCName" />
        </attribute>
        <optional>
          <attribute name="form">
            <ref name="formChoice" />
          </attribute>
        </optional>
      </group>
    </choice>
  </element>
</define>

<define name="namedGroup">
  <doc:p>
    This describes an group element that appears at the top level of the 
    schema.  It must have a name attribute, and must have one of an all, 
    choice or sequence element child.
  </doc:p>
  <element name="group"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-group">
    <ref name="annotated" />
    <attribute name="name">
      <data type="NCName" />
    </attribute>
    <choice>
      <element name="all">
        <ref name="allModel" />
      </element>
      <element name="choice">
        <ref name="simpleExplicitGroup" />
      </element>
      <element name="sequence">
        <ref name="simpleExplicitGroup" />
      </element>
    </choice>
  </element>
</define>

<define name="groupRef">
  <doc:p>
    This describes group element that occurs locally, referring to a 
    top-level named group.  It may have occurrence attributes, and must have 
    a ref attribute.
  </doc:p>
  <element name="group"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-group">
    <ref name="annotated" />
    <ref name="occurs" />
    <attribute name="ref">
      <data type="QName" />
    </attribute>
  </element>
</define>

<define name="explicitGroup">
  <doc:p>
    This gives the content of a model group (not a group element) in the 
    normal run of things.  It has occurrence attributes and any number of 
    particles within it.
  </doc:p>
  <ref name="annotated" />
  <ref name="occurs" />
  <zeroOrMore>
    <ref name="nestedParticle" />
  </zeroOrMore>
</define>

<define name="simpleExplicitGroup">
  <doc:p>
    This gives the content of a model group (not a group element) within a 
    named group - it differs from the above in that it doesn&apos;t have any 
    occurrence attributes.
  </doc:p>
  <ref name="annotated" />
  <zeroOrMore>
    <ref name="nestedParticle" />
  </zeroOrMore>
</define>

<define name="allModel">
  <doc:p>
    This gives the content of an all element.  It contains element elements 
    that are similar to local element elements, but the minOccurs and 
    maxOccurs attributes can only take values of 0 or 1.
  </doc:p>
  <ref name="annotated" />
  <zeroOrMore>
    <element name="element">
      <zeroOrMore>
        <choice>
          <attribute name="minOccurs">
            <choice>
              <value type="nonNegativeInteger">0</value>
              <value type="nonNegativeInteger">1</value>
            </choice>
          </attribute>
          <attribute name="maxOccurs">
            <choice>
              <value type="nonNegativeInteger">0</value>
              <value type="nonNegativeInteger">1</value>
            </choice>
          </attribute>
        </choice>
      </zeroOrMore>
      <choice>
        <attribute name="ref">
          <data type="QName" />
        </attribute>
        <group>
          <ref name="element" />
          <attribute name="name">
            <data type="NCName" />
          </attribute>
          <optional>
            <attribute name="form">
              <ref name="formChoice" />
            </attribute>
          </optional>
        </group>
      </choice>
    </element>
  </zeroOrMore>
</define>

<define name="all">
  <doc:p>
    This describes an all element that appears outside a named group (i.e. as 
    the content of a complexType element).  It has the standard model for an 
    all element, but adds minOccurs and maxOccurs attributes which can only 
    take certain values.
  </doc:p>
  <element name="all"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-all">
    <ref name="allModel" />
    <zeroOrMore>
      <choice>
        <attribute name="minOccurs">
          <choice>
            <value type="nonNegativeInteger">0</value>
            <value type="nonNegativeInteger">1</value>
          </choice>
        </attribute>
        <attribute name="maxOccurs">
          <value type="nonNegativeInteger">1</value>
        </attribute>
      </choice>
    </zeroOrMore>
  </element>
</define>

<define name="choice">
  <doc:p>
    This describes a choice element that appears outside a named group.
  </doc:p>
  <element name="choice"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-choice">
    <ref name="explicitGroup" />
  </element>
</define>

<define name="sequence">
  <doc:p>
    This describes a sequence element that appears outside a named group.
  </doc:p>
  <element name="sequence"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-sequence">
    <ref name="explicitGroup" />
  </element>
</define>

<define name="wildcard">
  <doc:p>
    This describes a wildcard element (i.e. any or anyAttribute).  The 
    namespace attribute can take a list URIs interspersed with the keywords 
    '##targetNamespace' and/or '##local'.  This RELAX NG schema, like the XML 
    Schema Recommendation, allows the keywords to be specified more than once 
    each within the list, if they&apos;re given.  This model also specifies the 
    processContents attribute.
  </doc:p>
  <ref name="annotated" />
  <zeroOrMore>
    <choice>
      <attribute name="namespace">
        <choice>
          <value type="token">##any</value>
          <value type="token">##other</value>
          <list>
            <zeroOrMore>
              <choice>
                <data type="anyURI" />
                <value>##targetNamespace</value>
                <value>##local</value>
              </choice>
            </zeroOrMore>
          </list>
        </choice>
      </attribute>
      <attribute name="processContents">
        <choice>
          <value type="token">lax</value>
          <value type="token">skip</value>
          <value type="token">strict</value>
        </choice>
      </attribute>
    </choice>
  </zeroOrMore>
</define>

<define name="any">
  <doc:p>
    This describes an any element as a wildcard.
  </doc:p>
  <element name="any"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-any">
    <ref name="wildcard" />
    <ref name="occurs" />
  </element>
</define>

<define name="namedAttributeGroup">
  <doc:p>
    This describes an attributeGroup element as it appears at the top level 
    of the schema.  It must have a name attribute, and then contains 
    attribute declarations.
  </doc:p>
  <element name="attributeGroup"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-attributeGroup">
    <ref name="annotated" />
    <attribute name="name">
      <data type="NCName" />
    </attribute>
    <ref name="attrDecls" />
  </element>
</define>

<define name="attributeGroupRef">
  <doc:p>
    This describes an attributeGroup element as it appears within a complex 
    type.  It must have a ref attribute.
  </doc:p>
  <element name="attributeGroup"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-attributeGroup">
    <ref name="annotated" />
    <attribute name="ref">
      <data type="QName" />
    </attribute>
  </element>
</define>

<define name="include">
  <doc:p>
    This describes an include element, which must have a schemaLocation 
    attribute.
  </doc:p>
  <element name="include"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-include">
    <ref name="annotated" />
    <attribute name="schemaLocation">
      <data type="anyURI" />
    </attribute>
  </element>
</define>

<define name="redefine">
  <doc:p>
    This describes a redefine element, which must have a schemaLocation 
    attribute and can then contain any mix of annotations and redefinable 
    components.
  </doc:p>
  <element name="redefine"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-redefine">
    <ref name="openAttrs" />
    <optional>
      <attribute name="id">
        <data type="ID" />
      </attribute>
    </optional>
    <attribute name="schemaLocation">
      <data type="anyURI" />
    </attribute>
    <zeroOrMore>
      <choice>
        <ref name="annotation" />
        <ref name="redefinable" />
      </choice>
    </zeroOrMore>
  </element>
</define>

<define name="import">
  <doc:p>
    This gives the basic model for an import element - an optional 
    schemaLocation attribute.
  </doc:p>
  <ref name="annotated" />
  <optional>
    <attribute name="schemaLocation">
      <data type="anyURI" />
    </attribute>
  </optional>
</define>

<define name="importRequiredNamespace">
  <doc:p>
    This describes an import element that&apos;s used when its parent schema 
    element doesn&apos;t specify a targetNamespace.  In these cases, the 
    import element must give a namespace attribute.
  </doc:p>
  <element name="import"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-import">
    <ref name="import" />
    <attribute name="namespace">
      <data type="anyURI" />
    </attribute>
  </element>
</define>

<define name="importOptionalNamespace">
  <doc:p>
    This describes an import element that&apos;s used when its parent schema 
    element specifies a targetNamespace.  In these cases, the namespace 
    attribute on the import element is optional.
  </doc:p>
  <element name="import"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-import">
    <ref name="import" />
    <optional>
      <attribute name="namespace">
        <data type="anyURI" />
      </attribute>
    </optional>
  </element>
</define>

<define name="selector">
  <doc:p>
    This describes a selector element.  The xpath attribute is a simplified 
    XPath - the regular expression given here is the one from the XML Schema 
    for XML Schema.
  </doc:p>
  <element name="selector"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-selector">
    <ref name="annotated" />
    <attribute name="xpath">
      <data type="token">
        <param name="pattern">(\.//)?(((child::)?((\i\c*:)?(\i\c*|\*)))|\.)(/(((child::)?((\i\c*:)?(\i\c*|\*)))|\.))*(\|(\.//)?(((child::)?((\i\c*:)?(\i\c*|\*)))|\.)(/(((child::)?((\i\c*:)?(\i\c*|\*)))|\.))*)*</param>
      </data>
    </attribute>
  </element>
</define>

<define name="field">
  <doc:p>
    This describes a field element.  The xpath attribute is a simplified 
    XPath - the regular expression given here is the one from the XML Schema 
    for XML Schema.
  </doc:p>
  <element name="field"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-field">
    <ref name="annotated" />
    <attribute name="xpath">
      <data type="token">
        <param name="pattern">(\.//)?((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)/)*((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)|((attribute::|@)((\i\c*:)?(\i\c*|\*))))(\|(\.//)?((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)/)*((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)|((attribute::|@)((\i\c*:)?(\i\c*|\*)))))*</param>
      </data>
    </attribute>
  </element>
</define>

<define name="keybase">
  <doc:p>
    This gives the basic content for identity constraints - a name attribute 
    that uniquely identifies the identity constraint, a selector element and 
    one or more field elements.
  </doc:p>
  <ref name="annotated" />
  <attribute name="name">
    <data type="NCName" />
  </attribute>
  <ref name="selector" />
  <oneOrMore>
    <ref name="field" />
  </oneOrMore>
</define>

<define name="identityConstraint">
  <doc:p>
    This gives a model group for the three identity constraint elements, used 
    within the content of element elements.
  </doc:p>
  <choice>
    <ref name="unique" />
    <ref name="key" />
    <ref name="keyref" />
  </choice>
</define>

<define name="unique">
  <doc:p>
    This describes a unique element.
  </doc:p>
  <element name="unique"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-unique">
    <ref name="keybase" />
  </element>  
</define>

<define name="key">
  <doc:p>
    This describes a key element.
  </doc:p>
  <element name="key"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-key">
    <ref name="keybase" />
  </element>
</define>

<define name="keyref">
  <doc:p>
    This describes a keyref element.
  </doc:p>
  <element name="keyref"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-keyref">
    <ref name="keybase" />
    <attribute name="refer">
      <data type="QName" />
    </attribute>
  </element>
</define>

<define name="notation">
  <doc:p>
    This describes a notation element.  The names of notation elements are 
    unique in the notation symbol space.  The public attribute is required, 
    and the system attribute is optional.
  </doc:p>
  <element name="notation"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-notation">
    <ref name="annotated" />
    <attribute name="name">
      <data type="NCName" />
    </attribute>
    <attribute name="public">
      <data type="token" />
    </attribute>
    <optional>
      <attribute name="system">
        <data type="anyURI" />
      </attribute>
    </optional>
  </element>
</define>

<define name="appinfoContent">
  <doc:p>
    This is designed to describe the content of the appinfo elements in the 
    schema.  At the moment this allows any mixed content without validation.  
    Note that this is fairly complex compared to the XML Schema equivalent, 
    which would be a single any element.
  </doc:p>
  <ref name="anyContent" />
</define>

<define name="anyContent">
  <mixed>
    <zeroOrMore>
      <element>
        <anyName>
          <except>
            <nsName ns="http://www.w3.org/2001/XMLSchema" />
          </except>
        </anyName>
        <zeroOrMore>
          <attribute>
            <anyName />
          </attribute>
        </zeroOrMore>
        <ref name="anyContent" />
        <empty />
      </element>
    </zeroOrMore>
  </mixed>
</define>

<define name="appinfo">
  <doc:p>
    This describes an appinfo element.  It has an optional source attribute 
    and can currently contain anything at all.
  </doc:p>
  <element name="appinfo"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-appinfo">
    <optional>
      <attribute name="source">
        <data type="anyURI" />
      </attribute>
    </optional>
    <ref name="appinfoContent" />
  </element>
</define>

<define name="documentationContent">
  <doc:p>
    This is designed to describe the content of the documentation elements in 
    the schema.  At the moment this allows any mixed content without 
    validation.  Note that this is fairly complex compared to the XML Schema 
    equivalent, which would be a single any element.
  </doc:p>
  <ref name="anyContent" />
</define>

<define name="documentation">
  <doc:p>
    This describes a documentation element.  It has optional source 
    and xml:lang attributes and can currently contain anything at all.
  </doc:p>
  <element name="documentation"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-documentation">
    <zeroOrMore>
      <choice>
        <attribute name="source">
          <data type="anyURI" />
        </attribute>
        <attribute name="xml:lang">
          <data type="language" />
        </attribute>
      </choice>
    </zeroOrMore>
    <ref name="documentationContent" />
  </element>
</define>

<define name="annotation">
  <doc:p>
    This describes an annotation element.  It can have any attributes, may 
    have an id attribute, and contains any number of documentation or appinfo 
    elements.
  </doc:p>
  <element name="annotation"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-annotation">
    <ref name="openAttrs" />
    <optional>
      <attribute name="id">
        <data type="ID" />
      </attribute>
    </optional>
    <zeroOrMore>
      <choice>
        <ref name="documentation" />
        <ref name="appinfo" />
      </choice>
    </zeroOrMore>
  </element>
</define>

<define name="simpleDerivation">
  <doc:p>
    This gives the various types of derivation of simple types.
  </doc:p>
  <choice>
    <ref name="simpleRestriction" />
    <ref name="list" />
    <ref name="union" />
  </choice>
</define>

<define name="simpleDerivationSet">
  <doc:p>
    This specifies the values of the final attribute for simple types.  This 
    RELAX NG schema for XML Schema, like the XML Schema Recommendation, allows 
    the keywords 'list', 'union' and 'restriction' to appear more than once 
    within the list.
  </doc:p>
  <choice>
    <value type="token">#all</value>
    <list>
      <zeroOrMore>
        <choice>
          <value>list</value>
          <value>union</value>
          <value>restriction</value>
        </choice>
      </zeroOrMore>
    </list>
  </choice>
</define>

<define name="simpleType">
  <doc:p>
    This gives the basic content of a simple type.
  </doc:p>
  <ref name="annotated" />
  <ref name="simpleDerivation" />
</define>

<define name="topLevelSimpleType">
  <doc:p>
    This describes a simpleType element as it appears at the top level of the 
    schema.  It has to have a name attribute and may have a final attribute.
  </doc:p>
  <element name="simpleType"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-simpleType">
    <ref name="simpleType" />
    <attribute name="name">
      <data type="NCName" />
    </attribute>
    <optional>
      <attribute name="final">
        <ref name="simpleDerivationSet" />
      </attribute>
    </optional>
  </element>
</define>

<define name="localSimpleType">
  <doc:p>
    This describes a simpleType element as it appears within an attribute or
    element.
  </doc:p>
  <element name="simpleType"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-simpleType">
    <ref name="simpleType" />
  </element>
</define>

<define name="rangeFacets">
  <doc:p>
    This describes the relationship between the various range facets.  Only 
    one of minExclusive and minInclusive can be present, and only one of 
    maxExclusive and maxInclusive can be present.  This is a constraint that 
    can&apos;t easily be expressed using XML Schema.  This RELAX NG schema 
    for XML Schema is a little more restrictive than the XML Schema 
    Recommendation in that it also forces there to be a maximum of one of 
    each of these types of facets.
  </doc:p>
  <interleave>
    <optional>
      <choice>
        <ref name="minExclusive" />
        <ref name="minInclusive" />
      </choice>
    </optional>    
    <optional>
      <choice>
        <ref name="maxExclusive" />
        <ref name="maxInclusive" />
      </choice>
    </optional>
  </interleave>
</define>

<define name="digitFacets">
  <doc:p>
    This specifies optional totalDigits and fractionDigits elements.  This 
    RELAX NG schema for XML Schema is a little more restrictive than the XML 
    Schema Recommendation in that it also forces there to be a maximum of one 
    of each of these types of facets.
  </doc:p>
  <optional>
    <ref name="totalDigits" />
  </optional>
  <optional>
    <ref name="fractionDigits" />
  </optional>
</define>

<define name="lengthFacets">
  <doc:p>
    This specifies optional length, minLength and maxLength elements.  This 
    RELAX NG schema for XML Schema is a little more restrictive than the XML 
    Schema Recommendation in that it also forces there to be a maximum of one 
    of each of these types of facets, and says that if a length element is 
    given, then neither minLength nor maxLength should be present.
  </doc:p>
  <choice>
    <ref name="length" />
    <interleave>
      <optional>
        <ref name="minLength" />
      </optional>
      <optional>
        <ref name="maxLength" />        
      </optional>
    </interleave>
  </choice>
</define>

<define name="commonFacets">
  <doc:p>
    This specifies zero or more enumeration or pattern elements and an 
    optional whiteSpace element.  This RELAX NG schema for XML Schema is a 
    little more restrictive than the XML Schema Recommendation in that it 
    also forces there to be a maximum of one whiteSpace element within the 
    facets.  Note that the whiteSpace facet is constrained to have a value of 
    'collapse'.
  </doc:p>
  <zeroOrMore>
    <ref name="enumeration" />
  </zeroOrMore>
  <optional>
    <ref name="whiteSpaceCollapse" />
  </optional>
  <zeroOrMore>
    <ref name="pattern" />
  </zeroOrMore>
</define>

<define name="simpleRestrictionModel">
  <doc:p>
    This specifies the types of facets that are valid in restrictions on the 
    built-in data types.  This can only perform rudimentary checking, but 
    should be enough in most circumstances.  Note that for xs:anySimpleType 
    and xs:string, the whiteSpace facet can take any value, for 
    xs:normalizedString it can be 'replace' or 'collapse', and for all other 
    built-in types it has to be 'collapse'.
  </doc:p>
  <choice>
    <group>
      <attribute name="base">
        <value type="QName">xs:anySimpleType</value>
      </attribute>
      <interleave>
        <ref name="rangeFacets" />
        <ref name="digitFacets" />
        <ref name="lengthFacets" />
        <optional>
          <ref name="whiteSpace" />
        </optional>
        <zeroOrMore>
          <ref name="enumeration" />
        </zeroOrMore>
        <zeroOrMore>
          <ref name="pattern" />
        </zeroOrMore>
      </interleave>
    </group>
    <group>
      <attribute name="base">
        <value type="QName">xs:string</value>
      </attribute>
      <interleave>
        <ref name="lengthFacets" />
        <optional>
          <ref name="whiteSpace" />
        </optional>
        <zeroOrMore>
          <ref name="enumeration" />
        </zeroOrMore>
        <zeroOrMore>
          <ref name="pattern" />
        </zeroOrMore>
      </interleave>
    </group>
    <group>
      <attribute name="base">
        <choice>
          <value type="QName">xs:normalizedString</value>
        </choice>
      </attribute>
      <interleave>
        <ref name="lengthFacets" />
        <optional>
          <ref name="whiteSpaceReplaceOrCollapse" />
        </optional>
        <zeroOrMore>
          <ref name="enumeration" />
        </zeroOrMore>
        <zeroOrMore>
          <ref name="pattern" />
        </zeroOrMore>
      </interleave>
    </group>
    <group>
      <attribute name="base">
        <choice>
          <value type="QName">xs:token</value>
          <value type="QName">xs:language</value>
          <value type="QName">xs:Name</value>
          <value type="QName">xs:NCName</value>
          <value type="QName">xs:ID</value>
          <value type="QName">xs:IDREF</value>
          <value type="QName">xs:IDREFS</value>
          <value type="QName">xs:NMTOKEN</value>
          <value type="QName">xs:NMTOKENS</value>
          <value type="QName">xs:ENTITY</value>
          <value type="QName">xs:ENTITIES</value>
          <value type="QName">xs:hexBinary</value>
          <value type="QName">xs:base64Binary</value>
          <value type="QName">xs:anyURI</value>
          <value type="QName">xs:QName</value>
          <value type="QName">xs:NOTATION</value>
        </choice>
      </attribute>
      <interleave>
        <ref name="lengthFacets" />
        <ref name="commonFacets" />
      </interleave>
    </group>
    <group>
      <attribute name="base">
        <value type="QName">xs:boolean</value>
      </attribute>
      <interleave>
        <optional>
          <ref name="whiteSpaceCollapse" />
        </optional>
        <zeroOrMore>
          <ref name="pattern" />
        </zeroOrMore>
      </interleave>
    </group>
    <group>
      <attribute name="base">
        <choice>
          <value type="QName">xs:decimal</value>
          <value type="QName">xs:integer</value>
          <value type="QName">xs:nonPositiveInteger</value>
          <value type="QName">xs:nonNegativeInteger</value>
          <value type="QName">xs:positiveInteger</value>
          <value type="QName">xs:negativeInteger</value>
          <value type="QName">xs:unsignedLong</value>
          <value type="QName">xs:unsignedInt</value>
          <value type="QName">xs:unsignedShort</value>
          <value type="QName">xs:unsignedByte</value>
          <value type="QName">xs:long</value>
          <value type="QName">xs:int</value>
          <value type="QName">xs:short</value>
          <value type="QName">xs:byte</value>
        </choice>
      </attribute>
      <interleave>
        <ref name="digitFacets" />
        <ref name="rangeFacets" />
        <ref name="commonFacets" />
      </interleave>
    </group>
    <group>
      <attribute name="base">
        <choice>
          <value type="QName">xs:float</value>
          <value type="QName">xs:double</value>
          <value type="QName">xs:duration</value>
          <value type="QName">xs:dateTime</value>
          <value type="QName">xs:time</value>
          <value type="QName">xs:date</value>
          <value type="QName">xs:gYearMonth</value>
          <value type="QName">xs:gYear</value>
          <value type="QName">xs:gMonthDay</value>
          <value type="QName">xs:gMonth</value>
          <value type="QName">xs:gDay</value>
        </choice>
      </attribute>
      <interleave>
        <ref name="rangeFacets" />
        <ref name="commonFacets" />
      </interleave>
    </group>
    <!-- the detailed checking above is superfluous
        until there's a way to do 'difference'
        within attribute values, because it will
        always match the following -->
    <group>
      <choice>
        <attribute name="base">
          <data type="QName" />
        </attribute>
        <ref name="localSimpleType" />
      </choice>
      <interleave>
        <ref name="rangeFacets" />
        <ref name="digitFacets" />
        <ref name="lengthFacets" />
        <optional>
          <ref name="whiteSpace" />
        </optional>
        <zeroOrMore>
          <ref name="enumeration" />
        </zeroOrMore>
        <zeroOrMore>
          <ref name="pattern" />
        </zeroOrMore>
      </interleave>
    </group>
  </choice>
</define>

<define name="list">
  <doc:p>
    This describes a list element.  It can either specify a local simple type 
    or have a itemType attribute.  This constraint cannot be expressed in XML 
    Schema.
  </doc:p>
  <element name="list"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-list">
    <ref name="annotated" />
    <choice>      
      <ref name="localSimpleType" />
      <attribute name="itemType">
        <data type="QName" />
      </attribute>
    </choice>
  </element>
</define>

<define name="union">
  <doc:p>
    This describes a union element.  If the memberTypes attribute is missing 
    or empty, then it must contain one or more simpleType elements; if 
    it&apos;s present, then it can contain simpleType elements or list simple 
    types in the memberTypes attribute.  This constraint cannot be expressed 
    in XML Schema.
  </doc:p>
  <element name="union"
        doc:href="http://www.w3.org/TR/xmlschema-1/#element-union">
    <ref name="annotated" />
    <choice>
      <group>
        <attribute name="memberTypes">
          <list>
            <oneOrMore>
              <data type="QName" />
            </oneOrMore>
          </list>
        </attribute>
        <zeroOrMore>
          <ref name="localSimpleType" />
        </zeroOrMore>
      </group>
      <group>
        <optional>
          <attribute name="memberTypes">
            <empty />
          </attribute>
        </optional>
        <oneOrMore>
          <ref name="localSimpleType" />
        </oneOrMore>
      </group>
    </choice>
  </element>
</define>

<define name="facet">
  <doc:p>
    This is the basic content of a facet.  It has an optional fixed attribute.
  </doc:p>
  <ref name="annotated" />
  <optional>
    <attribute name="fixed">
      <data type="boolean" />
    </attribute>
  </optional>
</define>

<define name="noFixedFacet">
  <doc:p>
    This is the content of a facet that cannot be fixed (enumeration or 
    pattern).  It has a value attribute that can take any kind of value.
  </doc:p>
  <ref name="annotated" />
  <attribute name="value" />
</define>

<define name="rangeFacet">
  <doc:p>
    This is the content of a range facet.  The value must be one of the data 
    types shown (as these are the only types of data that accept ranges).  I 
    haven&apos;t gone so far as to indicate the data type of the value 
    attribute of a range facet according to the base type as this would be 
    very complicated (although it would be possible in RELAX NG).
  </doc:p>
  <ref name="facet" />
  <attribute name="value">
    <choice>
      <data type="decimal" />
      <data type="float" />
      <data type="double" />
      <data type="duration" />
      <data type="dateTime" />
      <data type="time" />
      <data type="date" />
      <data type="gYearMonth" />
      <data type="gYear" />
      <data type="gMonthDay" />
      <data type="gMonth" />
      <data type="gDay" />
    </choice>
  </attribute>
</define>

<define name="minExclusive">
  <doc:p>
    This describes a minExclusive element.
  </doc:p>
  <element name="minExclusive"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-minExclusive">
    <ref name="rangeFacet" />
  </element>
</define>

<define name="minInclusive">
  <doc:p>
    This describes a minInclusive element.
  </doc:p>
  <element name="minInclusive"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-minInclusive">
    <ref name="rangeFacet" />
  </element>
</define>

<define name="maxExclusive">
  <doc:p>
    This describes a maxExclusive element.
  </doc:p>
  <element name="maxExclusive"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-maxExclusive">
    <ref name="rangeFacet" />
  </element>
</define>

<define name="maxInclusive">
  <doc:p>
    This describes a maxInclusive element.
  </doc:p>
  <element name="maxInclusive"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-maxInclusive">
    <ref name="rangeFacet" />
  </element>
</define>

<define name="numFacet">
  <doc:p>
    This is the content of a numerical facet.
  </doc:p>
  <ref name="facet" />
  <attribute name="value">
    <data type="nonNegativeInteger" />
  </attribute>
</define>

<define name="totalDigits">
  <doc:p>
    This describes a totalDigits element.  The value attribute must take a 
    positive integer.
  </doc:p>
  <element name="totalDigits"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-totalDigits">
    <ref name="facet" />
    <attribute name="value">
      <data type="positiveInteger" />
    </attribute>
  </element>
</define>

<define name="fractionDigits">
  <doc:p>
    This describes a fractionDigits element.
  </doc:p>
  <element name="fractionDigits"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-fractionDigits">
    <ref name="numFacet" />
  </element>
</define>

<define name="length">
  <doc:p>
    This describes a length element.
  </doc:p>
  <element name="length"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-length">
    <ref name="numFacet" />
  </element>
</define>

<define name="minLength">
  <doc:p>
    This describes a minLength element.
  </doc:p>
  <element name="minLength"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-minLength">
    <ref name="numFacet" />
  </element>
</define>

<define name="maxLength">
  <doc:p>
    This describes a maxLength element.
  </doc:p>
  <element name="maxLength"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-maxLength">
    <ref name="numFacet" />
  </element>
</define>

<define name="enumeration">
  <doc:p>
    This describes an enumeration element.
  </doc:p>
  <element name="enumeration"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-enumeration">
    <ref name="noFixedFacet" />
  </element>
</define>

<define name="whiteSpace">
  <doc:p>
    This describes a whiteSpace element that can take any of the permitted 
    values.
  </doc:p>
  <element name="whiteSpace"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-whiteSpace">
    <ref name="facet" />
    <attribute name="value">
      <choice>
        <value type="token">preserve</value>
        <value type="token">replace</value>
        <value type="token">collapse</value>
      </choice>
    </attribute>
  </element>
</define>

<define name="whiteSpaceReplaceOrCollapse">
  <doc:p>
    This describes a whiteSpace element that can only take the values 
    'replace' or 'collapse'.
  </doc:p>
  <element name="whiteSpace"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-whiteSpace">
    <ref name="facet" />
    <attribute name="value">
      <choice>
        <value type="token">replace</value>
        <value type="token">collapse</value>
      </choice>
    </attribute>
  </element>
</define>

<define name="whiteSpaceCollapse">
  <doc:p>
    This describes a whiteSpace element that can only take the value 
    'collapse'.
  </doc:p>
  <element name="whiteSpace"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-whiteSpace">
    <ref name="facet" />
    <attribute name="value">
      <value type="token">collapse</value>
    </attribute>
  </element>
</define>

<define name="pattern">
  <doc:p>
    This describes a pattern element.
  </doc:p>
  <element name="pattern"
        doc:href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/datatypes.html#element-pattern">
    <ref name="noFixedFacet" />
  </element>
</define>

</grammar>