<grammar datatypeLibrary=“www.w3.org/2001/XMLSchema-datatypes

ns="http://relaxng.org/ns/structure/1.0"
xmlns="http://relaxng.org/ns/structure/1.0">

<start>
  <ref name="pattern"/>
</start>

<define name="pattern">
  <choice>
    <element name="element">
      <choice>
        <attribute name="name">
          <data type="QName"/>
        </attribute>
        <ref name="open-name-class"/>
      </choice>
      <ref name="common-atts"/>
      <ref name="open-patterns"/>
    </element>
    <element name="attribute">
      <ref name="common-atts"/>
      <choice>
        <attribute name="name">
          <data type="QName"/>
        </attribute>
        <ref name="open-name-class"/>
      </choice>
      <interleave>
        <ref name="other"/>
        <optional>
          <ref name="pattern"/>
        </optional>
      </interleave>
    </element>
    <element name="group">
      <ref name="common-atts"/>
      <ref name="open-patterns"/>
    </element>
    <element name="interleave">
      <ref name="common-atts"/>
      <ref name="open-patterns"/>
    </element>
    <element name="choice">
      <ref name="common-atts"/>
      <ref name="open-patterns"/>
    </element>
    <element name="optional">
      <ref name="common-atts"/>
      <ref name="open-patterns"/>
    </element>
    <element name="zeroOrMore">
      <ref name="common-atts"/>
      <ref name="open-patterns"/>
    </element>
    <element name="oneOrMore">
      <ref name="common-atts"/>
      <ref name="open-patterns"/>
    </element>
    <element name="list">
      <ref name="common-atts"/>
      <ref name="open-patterns"/>
    </element>
    <element name="mixed">
      <ref name="common-atts"/>
      <ref name="open-patterns"/>
    </element>
    <element name="ref">
      <attribute name="name">
        <data type="NCName"/>
      </attribute>
      <ref name="common-atts"/>
      <ref name="other"/>
    </element>
    <element name="parentRef">
      <attribute name="name">
        <data type="NCName"/>
      </attribute>
      <ref name="common-atts"/>
      <ref name="other"/>
    </element>
    <element name="empty">
      <ref name="common-atts"/>
      <ref name="other"/>
    </element>
    <element name="text">
      <ref name="common-atts"/>
      <ref name="other"/>
    </element>
    <element name="value">
      <optional>
        <attribute name="type">
          <data type="NCName"/>
        </attribute>
      </optional>
      <ref name="common-atts"/>
      <text/>
    </element>
    <element name="data">
      <attribute name="type">
        <data type="NCName"/>
      </attribute>
      <ref name="common-atts"/>
      <interleave>
        <ref name="other"/>
        <group>
          <zeroOrMore>
            <element name="param">
              <attribute name="name">
                <data type="NCName"/>
              </attribute>
              <ref name="common-atts"/>
              <text/>
            </element>
          </zeroOrMore>
          <optional>
            <element name="except">
              <ref name="common-atts"/>
              <ref name="open-patterns"/>
            </element>
          </optional>
        </group>
      </interleave>
    </element>
    <element name="notAllowed">
      <ref name="common-atts"/>
      <ref name="other"/>
    </element>
    <element name="externalRef">
      <attribute name="href">
        <data type="anyURI"/>
      </attribute>
      <ref name="common-atts"/>
      <ref name="other"/>
    </element>
    <element name="grammar">
      <ref name="common-atts"/>
      <ref name="grammar-content"/>
    </element>
  </choice>
</define>

<define name="grammar-content">
  <interleave>
    <ref name="other"/>
    <zeroOrMore>
      <choice>
        <ref name="start-element"/>
        <ref name="define-element"/>
        <element name="div">
          <ref name="common-atts"/>
          <ref name="grammar-content"/>
        </element>
        <element name="include">
          <attribute name="href">
            <data type="anyURI"/>
          </attribute>
          <ref name="common-atts"/>
          <ref name="include-content"/>
        </element>
      </choice>
    </zeroOrMore>
  </interleave>
</define>

<define name="include-content">
  <interleave>
    <ref name="other"/>
    <zeroOrMore>
      <choice>
        <ref name="start-element"/>
        <ref name="define-element"/>
        <element name="div">
          <ref name="common-atts"/>
          <ref name="include-content"/>
        </element>
      </choice>
    </zeroOrMore>
  </interleave>
</define>

<define name="start-element">
  <element name="start">
    <ref name="combine-att"/>
    <ref name="common-atts"/>
    <ref name="open-pattern"/>
  </element>
</define>

<define name="define-element">
  <element name="define">
    <attribute name="name">
      <data type="NCName"/>
    </attribute>
    <ref name="combine-att"/>
    <ref name="common-atts"/>
    <ref name="open-patterns"/>
  </element>
</define>

<define name="combine-att">
  <optional>
    <attribute name="combine">
      <choice>
        <value>choice</value>
        <value>interleave</value>
      </choice>
    </attribute>
  </optional>
</define>

<define name="open-patterns">
  <interleave>
    <ref name="other"/>
    <oneOrMore>
      <ref name="pattern"/>
    </oneOrMore>
  </interleave>
</define>

<define name="open-pattern">
  <interleave>
    <ref name="other"/>
    <ref name="pattern"/>
  </interleave>
</define>

<define name="name-class">
  <choice>
    <element name="name">
      <ref name="common-atts"/>
      <data type="QName"/>
    </element>
    <element name="anyName">
      <ref name="common-atts"/>
      <ref name="except-name-class"/>
    </element>
    <element name="nsName">
      <ref name="common-atts"/>
      <ref name="except-name-class"/>
    </element>
    <element name="choice">
      <ref name="common-atts"/>
      <ref name="open-name-classes"/>
    </element>
  </choice>
</define>

<define name="except-name-class">
  <interleave>
    <ref name="other"/>
    <optional>
      <element name="except">
        <ref name="open-name-classes"/>
      </element>
    </optional>
  </interleave>
</define>

<define name="open-name-classes">
  <interleave>
    <ref name="other"/>
    <oneOrMore>
      <ref name="name-class"/>
    </oneOrMore>
  </interleave>
</define>

<define name="open-name-class">
  <interleave>
    <ref name="other"/>
    <ref name="name-class"/>
  </interleave>
</define>

<define name="common-atts">
  <optional>
    <attribute name="ns"/>
  </optional>
  <optional>
    <attribute name="datatypeLibrary">
      <data type="anyURI"/>
    </attribute>
  </optional>
  <zeroOrMore>
    <attribute>
      <anyName>
        <except>
          <nsName/>
          <nsName ns=""/>
        </except>
      </anyName>
    </attribute>
  </zeroOrMore>
</define>

<define name="other">
  <zeroOrMore>
    <element>
      <anyName>
        <except>
          <nsName/>
        </except>
      </anyName>
      <zeroOrMore>
        <choice>
          <attribute>
            <anyName/>
          </attribute>
          <text/>
          <ref name="any"/>
        </choice>
      </zeroOrMore>
    </element>
  </zeroOrMore>
</define>

<define name="any">
  <element>
    <anyName/>
    <zeroOrMore>
      <choice>
        <attribute>
          <anyName/>
        </attribute>
        <text/>
        <ref name="any"/>
      </choice>
    </zeroOrMore>
  </element>
</define>

</grammar>