<?xml version='1.0'?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
  ns="http://www.iana.org/assignments">

  <define name="registryMeta">
    <interleave>
      <attribute name="id"><data type="ID"/></attribute>
      <optional><element name="title"><text/></element></optional>
      <optional><element name="created"><ref name="genericDate"/></element></optional>
      <optional><element name="updated"><data type="date"/></element></optional>
      <optional><element name="registration_rule"><ref
            name="text_with_references"/></element></optional>
      <optional><element name="description"><ref name="text_with_references"/></element></optional>
      <optional><element name="note"><ref name="text_with_references"/></element></optional>
      <ref name="references"/>
    </interleave>
  </define>

  <define name="people">
    <element name="people">
      <zeroOrMore>
        <element name="person">
          <attribute name="id"><data type="ID"/></attribute>
          <element name="name"><text/></element>
          <optional><element name="org"><text/></element></optional>
          <element name="uri"><data type="anyURI"/></element>
          <optional>
            <element name="updated"><ref name="genericDate"/></element>
          </optional>
        </element>
      </zeroOrMore>
    </element>
  </define>

  <define name="xref">
    <element name="xref">
      <optional>
        <attribute name="lastupdated"><ref name="genericDate"/></attribute>
      </optional>
      <choice>
        <group>
          <attribute name="type"><value>uri</value></attribute>
          <attribute name="data"><data type="anyURI"/></attribute>
        </group>
        <group>
          <attribute name="type"><value>rfc</value></attribute>
          <attribute name="data">
            <data type="string">
              <param name="pattern">(rfc|bcp|std)\d+</param>
            </data>
          </attribute>
        </group>
        <group>
          <attribute name="type"><value>draft</value></attribute>
          <attribute name="data">
            <data type="string">
              <param name="pattern">(draft|RFC)(-[a-zA-Z0-9]+)+</param>
            </data>
          </attribute>
        </group>
        <group>
          <attribute name="type"><value>registry</value></attribute>
          <attribute name="data"><data type="NCName"/></attribute>
        </group>
        <group>
          <attribute name="type"><value>person</value></attribute>
          <attribute name="data"><data type="NCName"/></attribute>
        </group>
        <group>
          <attribute name="type"><value>text</value></attribute>
        </group>
        <group>
          <attribute name="type"><value>note</value></attribute>
          <attribute name="data"><data type="positiveInteger"/></attribute>
        </group>
      </choice>
      <text/>
    </element>
  </define>

  <define name="references">
    <zeroOrMore>
      <ref name="xref"/>
    </zeroOrMore>
  </define>

  <define name="text_with_references">
    <interleave>
      <zeroOrMore>
        <text/>
        <optional><ref name="xref"/></optional>
      </zeroOrMore>
    </interleave>
  </define>

  <define name="genericRange">
    <data type="string">
      <param name="pattern">(\d+|0x[\da-fA-F]+)(-(\d+|0x[\da-fA-F]+))?</param>
    </data>
  </define>

  <define name="genericDate">
    <choice>
      <data type="date"/>
      <data type="gYearMonth"/>
    </choice>
  </define>

  <define name="footnotes">
    <zeroOrMore>
      <element name="footnote">
        <attribute name="anchor"><data type="positiveInteger"/></attribute>
        <interleave>
          <zeroOrMore>
            <text/>
            <optional><ref name="xref"/></optional>
          </zeroOrMore>
        </interleave>
      </element>
    </zeroOrMore>
  </define>

</grammar>
