<?xml version=“1.0” encoding=“UTF-8”?> <!–

instantiations of this grammar may replace leaf strings
with more elaborated types; e.g. title (text) replaced with
title-main, title-intro, title-part; type replaced with
enum.

some renaming at leaf nodes is permissible

obligations can change both from optional to mandatory,
and from mandatory to optional; optional elements may
be omitted; freely positioned alternatives may be replaced
with strict ordering

DO NOT introduce a namespace here. We do not want a distinct namespace
for these elements, and a distinct namespace for any grammar inheriting
these elements; we just want one namespace for any child grammars
of this.

–> <grammar xmlns:a=“relaxng.org/ns/compatibility/annotations/1.0” xmlns=“relaxng.org/ns/structure/1.0” datatypeLibrary=“www.w3.org/2001/XMLSchema-datatypes”>

<define name="status">
  <element name="status">
    <ref name="LocalizedString"/>
  </element>
</define>
<define name="language">
  <element name="language">
    <text/>
  </element>
</define>
<define name="script">
  <a:documentation>ISO-639</a:documentation>
  <element name="script">
    <text/>
  </element>
</define>
<define name="edition">
  <a:documentation>ISO-15924: Latn</a:documentation>
  <element name="edition">
    <data type="int"/>
  </element>
</define>
<define name="LocalizedString">
  <optional>
    <!-- multiple languages and scripts possible: comma delimit them if so -->
    <attribute name="language"/>
  </optional>
  <optional>
    <attribute name="script"/>
  </optional>
  <text/>
</define>
<!--
  Unlike UML, change type to format: type is overloaded
  Would be need if plain were default value and could omit the attribute
  Added LocalizedStringOrXsAny
-->
<define name="FormattedString">
  <optional>
    <!-- attribute format { ( "plain" | "html" | "docbook" | "tei" | "asciidoc" | "markdown" ) }?, -->
    <attribute name="format">
      <choice>
        <value>text/plain</value>
        <value>text/html</value>
        <value>application/docbook+xml</value>
        <value>application/tei+xml</value>
        <value>text/x-asciidoc</value>
        <value>text/markdown</value>
        <value>application/x-isodoc+xml</value>
        <text/>
      </choice>
    </attribute>
  </optional>
  <ref name="LocalizedStringOrXsAny"/>
</define>
<define name="LocalizedStringOrXsAny">
  <optional>
    <!-- multiple languages and scripts possible: comma delimit them if so -->
    <attribute name="language"/>
  </optional>
  <optional>
    <attribute name="script"/>
  </optional>
  <oneOrMore>
    <choice>
      <text/>
      <ref name="AnyElement"/>
    </choice>
  </oneOrMore>
</define>
<define name="contributor">
  <element name="contributor">
    <zeroOrMore>
      <ref name="role"/>
    </zeroOrMore>
    <ref name="ContributorInfo"/>
  </element>
</define>
<define name="role">
  <element name="role">
    <optional>
      <attribute name="type">
        <choice>
          <value>author</value>
          <value>edition</value>
          <value>publisher</value>
          <text/>
        </choice>
      </attribute>
    </optional>
    <zeroOrMore>
      <ref name="roledescription"/>
    </zeroOrMore>
  </element>
</define>
<define name="ContributorInfo">
  <choice>
    <ref name="person"/>
    <ref name="organization"/>
  </choice>
</define>
<define name="roledescription">
  <element name="description">
    <ref name="FormattedString"/>
  </element>
</define>
<define name="person">
  <element name="person">
    <optional>
      <ref name="fullname"/>
    </optional>
    <zeroOrMore>
      <ref name="affiliation"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="person-identifier"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="contact"/>
    </zeroOrMore>
    <optional>
      <ref name="uri"/>
    </optional>
  </element>
</define>
<define name="fullname">
  <element name="name">
    <zeroOrMore>
      <ref name="prefix"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="forename"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="initial"/>
    </zeroOrMore>
    <ref name="surname"/>
    <zeroOrMore>
      <ref name="addition"/>
    </zeroOrMore>
  </element>
</define>
<define name="prefix">
  <element name="prefix">
    <ref name="LocalizedString"/>
  </element>
</define>
<define name="initial">
  <element name="initial">
    <ref name="LocalizedString"/>
  </element>
</define>
<define name="addition">
  <element name="addition">
    <ref name="LocalizedString"/>
  </element>
</define>
<define name="surname">
  <element name="surname">
    <ref name="LocalizedString"/>
  </element>
</define>
<define name="forename">
  <element name="forename">
    <ref name="LocalizedString"/>
  </element>
</define>
<define name="affiliation">
  <element name="affiliation">
    <optional>
      <ref name="affiliationname"/>
    </optional>
    <zeroOrMore>
      <ref name="affiliationdescription"/>
    </zeroOrMore>
    <ref name="organization"/>
  </element>
</define>
<define name="affiliationname">
  <element name="name">
    <ref name="LocalizedString"/>
  </element>
</define>
<define name="affiliationdescription">
  <element name="description">
    <ref name="FormattedString"/>
  </element>
</define>
<define name="organization">
  <element name="organization">
    <ref name="orgname"/>
    <optional>
      <ref name="abbreviation"/>
    </optional>
    <optional>
      <ref name="uri"/>
    </optional>
    <zeroOrMore>
      <ref name="org-identifier"/>
    </zeroOrMore>
    <zeroOrMore>
      <ref name="contact"/>
    </zeroOrMore>
  </element>
</define>
<define name="orgname">
  <element name="name">
    <ref name="LocalizedString"/>
  </element>
</define>
<define name="abbreviation">
  <element name="abbreviation">
    <ref name="LocalizedString"/>
  </element>
</define>
<define name="uri">
  <element name="uri">
    <data type="anyURI"/>
  </element>
</define>
<!-- TODO may change -->
<define name="contact">
  <choice>
    <ref name="address"/>
    <ref name="phone"/>
    <ref name="email"/>
    <ref name="uri"/>
  </choice>
</define>
<define name="phone">
  <element name="phone">
    <text/>
  </element>
</define>
<define name="email">
  <element name="email">
    <text/>
  </element>
</define>
<define name="address">
  <element name="address">
    <oneOrMore>
      <!-- iso191606 TODO -->
      <ref name="street"/>
    </oneOrMore>
    <ref name="city"/>
    <optional>
      <ref name="state"/>
    </optional>
    <ref name="country"/>
    <optional>
      <ref name="postcode"/>
    </optional>
  </element>
</define>
<define name="street">
  <element name="street">
    <text/>
  </element>
</define>
<define name="city">
  <element name="city">
    <text/>
  </element>
</define>
<define name="state">
  <element name="state">
    <text/>
  </element>
</define>
<define name="country">
  <element name="country">
    <text/>
  </element>
</define>
<define name="postcode">
  <element name="postcode">
    <text/>
  </element>
</define>
<define name="person-identifier">
  <element name="identifier">
    <attribute name="type">
      <choice>
        <value>isni</value>
        <value>uri</value>
      </choice>
    </attribute>
    <text/>
  </element>
</define>
<define name="org-identifier">
  <element name="identifier">
    <attribute name="type">
      <choice>
        <value>orcid</value>
        <value>uri</value>
      </choice>
    </attribute>
    <text/>
  </element>
</define>
<define name="citation">
  <element name="citation">
    <ref name="CitationType"/>
  </element>
</define>
<define name="CitationType">
  <attribute name="bibitemid">
    <data type="IDREF"/>
  </attribute>
  <zeroOrMore>
    <ref name="locality"/>
  </zeroOrMore>
  <optional>
    <ref name="date"/>
  </optional>
</define>
<define name="date">
  <element name="date">
    <choice>
      <data type="gYear"/>
      <data type="date"/>
    </choice>
  </element>
</define>
<define name="locality">
  <element name="locality">
    <!-- attribute type { ( "section" | "clause" | "part" | "paragraph" | "chapter" | "page" | "whole" | "table" | "annex" | "figure" | "note" | "example" | ("locality:", text) ) }, -->
    <attribute name="type">
      <ref name="LocalityType"/>
    </attribute>
    <ref name="referenceFrom"/>
    <optional>
      <ref name="referenceTo"/>
    </optional>
  </element>
</define>
<define name="LocalityType">
  <data type="string">
    <param name="pattern">section|clause|part|paragraph|chapter|page|whole|table|annex|figure|note|example|locality:[a-zA-Z0-9_]+</param>
  </data>
</define>
<define name="referenceFrom">
  <element name="referenceFrom">
    <text/>
  </element>
</define>
<define name="referenceTo">
  <element name="referenceTo">
    <text/>
  </element>
</define>
<!-- unlike UML, has id attribute; that results from including bibitem in a docmodel -->
<define name="bibitem">
  <element name="bibitem">
    <attribute name="id">
      <data type="ID"/>
    </attribute>
    <ref name="BibliographicItem"/>
  </element>
</define>
<define name="bibitem_no_id">
  <element name="bibitem">
    <ref name="BibliographicItem"/>
  </element>
</define>
<define name="BibItemType" combine="choice">
  <choice>
    <value>article</value>
    <value>book</value>
    <value>booklet</value>
    <value>conference</value>
    <value>manual</value>
    <value>proceedings</value>
    <value>presentation</value>
    <value>thesis</value>
    <value>techreport</value>
    <value>standard</value>
    <value>unpublished</value>
  </choice>
</define>
<define name="BibliographicItem">
  <optional>
    <attribute name="type">
      <ref name="BibItemType"/>
    </attribute>
  </optional>
  <choice>
    <oneOrMore>
      <ref name="btitle"/>
    </oneOrMore>
    <ref name="formattedref"/>
  </choice>
  <zeroOrMore>
    <ref name="bsource"/>
  </zeroOrMore>
  <zeroOrMore>
    <ref name="docidentifier"/>
  </zeroOrMore>
  <zeroOrMore>
    <ref name="bdate"/>
  </zeroOrMore>
  <zeroOrMore>
    <ref name="contributor"/>
  </zeroOrMore>
  <optional>
    <ref name="edition"/>
  </optional>
  <zeroOrMore>
    <ref name="biblionote"/>
  </zeroOrMore>
  <zeroOrMore>
    <ref name="language"/>
  </zeroOrMore>
  <zeroOrMore>
    <ref name="script"/>
  </zeroOrMore>
  <optional>
    <ref name="abstract"/>
  </optional>
  <optional>
    <ref name="status"/>
  </optional>
  <zeroOrMore>
    <ref name="copyright"/>
  </zeroOrMore>
  <zeroOrMore>
    <ref name="docrelation"/>
  </zeroOrMore>
</define>
<define name="btitle">
  <element name="title">
    <ref name="FormattedString"/>
  </element>
</define>
<define name="bsource">
  <element name="source">
    <ref name="TypedUri"/>
  </element>
</define>
<define name="formattedref">
  <element name="formattedref">
    <ref name="FormattedString"/>
  </element>
</define>
<define name="link">
  <element name="link">
    <ref name="TypedUri"/>
  </element>
</define>
<define name="TypedUri">
  <optional>
    <attribute name="type"/>
  </optional>
  <data type="anyURI"/>
</define>
<define name="bdate">
  <element name="date">
    <attribute name="type">
      <choice>
        <value>published</value>
        <value>accessed</value>
        <value>created</value>
        <value>implemented</value>
        <value>obsoleted</value>
        <value>confirmed</value>
        <value>updated</value>
        <value>issued</value>
      </choice>
    </attribute>
    <!-- ( ( bfrom, bto? ) | date_on ) -->
    <choice>
      <group>
        <element name="from">
          <choice>
            <data type="gYear"/>
            <data type="date"/>
          </choice>
        </element>
        <optional>
          <element name="to">
            <choice>
              <data type="gYear"/>
              <data type="date"/>
            </choice>
          </element>
        </optional>
      </group>
      <element name="on">
        <choice>
          <data type="gYear"/>
          <data type="date"/>
        </choice>
      </element>
    </choice>
  </element>
</define>
<define name="bfrom">
  <element name="from">
    <choice>
      <data type="gYear"/>
      <data type="date"/>
    </choice>
  </element>
</define>
<define name="bto">
  <element name="to">
    <choice>
      <data type="gYear"/>
      <data type="date"/>
    </choice>
  </element>
</define>
<define name="date_on">
  <element name="on">
    <choice>
      <data type="gYear"/>
      <data type="date"/>
    </choice>
  </element>
</define>
<define name="docidentifier">
  <element name="docidentifier">
    <optional>
      <attribute name="type"/>
    </optional>
    <text/>
  </element>
</define>
<define name="biblionote">
  <element name="note">
    <ref name="FormattedString"/>
  </element>
</define>
<define name="abstract">
  <element name="abstract">
    <ref name="FormattedString"/>
  </element>
</define>
<define name="copyright">
  <element name="copyright">
    <ref name="from"/>
    <optional>
      <ref name="to"/>
    </optional>
    <ref name="owner"/>
  </element>
</define>
<define name="from">
  <element name="from">
    <data type="gYear"/>
  </element>
</define>
<define name="to">
  <element name="to">
    <data type="gYear"/>
  </element>
</define>
<define name="owner">
  <element name="owner">
    <ref name="ContributorInfo"/>
  </element>
</define>
<define name="docrelation">
  <element name="relation">
    <attribute name="type">
      <choice>
        <value>parent</value>
        <value>child</value>
        <value>obsoletes</value>
        <value>updates</value>
        <value>updatedBy</value>
        <value>complements</value>
        <value>derivedFrom</value>
        <value>adoptedFrom</value>
        <value>equivalent</value>
        <value>identical</value>
        <value>nonequivalent</value>
      </choice>
    </attribute>
    <element name="bibitem">
      <ref name="BibliographicItem"/>
    </element>
    <zeroOrMore>
      <ref name="locality"/>
    </zeroOrMore>
  </element>
</define>
<!--
  Anycontents = mixed {
  https://github.com/relaxng/jing-trang/issues/211
  https://lists.oasis-open.org/archives/office/200808/msg00024.html
  https://lists.oasis-open.org/archives/office/200808/msg00099.html
  For this to work, we will actually strip any attributes in the Anycontents before
  passing it for validation. Horrible I know, but there are no good alternatives
  that also allow us to do grammar inheritance
  (attribute * { text } | Any)*
         Any*
  }
-->
<define name="AnyElement">
  <element>
    <anyName/>
    <choice>
      <text/>
      <ref name="AnyElement"/>
    </choice>
  </element>
</define>

</grammar>