metanorma/metanorma-ietf

View on GitHub
lib/metanorma/ietf/basicdoc.rng

Summary

Maintainability
Test Coverage
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <define name="document">
    <element name="document">
      <optional>
        <attribute name="identifier"/>
      </optional>
      <ref name="bibdata"/>
      <ref name="sections"/>
      <zeroOrMore>
        <ref name="references"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="bibdata">
    <element name="bibdata">
      <ref name="BibData"/>
    </element>
  </define>
  <define name="sections">
    <element name="sections">
      <oneOrMore>
        <ref name="section"/>
      </oneOrMore>
    </element>
  </define>
  <define name="section">
    <element name="section">
      <ref name="Basic-Section"/>
      <zeroOrMore>
        <ref name="section"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="Basic-Section">
    <optional>
      <attribute name="id">
        <data type="ID"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="language"/>
    </optional>
    <optional>
      <attribute name="script"/>
    </optional>
    <optional>
      <ref name="section-title"/>
    </optional>
    <zeroOrMore>
      <ref name="BasicBlock"/>
    </zeroOrMore>
  </define>
  <define name="references">
    <element name="references">
      <optional>
        <attribute name="id">
          <data type="ID"/>
        </attribute>
      </optional>
      <optional>
        <ref name="section-title"/>
      </optional>
      <zeroOrMore>
        <ref name="BasicBlock"/>
      </zeroOrMore>
      <zeroOrMore>
        <ref name="bibitem"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="section-title">
    <element name="title">
      <zeroOrMore>
        <ref name="TextElement"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="BasicBlock">
    <choice>
      <ref name="paragraph-with-footnote"/>
      <ref name="table"/>
      <ref name="formula"/>
      <ref name="admonition"/>
      <ref name="ol"/>
      <ref name="ul"/>
      <ref name="dl"/>
      <ref name="figure"/>
      <ref name="quote"/>
      <ref name="sourcecode"/>
      <ref name="example"/>
      <ref name="review"/>
      <ref name="pre"/>
      <ref name="note"/>
      <ref name="pagebreak"/>
      <ref name="hr"/>
      <ref name="bookmark"/>
      <ref name="amend"/>
    </choice>
  </define>
  <define name="BasicBlockNoId">
    <choice>
      <ref name="paragraph-with-footnote-no-id"/>
      <ref name="table-no-id"/>
      <ref name="formula-no-id"/>
      <ref name="admonition-no-id"/>
      <ref name="ol-no-id"/>
      <ref name="ul-no-id"/>
      <ref name="dl-no-id"/>
      <ref name="figure-no-id"/>
      <ref name="quote-no-id"/>
      <ref name="sourcecode-no-id"/>
      <ref name="example-no-id"/>
      <ref name="review"/>
      <ref name="pre-no-id"/>
      <ref name="note-no-id"/>
      <ref name="pagebreak"/>
      <ref name="hr"/>
      <ref name="bookmark"/>
      <ref name="amend"/>
    </choice>
  </define>
  <define name="amend">
    <element name="amend">
      <ref name="AmendType"/>
    </element>
  </define>
  <define name="AmendType">
    <optional>
      <attribute name="id">
        <data type="ID"/>
      </attribute>
    </optional>
    <attribute name="change">
      <choice>
        <value>add</value>
        <value>modify</value>
        <value>delete</value>
        <value>replace</value>
      </choice>
    </attribute>
    <optional>
      <attribute name="path"/>
    </optional>
    <optional>
      <attribute name="path_end"/>
    </optional>
    <optional>
      <attribute name="title"/>
    </optional>
    <optional>
      <element name="location">
        <zeroOrMore>
          <choice>
            <ref name="locality"/>
            <ref name="localityStack"/>
          </choice>
        </zeroOrMore>
      </element>
    </optional>
    <optional>
      <element name="description">
        <zeroOrMore>
          <ref name="BasicBlock"/>
        </zeroOrMore>
      </element>
    </optional>
    <optional>
      <element name="newcontent">
        <optional>
          <attribute name="id">
            <data type="ID"/>
          </attribute>
        </optional>
        <zeroOrMore>
          <ref name="BasicBlock"/>
        </zeroOrMore>
      </element>
    </optional>
    <zeroOrMore>
      <ref name="classification"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="contributor"/>
    </zeroOrMore>
  </define>
  <define name="classification">
    <element name="classification">
      <ref name="classification_tag"/>
      <ref name="classification_value"/>
    </element>
  </define>
  <define name="classification_tag">
    <element name="tag">
      <text/>
    </element>
  </define>
  <define name="classification_value">
    <element name="value">
      <text/>
    </element>
  </define>
  <define name="paragraph">
    <element name="p">
      <ref name="ParagraphType"/>
    </element>
  </define>
  <define name="Alignments">
    <choice>
      <value>left</value>
      <value>right</value>
      <value>center</value>
      <value>justified</value>
    </choice>
  </define>
  <define name="RequiredId">
    <attribute name="id">
      <data type="ID"/>
    </attribute>
  </define>
  <define name="OptionalId">
    <optional>
      <attribute name="id">
        <data type="ID"/>
      </attribute>
    </optional>
  </define>
  <define name="ParagraphAttrs">
    <optional>
      <attribute name="align">
        <ref name="Alignments"/>
      </attribute>
    </optional>
  </define>
  <define name="ParagraphType">
    <ref name="RequiredId"/>
    <ref name="ParagraphAttrs"/>
    <ref name="ParagraphBody"/>
  </define>
  <define name="ParagraphBody">
    <zeroOrMore>
      <ref name="TextElement"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="ParagraphFnBody">
    <zeroOrMore>
      <choice>
        <ref name="TextElement"/>
        <ref name="fn"/>
      </choice>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="paragraph-no-id">
    <element name="p">
      <ref name="OptionalId"/>
      <ref name="ParagraphAttrs"/>
      <ref name="ParagraphBody"/>
    </element>
  </define>
  <define name="paragraph-with-footnote">
    <element name="p">
      <ref name="RequiredId"/>
      <ref name="ParagraphAttrs"/>
      <ref name="ParagraphFnBody"/>
    </element>
  </define>
  <define name="paragraph-with-footnote-no-id">
    <element name="p">
      <ref name="OptionalId"/>
      <ref name="ParagraphAttrs"/>
      <ref name="ParagraphFnBody"/>
    </element>
  </define>
  <define name="note">
    <element name="note">
      <ref name="RequiredId"/>
      <ref name="NoteAttr"/>
      <ref name="NoteBody"/>
    </element>
  </define>
  <define name="note-no-id">
    <element name="note">
      <ref name="OptionalId"/>
      <ref name="NoteAttr"/>
      <ref name="NoteNoIdBody"/>
    </element>
  </define>
  <define name="NoteAttr">
    <empty/>
  </define>
  <define name="NoteBody">
    <oneOrMore>
      <ref name="paragraph"/>
    </oneOrMore>
  </define>
  <define name="NoteNoIdBody">
    <oneOrMore>
      <ref name="paragraph-no-id"/>
    </oneOrMore>
  </define>
  <define name="review">
    <element name="review">
      <ref name="RequiredId"/>
      <attribute name="reviewer"/>
      <optional>
        <attribute name="type"/>
      </optional>
      <optional>
        <attribute name="date">
          <data type="dateTime"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="from">
          <data type="IDREF"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="to">
          <data type="IDREF"/>
        </attribute>
      </optional>
      <oneOrMore>
        <ref name="paragraph"/>
      </oneOrMore>
    </element>
  </define>
  <define name="formula">
    <element name="formula">
      <ref name="RequiredId"/>
      <ref name="FormulaAttr"/>
      <ref name="FormulaBody"/>
    </element>
  </define>
  <define name="formula-no-id">
    <element name="formula">
      <ref name="OptionalId"/>
      <ref name="FormulaAttr"/>
      <ref name="FormulaNoIdBody"/>
    </element>
  </define>
  <define name="FormulaAttr">
    <optional>
      <attribute name="unnumbered">
        <data type="boolean"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="subsequence"/>
    </optional>
    <optional>
      <attribute name="inequality">
        <data type="boolean"/>
      </attribute>
    </optional>
  </define>
  <define name="FormulaBody">
    <ref name="stem"/>
    <optional>
      <ref name="dl"/>
    </optional>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="FormulaNoIdBody">
    <ref name="stem"/>
    <optional>
      <ref name="dl-no-id"/>
    </optional>
    <zeroOrMore>
      <ref name="note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="quote">
    <element name="quote">
      <ref name="RequiredId"/>
      <ref name="QuoteAttr"/>
      <ref name="QuoteBody"/>
    </element>
  </define>
  <define name="quote-no-id">
    <element name="quote">
      <ref name="OptionalId"/>
      <ref name="QuoteAttr"/>
      <ref name="QuoteNoIdBody"/>
    </element>
  </define>
  <define name="QuoteAttr">
    <optional>
      <attribute name="alignment">
        <ref name="Alignments"/>
      </attribute>
    </optional>
  </define>
  <define name="QuoteBody">
    <optional>
      <ref name="quote-source"/>
    </optional>
    <optional>
      <ref name="quote-author"/>
    </optional>
    <oneOrMore>
      <ref name="paragraph-with-footnote"/>
    </oneOrMore>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="QuoteNoIdBody">
    <optional>
      <ref name="quote-source"/>
    </optional>
    <optional>
      <ref name="quote-author"/>
    </optional>
    <oneOrMore>
      <ref name="paragraph-with-footnote-no-id"/>
    </oneOrMore>
    <zeroOrMore>
      <ref name="note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="quote-source">
    <element name="source">
      <ref name="erefType"/>
    </element>
  </define>
  <define name="quote-author">
    <element name="author">
      <text/>
    </element>
  </define>
  <define name="sourcecode">
    <element name="sourcecode">
      <ref name="RequiredId"/>
      <ref name="SourceAttr"/>
      <ref name="SourceBody"/>
    </element>
  </define>
  <define name="sourcecode-no-id">
    <element name="sourcecode">
      <ref name="OptionalId"/>
      <ref name="SourceAttr"/>
      <ref name="SourceNoIdBody"/>
    </element>
  </define>
  <define name="SourceAttr">
    <optional>
      <attribute name="unnumbered">
        <data type="boolean"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="subsequence"/>
    </optional>
    <optional>
      <attribute name="lang"/>
    </optional>
  </define>
  <define name="SourceBody">
    <optional>
      <ref name="tname"/>
    </optional>
    <oneOrMore>
      <choice>
        <text/>
        <ref name="callout"/>
      </choice>
    </oneOrMore>
    <zeroOrMore>
      <ref name="annotation"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="SourceNoIdBody">
    <optional>
      <ref name="tname"/>
    </optional>
    <oneOrMore>
      <choice>
        <text/>
        <ref name="callout"/>
      </choice>
    </oneOrMore>
    <zeroOrMore>
      <ref name="annotation"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="pre">
    <element name="pre">
      <ref name="RequiredId"/>
      <ref name="PreAttr"/>
      <ref name="PreBody"/>
    </element>
  </define>
  <define name="pre-no-id">
    <element name="pre">
      <ref name="OptionalId"/>
      <ref name="PreAttr"/>
      <ref name="PreNoIdBody"/>
    </element>
  </define>
  <define name="PreAttr">
    <optional>
      <attribute name="alt"/>
    </optional>
  </define>
  <define name="PreBody">
    <optional>
      <ref name="tname"/>
    </optional>
    <text/>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="PreNoIdBody">
    <optional>
      <ref name="tname"/>
    </optional>
    <text/>
    <zeroOrMore>
      <ref name="note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="table">
    <element name="table">
      <ref name="RequiredId"/>
      <ref name="TableAttr"/>
      <ref name="TableBody"/>
    </element>
  </define>
  <define name="table-no-id">
    <element name="table">
      <ref name="OptionalId"/>
      <ref name="TableAttr"/>
      <ref name="TableNoIdBody"/>
    </element>
  </define>
  <define name="TableAttr">
    <optional>
      <attribute name="unnumbered">
        <data type="boolean"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="subsequence"/>
    </optional>
    <optional>
      <attribute name="alt"/>
    </optional>
    <optional>
      <attribute name="summary"/>
    </optional>
    <optional>
      <attribute name="uri">
        <data type="anyURI"/>
      </attribute>
    </optional>
  </define>
  <define name="TableBody">
    <optional>
      <ref name="tname"/>
    </optional>
    <optional>
      <ref name="thead"/>
    </optional>
    <ref name="tbody"/>
    <optional>
      <ref name="tfoot"/>
    </optional>
    <optional>
      <ref name="dl"/>
    </optional>
    <zeroOrMore>
      <ref name="table-note"/>
    </zeroOrMore>
  </define>
  <define name="TableNoIdBody">
    <optional>
      <ref name="tname"/>
    </optional>
    <optional>
      <ref name="thead-no-id"/>
    </optional>
    <ref name="tbody-no-id"/>
    <optional>
      <ref name="tfoot-no-id"/>
    </optional>
    <optional>
      <ref name="dl-no-id"/>
    </optional>
    <zeroOrMore>
      <ref name="table-note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="tname">
    <element name="name">
      <oneOrMore>
        <choice>
          <ref name="PureTextElement"/>
          <ref name="eref"/>
          <ref name="stem"/>
          <ref name="keyword"/>
          <ref name="xref"/>
          <ref name="hyperlink"/>
          <ref name="index"/>
          <ref name="index-xref"/>
        </choice>
      </oneOrMore>
    </element>
  </define>
  <define name="thead">
    <element name="thead">
      <ref name="tr"/>
    </element>
  </define>
  <define name="thead-no-id">
    <element name="thead">
      <ref name="tr-no-id"/>
    </element>
  </define>
  <define name="tfoot">
    <element name="tfoot">
      <ref name="tr"/>
    </element>
  </define>
  <define name="tfoot-no-id">
    <element name="tfoot">
      <ref name="tr-no-id"/>
    </element>
  </define>
  <define name="tbody">
    <element name="tbody">
      <oneOrMore>
        <ref name="tr"/>
      </oneOrMore>
    </element>
  </define>
  <define name="tbody-no-id">
    <element name="tbody">
      <oneOrMore>
        <ref name="tr-no-id"/>
      </oneOrMore>
    </element>
  </define>
  <define name="table-note">
    <element name="note">
      <ref name="paragraph"/>
    </element>
  </define>
  <define name="table-note-no-id">
    <element name="note">
      <ref name="paragraph-no-id"/>
    </element>
  </define>
  <define name="tr">
    <element name="tr">
      <oneOrMore>
        <choice>
          <ref name="td"/>
          <ref name="th"/>
        </choice>
      </oneOrMore>
    </element>
  </define>
  <define name="tr-no-id">
    <element name="tr">
      <oneOrMore>
        <choice>
          <ref name="td-no-id"/>
          <ref name="th-no-id"/>
        </choice>
      </oneOrMore>
    </element>
  </define>
  <define name="td">
    <element name="td">
      <ref name="TdAttr"/>
      <ref name="TdBody"/>
    </element>
  </define>
  <define name="td-no-id">
    <element name="td">
      <ref name="TdAttr"/>
      <ref name="TdNoIdBody"/>
    </element>
  </define>
  <define name="TdAttr">
    <optional>
      <attribute name="colspan"/>
    </optional>
    <optional>
      <attribute name="rowspan"/>
    </optional>
    <optional>
      <attribute name="align">
        <choice>
          <value>left</value>
          <value>right</value>
          <value>center</value>
        </choice>
      </attribute>
    </optional>
    <optional>
      <attribute name="valign">
        <choice>
          <value>top</value>
          <value>middle</value>
          <value>bottom</value>
          <value>baseline</value>
        </choice>
      </attribute>
    </optional>
  </define>
  <define name="TdBody">
    <choice>
      <zeroOrMore>
        <ref name="TextElement"/>
      </zeroOrMore>
      <oneOrMore>
        <ref name="paragraph-with-footnote"/>
      </oneOrMore>
    </choice>
  </define>
  <define name="TdNoIdBody">
    <choice>
      <zeroOrMore>
        <ref name="TextElement"/>
      </zeroOrMore>
      <oneOrMore>
        <ref name="paragraph-with-footnote-no-id"/>
      </oneOrMore>
    </choice>
  </define>
  <define name="th">
    <element name="th">
      <ref name="ThAttr"/>
      <ref name="ThBody"/>
    </element>
  </define>
  <define name="th-no-id">
    <element name="th">
      <ref name="ThAttr"/>
      <ref name="ThNoIdBody"/>
    </element>
  </define>
  <define name="ThAttr">
    <ref name="TdAttr"/>
  </define>
  <define name="ThBody">
    <ref name="TdBody"/>
  </define>
  <define name="ThNoIdBody">
    <ref name="TdNoIdBody"/>
  </define>
  <define name="example">
    <element name="example">
      <ref name="RequiredId"/>
      <ref name="ExampleAttr"/>
      <ref name="ExampleBody"/>
    </element>
  </define>
  <define name="example-no-id">
    <element name="example">
      <ref name="OptionalId"/>
      <ref name="ExampleAttr"/>
      <ref name="ExampleNoIdBody"/>
    </element>
  </define>
  <define name="ExampleAttr">
    <optional>
      <attribute name="unnumbered">
        <data type="boolean"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="subsequence"/>
    </optional>
  </define>
  <define name="ExampleBody">
    <optional>
      <ref name="tname"/>
    </optional>
    <oneOrMore>
      <choice>
        <ref name="formula"/>
        <ref name="ul"/>
        <ref name="ol"/>
        <ref name="dl"/>
        <ref name="quote"/>
        <ref name="sourcecode"/>
        <ref name="paragraph-with-footnote"/>
      </choice>
    </oneOrMore>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="ExampleNoIdBody">
    <optional>
      <ref name="tname"/>
    </optional>
    <oneOrMore>
      <choice>
        <ref name="formula-no-id"/>
        <ref name="ul-no-id"/>
        <ref name="ol-no-id"/>
        <ref name="dl-no-id"/>
        <ref name="quote-no-id"/>
        <ref name="sourcecode-no-id"/>
        <ref name="paragraph-with-footnote-no-id"/>
      </choice>
    </oneOrMore>
    <zeroOrMore>
      <ref name="note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="admonition">
    <element name="admonition">
      <ref name="RequiredId"/>
      <ref name="AdmonitionAttr"/>
      <ref name="AdmonitionBody"/>
    </element>
  </define>
  <define name="admonition-no-id">
    <element name="admonition">
      <ref name="OptionalId"/>
      <ref name="AdmonitionAttr"/>
      <ref name="AdmonitionNoIdBody"/>
    </element>
  </define>
  <define name="AdmonitionAttr">
    <attribute name="type">
      <ref name="AdmonitionType"/>
    </attribute>
    <optional>
      <attribute name="class"/>
    </optional>
    <optional>
      <attribute name="uri">
        <data type="anyURI"/>
      </attribute>
    </optional>
  </define>
  <define name="AdmonitionBody">
    <optional>
      <ref name="tname"/>
    </optional>
    <zeroOrMore>
      <ref name="paragraph-with-footnote"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="AdmonitionNoIdBody">
    <optional>
      <ref name="tname"/>
    </optional>
    <zeroOrMore>
      <ref name="paragraph-with-footnote-no-id"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="AdmonitionType">
    <choice>
      <value>warning</value>
      <value>note</value>
      <value>tip</value>
      <value>important</value>
      <value>caution</value>
    </choice>
  </define>
  <define name="figure">
    <element name="figure">
      <ref name="RequiredId"/>
      <ref name="FigureAttr"/>
      <ref name="FigureBody"/>
    </element>
  </define>
  <define name="figure-no-id">
    <element name="figure">
      <ref name="OptionalId"/>
      <ref name="FigureAttr"/>
      <ref name="FigureNoIdBody"/>
    </element>
  </define>
  <define name="FigureAttr">
    <optional>
      <attribute name="unnumbered">
        <data type="boolean"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="subsequence"/>
    </optional>
    <optional>
      <attribute name="class"/>
    </optional>
  </define>
  <define name="FigureBody">
    <optional>
      <ref name="source"/>
    </optional>
    <optional>
      <ref name="tname"/>
    </optional>
    <choice>
      <ref name="image"/>
      <ref name="video"/>
      <ref name="audio"/>
      <ref name="pre"/>
      <oneOrMore>
        <ref name="paragraph-with-footnote"/>
      </oneOrMore>
      <zeroOrMore>
        <ref name="figure"/>
      </zeroOrMore>
    </choice>
    <zeroOrMore>
      <ref name="fn"/>
    </zeroOrMore>
    <optional>
      <ref name="dl"/>
    </optional>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="FigureNoIdBody">
    <optional>
      <ref name="source"/>
    </optional>
    <optional>
      <ref name="tname"/>
    </optional>
    <choice>
      <ref name="image-no-id"/>
      <ref name="video-no-id"/>
      <ref name="audio-no-id"/>
      <ref name="pre-no-id"/>
      <oneOrMore>
        <ref name="paragraph-with-footnote-no-id"/>
      </oneOrMore>
      <zeroOrMore>
        <ref name="figure-no-id"/>
      </zeroOrMore>
    </choice>
    <zeroOrMore>
      <ref name="fn"/>
    </zeroOrMore>
    <optional>
      <ref name="dl-no-id"/>
    </optional>
    <zeroOrMore>
      <ref name="note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="TextElement">
    <choice>
      <text/>
      <ref name="em"/>
      <ref name="eref"/>
      <ref name="strong"/>
      <ref name="stem"/>
      <ref name="sub"/>
      <ref name="sup"/>
      <ref name="tt"/>
      <ref name="underline"/>
      <ref name="keyword"/>
      <ref name="ruby"/>
      <ref name="strike"/>
      <ref name="smallcap"/>
      <ref name="xref"/>
      <ref name="br"/>
      <ref name="hyperlink"/>
      <ref name="hr"/>
      <ref name="pagebreak"/>
      <ref name="bookmark"/>
      <ref name="image"/>
      <ref name="index"/>
      <ref name="index-xref"/>
    </choice>
  </define>
  <define name="PureTextElement">
    <choice>
      <text/>
      <ref name="em"/>
      <ref name="strong"/>
      <ref name="sub"/>
      <ref name="sup"/>
      <ref name="tt"/>
      <ref name="underline"/>
      <ref name="strike"/>
      <ref name="smallcap"/>
      <ref name="br"/>
    </choice>
  </define>
  <define name="source">
    <element name="source">
      <ref name="TypedUri"/>
    </element>
  </define>
  <define name="em">
    <element name="em">
      <zeroOrMore>
        <choice>
          <ref name="PureTextElement"/>
          <ref name="stem"/>
          <ref name="eref"/>
          <ref name="xref"/>
          <ref name="hyperlink"/>
          <ref name="index"/>
          <ref name="index-xref"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="strong">
    <element name="strong">
      <zeroOrMore>
        <choice>
          <ref name="PureTextElement"/>
          <ref name="stem"/>
          <ref name="eref"/>
          <ref name="xref"/>
          <ref name="hyperlink"/>
          <ref name="index"/>
          <ref name="index-xref"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="tt">
    <element name="tt">
      <zeroOrMore>
        <choice>
          <ref name="PureTextElement"/>
          <ref name="eref"/>
          <ref name="xref"/>
          <ref name="hyperlink"/>
          <ref name="index"/>
          <ref name="index-xref"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="keyword">
    <element name="keyword">
      <zeroOrMore>
        <choice>
          <ref name="PureTextElement"/>
          <ref name="index"/>
          <ref name="index-xref"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="sub">
    <element name="sub">
      <zeroOrMore>
        <ref name="PureTextElement"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="sup">
    <element name="sup">
      <zeroOrMore>
        <ref name="PureTextElement"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="strike">
    <element name="strike">
      <zeroOrMore>
        <choice>
          <ref name="PureTextElement"/>
          <ref name="index"/>
          <ref name="index-xref"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="underline">
    <element name="underline">
      <optional>
        <attribute name="style"/>
      </optional>
      <zeroOrMore>
        <ref name="PureTextElement"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="smallcap">
    <element name="smallcap">
      <zeroOrMore>
        <ref name="PureTextElement"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="ruby">
    <element name="ruby">
      <choice>
        <ref name="ruby_pronunciation"/>
        <ref name="ruby_annotation"/>
      </choice>
      <choice>
        <text/>
        <ref name="ruby"/>
      </choice>
    </element>
  </define>
  <define name="ruby_pronunciation">
    <element name="pronunciation">
      <attribute name="value"/>
      <optional>
        <attribute name="script"/>
      </optional>
      <optional>
        <attribute name="lang"/>
      </optional>
    </element>
  </define>
  <define name="ruby_annotation">
    <element name="annotation">
      <attribute name="value"/>
      <optional>
        <attribute name="script"/>
      </optional>
      <optional>
        <attribute name="lang"/>
      </optional>
    </element>
  </define>
  <define name="br">
    <element name="br">
      <empty/>
    </element>
  </define>
  <define name="hr">
    <element name="hr">
      <empty/>
    </element>
  </define>
  <define name="pagebreak">
    <element name="pagebreak">
      <empty/>
    </element>
  </define>
  <define name="index">
    <element name="index">
      <optional>
        <attribute name="to">
          <data type="IDREF"/>
        </attribute>
      </optional>
      <element name="primary">
        <oneOrMore>
          <ref name="PureTextElement"/>
        </oneOrMore>
      </element>
      <optional>
        <element name="secondary">
          <oneOrMore>
            <ref name="PureTextElement"/>
          </oneOrMore>
        </element>
      </optional>
      <optional>
        <element name="tertiary">
          <oneOrMore>
            <ref name="PureTextElement"/>
          </oneOrMore>
        </element>
      </optional>
    </element>
  </define>
  <define name="index-xref">
    <element name="index-xref">
      <attribute name="also">
        <data type="boolean"/>
      </attribute>
      <element name="primary">
        <oneOrMore>
          <ref name="PureTextElement"/>
        </oneOrMore>
      </element>
      <optional>
        <element name="secondary">
          <oneOrMore>
            <ref name="PureTextElement"/>
          </oneOrMore>
        </element>
      </optional>
      <optional>
        <element name="tertiary">
          <oneOrMore>
            <ref name="PureTextElement"/>
          </oneOrMore>
        </element>
      </optional>
      <element name="target">
        <oneOrMore>
          <ref name="PureTextElement"/>
        </oneOrMore>
      </element>
    </element>
  </define>
  <!-- bare ID element, used for referencing arbitrary spans of text -->
  <define name="bookmark">
    <element name="bookmark">
      <attribute name="id">
        <data type="ID"/>
      </attribute>
      <empty/>
    </element>
  </define>
  <define name="ReferenceFormat">
    <choice>
      <value>external</value>
      <value>inline</value>
      <value>footnote</value>
      <value>callout</value>
    </choice>
  </define>
  <define name="eref">
    <element name="eref">
      <ref name="erefType"/>
    </element>
  </define>
  <define name="erefType">
    <optional>
      <attribute name="normative">
        <data type="boolean"/>
      </attribute>
    </optional>
    <attribute name="citeas"/>
    <attribute name="type">
      <ref name="ReferenceFormat"/>
    </attribute>
    <optional>
      <attribute name="alt"/>
    </optional>
    <ref name="CitationType"/>
    <oneOrMore>
      <ref name="PureTextElement"/>
    </oneOrMore>
  </define>
  <define name="hyperlink">
    <element name="link">
      <attribute name="target">
        <data type="anyURI"/>
      </attribute>
      <attribute name="type">
        <ref name="ReferenceFormat"/>
      </attribute>
      <optional>
        <attribute name="alt"/>
      </optional>
      <oneOrMore>
        <ref name="PureTextElement"/>
      </oneOrMore>
    </element>
  </define>
  <define name="xref">
    <element name="xref">
      <attribute name="target">
        <data type="IDREF"/>
      </attribute>
      <attribute name="type">
        <ref name="ReferenceFormat"/>
      </attribute>
      <optional>
        <attribute name="alt"/>
      </optional>
      <oneOrMore>
        <ref name="PureTextElement"/>
      </oneOrMore>
    </element>
  </define>
  <define name="fn">
    <element name="fn">
      <attribute name="reference"/>
      <oneOrMore>
        <ref name="paragraph"/>
      </oneOrMore>
    </element>
  </define>
  <!--
    This is xref with fixed @type="footnote", and @target built in as paragraph+
    @reference replaces ReferenceElement/text
    so <fn reference="2"><p>This is a footnote</p></fn>
    corresponds to 
    <eref type="footnote" target="fn2">2</xref> <p id="fn2">This is a footnote</p>
  -->
  <define name="callout">
    <element name="callout">
      <attribute name="target">
        <data type="IDREF"/>
      </attribute>
      <text/>
    </element>
  </define>
  <!--
    This is xref with fixed @type="callout"; the target by convention is in an annotation in the same source code snippet
    so <callout target="xyz">1</callout>
    corresponds to <xref type="callout" target="xyz">1</xref>
  -->
  <define name="image">
    <element name="image">
      <ref name="RequiredId"/>
      <ref name="ImageAttr"/>
    </element>
  </define>
  <define name="image-no-id">
    <element name="image">
      <ref name="OptionalId"/>
      <ref name="ImageAttr"/>
    </element>
  </define>
  <define name="ImageAttr">
    <attribute name="src">
      <data type="anyURI"/>
    </attribute>
    <attribute name="mimetype"/>
    <optional>
      <attribute name="filename"/>
    </optional>
    <optional>
      <attribute name="width">
        <ref name="ImageSize"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="height">
        <ref name="ImageSize"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="alt"/>
    </optional>
    <optional>
      <attribute name="title"/>
    </optional>
    <optional>
      <attribute name="longdesc">
        <data type="anyURI"/>
      </attribute>
    </optional>
  </define>
  <define name="ImageSize">
    <choice>
      <data type="string">
        <param name="pattern">\d+([.]\d+)?(%?)</param>
      </data>
      <value>auto</value>
    </choice>
  </define>
  <define name="video">
    <element name="video">
      <ref name="RequiredId"/>
      <ref name="VideoAttr"/>
      <ref name="VideoBody"/>
    </element>
  </define>
  <define name="video-no-id">
    <element name="video">
      <ref name="OptionalId"/>
      <ref name="VideoAttr"/>
      <ref name="VideoBody"/>
    </element>
  </define>
  <define name="VideoAttr">
    <attribute name="src">
      <data type="anyURI"/>
    </attribute>
    <attribute name="mimetype"/>
    <optional>
      <attribute name="filename"/>
    </optional>
    <optional>
      <attribute name="width">
        <choice>
          <data type="int"/>
          <value>auto</value>
        </choice>
      </attribute>
    </optional>
    <optional>
      <attribute name="height">
        <choice>
          <data type="int"/>
          <value>auto</value>
        </choice>
      </attribute>
    </optional>
    <optional>
      <attribute name="alt"/>
    </optional>
    <optional>
      <attribute name="title"/>
    </optional>
    <optional>
      <attribute name="longdesc">
        <data type="anyURI"/>
      </attribute>
    </optional>
  </define>
  <define name="VideoBody">
    <zeroOrMore>
      <ref name="altsource"/>
    </zeroOrMore>
  </define>
  <define name="audio">
    <element name="audio">
      <ref name="RequiredId"/>
      <ref name="AudioAttr"/>
      <ref name="AudioBody"/>
    </element>
  </define>
  <define name="audio-no-id">
    <element name="audio">
      <ref name="OptionalId"/>
      <ref name="AudioAttr"/>
      <ref name="AudioBody"/>
    </element>
  </define>
  <define name="AudioAttr">
    <attribute name="src">
      <data type="anyURI"/>
    </attribute>
    <attribute name="mimetype"/>
    <optional>
      <attribute name="filename"/>
    </optional>
    <optional>
      <attribute name="alt"/>
    </optional>
    <optional>
      <attribute name="title"/>
    </optional>
    <optional>
      <attribute name="longdesc">
        <data type="anyURI"/>
      </attribute>
    </optional>
  </define>
  <define name="AudioBody">
    <zeroOrMore>
      <ref name="altsource"/>
    </zeroOrMore>
  </define>
  <define name="altsource">
    <element name="altsource">
      <attribute name="src">
        <data type="anyURI"/>
      </attribute>
      <attribute name="mimetype"/>
      <optional>
        <attribute name="filename"/>
      </optional>
    </element>
  </define>
  <define name="stem">
    <element name="stem">
      <attribute name="type">
        <choice>
          <value>MathML</value>
          <value>AsciiMath</value>
        </choice>
      </attribute>
      <oneOrMore>
        <choice>
          <text/>
          <ref name="AnyElement"/>
        </choice>
      </oneOrMore>
    </element>
  </define>
  <define name="annotation">
    <element name="annotation">
      <ref name="RequiredId"/>
      <ref name="paragraph"/>
    </element>
  </define>
  <define name="ul">
    <element name="ul">
      <ref name="RequiredId"/>
      <ref name="UlAttr"/>
      <ref name="UlBody"/>
    </element>
  </define>
  <define name="ul-no-id">
    <element name="ul">
      <ref name="OptionalId"/>
      <ref name="UlAttr"/>
      <ref name="UlNoIdBody"/>
    </element>
  </define>
  <define name="UlAttr">
    <empty/>
  </define>
  <define name="UlBody">
    <oneOrMore>
      <ref name="li"/>
    </oneOrMore>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="UlNoIdBody">
    <oneOrMore>
      <ref name="li-no-id"/>
    </oneOrMore>
    <zeroOrMore>
      <ref name="note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="li">
    <element name="li">
      <ref name="OptionalId"/>
      <ref name="LiAttr"/>
      <ref name="LiBody"/>
    </element>
  </define>
  <define name="li-no-id">
    <element name="li">
      <ref name="OptionalId"/>
      <ref name="LiAttr"/>
      <ref name="LiNoIdBody"/>
    </element>
  </define>
  <define name="LiAttr">
    <empty/>
  </define>
  <define name="LiBody">
    <oneOrMore>
      <ref name="paragraph-with-footnote"/>
    </oneOrMore>
  </define>
  <define name="LiNoIdBody">
    <oneOrMore>
      <ref name="paragraph-with-footnote-no-id"/>
    </oneOrMore>
  </define>
  <define name="ol">
    <element name="ol">
      <ref name="RequiredId"/>
      <ref name="OlAttr"/>
      <ref name="OlBody"/>
    </element>
  </define>
  <define name="ol-no-id">
    <element name="ol">
      <ref name="OptionalId"/>
      <ref name="OlAttr"/>
      <ref name="OlNoIdBody"/>
    </element>
  </define>
  <define name="OlAttr">
    <attribute name="type">
      <choice>
        <value>roman</value>
        <value>alphabet</value>
        <value>arabic</value>
        <value>roman_upper</value>
        <value>alphabet_upper</value>
      </choice>
    </attribute>
    <optional>
      <attribute name="start"/>
    </optional>
  </define>
  <define name="OlBody">
    <oneOrMore>
      <ref name="li"/>
    </oneOrMore>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="OlNoIdBody">
    <oneOrMore>
      <ref name="li-no-id"/>
    </oneOrMore>
    <zeroOrMore>
      <ref name="note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="dl">
    <element name="dl">
      <ref name="RequiredId"/>
      <ref name="DlAttr"/>
      <ref name="DlBody"/>
    </element>
  </define>
  <define name="dl-no-id">
    <element name="dl">
      <ref name="OptionalId"/>
      <ref name="DlNoIdBody"/>
    </element>
  </define>
  <define name="DlAttr">
    <empty/>
  </define>
  <define name="DlBody">
    <oneOrMore>
      <ref name="dt"/>
      <ref name="dd"/>
    </oneOrMore>
    <zeroOrMore>
      <ref name="note"/>
    </zeroOrMore>
  </define>
  <define name="DlNoIdBody">
    <oneOrMore>
      <ref name="dt"/>
      <ref name="dd-no-id"/>
    </oneOrMore>
    <zeroOrMore>
      <ref name="note-no-id"/>
    </zeroOrMore>
  </define>
  <define name="dt">
    <element name="dt">
      <zeroOrMore>
        <ref name="TextElement"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="dd">
    <element name="dd">
      <zeroOrMore>
        <ref name="paragraph-with-footnote"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="dd-no-id">
    <element name="dd">
      <zeroOrMore>
        <ref name="paragraph-with-footnote-no-id"/>
      </zeroOrMore>
    </element>
  </define>
</grammar>