<?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>