123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!--
- -*- rnc -*-
- RELAX NG Compact Syntax Grammar for the
- Atom Format Specification Version 11
- https://tools.ietf.org/html/rfc4287#appendix-B
- -->
- <grammar ns="http://www.w3.org/1999/xhtml" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:s="http://www.ascc.net/xml/schematron" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
- <start>
- <choice>
- <ref name="atomFeed"/>
- <ref name="atomEntry"/>
- </choice>
- </start>
- <!-- Common attributes -->
- <define name="atomCommonAttributes">
- <optional>
- <attribute name="xml:base">
- <ref name="atomUri"/>
- </attribute>
- </optional>
- <optional>
- <attribute name="xml:lang">
- <ref name="atomLanguageTag"/>
- </attribute>
- </optional>
- <zeroOrMore>
- <ref name="undefinedAttribute"/>
- </zeroOrMore>
- </define>
- <!-- Text Constructs -->
- <define name="atomPlainTextConstruct">
- <ref name="atomCommonAttributes"/>
- <optional>
- <attribute name="type">
- <choice>
- <value>text</value>
- <value>html</value>
- </choice>
- </attribute>
- </optional>
- <text/>
- </define>
- <define name="atomXHTMLTextConstruct">
- <ref name="atomCommonAttributes"/>
- <attribute name="type">
- <value>xhtml</value>
- </attribute>
- <ref name="xhtmlDiv"/>
- </define>
- <define name="atomTextConstruct">
- <choice>
- <ref name="atomPlainTextConstruct"/>
- <ref name="atomXHTMLTextConstruct"/>
- </choice>
- </define>
- <!-- Person Construct -->
- <define name="atomPersonConstruct">
- <ref name="atomCommonAttributes"/>
- <interleave>
- <element name="atom:name">
- <text/>
- </element>
- <optional>
- <element name="atom:uri">
- <ref name="atomUri"/>
- </element>
- </optional>
- <optional>
- <element name="atom:email">
- <ref name="atomEmailAddress"/>
- </element>
- </optional>
- <zeroOrMore>
- <ref name="extensionElement"/>
- </zeroOrMore>
- </interleave>
- </define>
- <!-- Date Construct -->
- <define name="atomDateConstruct">
- <ref name="atomCommonAttributes"/>
- <data type="dateTime"/>
- </define>
- <!-- atom:feed -->
- <define name="atomFeed">
- <element name="atom:feed">
- <s:rule context="atom:feed">
- <s:assert test="atom:author or not(atom:entry[not(atom:author)])">An atom:feed must have an atom:author unless all of its atom:entry children have an atom:author.</s:assert>
- </s:rule>
- <ref name="atomCommonAttributes"/>
- <interleave>
- <zeroOrMore>
- <ref name="atomAuthor"/>
- </zeroOrMore>
- <zeroOrMore>
- <ref name="atomCategory"/>
- </zeroOrMore>
- <zeroOrMore>
- <ref name="atomContributor"/>
- </zeroOrMore>
- <optional>
- <ref name="atomGenerator"/>
- </optional>
- <optional>
- <ref name="atomIcon"/>
- </optional>
- <ref name="atomId"/>
- <zeroOrMore>
- <ref name="atomLink"/>
- </zeroOrMore>
- <optional>
- <ref name="atomLogo"/>
- </optional>
- <optional>
- <ref name="atomRights"/>
- </optional>
- <optional>
- <ref name="atomSubtitle"/>
- </optional>
- <ref name="atomTitle"/>
- <ref name="atomUpdated"/>
- <zeroOrMore>
- <ref name="extensionElement"/>
- </zeroOrMore>
- </interleave>
- <zeroOrMore>
- <ref name="atomEntry"/>
- </zeroOrMore>
- </element>
- </define>
- <!-- atom:entry -->
- <define name="atomEntry">
- <element name="atom:entry">
- <s:rule context="atom:entry">
- <s:assert test="atom:link[@rel='alternate'] or atom:link[not(@rel)] or atom:content">An atom:entry must have at least one atom:link element with a rel attribute of 'alternate' or an atom:content.</s:assert>
- </s:rule>
- <s:rule context="atom:entry">
- <s:assert test="atom:author or ../atom:author or atom:source/atom:author">An atom:entry must have an atom:author if its feed does not.</s:assert>
- </s:rule>
- <ref name="atomCommonAttributes"/>
- <interleave>
- <zeroOrMore>
- <ref name="atomAuthor"/>
- </zeroOrMore>
- <zeroOrMore>
- <ref name="atomCategory"/>
- </zeroOrMore>
- <optional>
- <ref name="atomContent"/>
- </optional>
- <zeroOrMore>
- <ref name="atomContributor"/>
- </zeroOrMore>
- <ref name="atomId"/>
- <zeroOrMore>
- <ref name="atomLink"/>
- </zeroOrMore>
- <optional>
- <ref name="atomPublished"/>
- </optional>
- <optional>
- <ref name="atomRights"/>
- </optional>
- <optional>
- <ref name="atomSource"/>
- </optional>
- <optional>
- <ref name="atomSummary"/>
- </optional>
- <ref name="atomTitle"/>
- <ref name="atomUpdated"/>
- <zeroOrMore>
- <ref name="extensionElement"/>
- </zeroOrMore>
- </interleave>
- </element>
- </define>
- <!-- atom:content -->
- <define name="atomInlineTextContent">
- <element name="atom:content">
- <ref name="atomCommonAttributes"/>
- <optional>
- <attribute name="type">
- <choice>
- <value>text</value>
- <value>html</value>
- </choice>
- </attribute>
- </optional>
- <zeroOrMore>
- <text/>
- </zeroOrMore>
- </element>
- </define>
- <define name="atomInlineXHTMLContent">
- <element name="atom:content">
- <ref name="atomCommonAttributes"/>
- <attribute name="type">
- <value>xhtml</value>
- </attribute>
- <ref name="xhtmlDiv"/>
- </element>
- </define>
- <define name="atomInlineOtherContent">
- <element name="atom:content">
- <ref name="atomCommonAttributes"/>
- <optional>
- <attribute name="type">
- <ref name="atomMediaType"/>
- </attribute>
- </optional>
- <zeroOrMore>
- <choice>
- <text/>
- <ref name="anyElement"/>
- </choice>
- </zeroOrMore>
- </element>
- </define>
- <define name="atomOutOfLineContent">
- <element name="atom:content">
- <ref name="atomCommonAttributes"/>
- <optional>
- <attribute name="type">
- <ref name="atomMediaType"/>
- </attribute>
- </optional>
- <attribute name="src">
- <ref name="atomUri"/>
- </attribute>
- <empty/>
- </element>
- </define>
- <define name="atomContent">
- <choice>
- <ref name="atomInlineTextContent"/>
- <ref name="atomInlineXHTMLContent"/>
- <ref name="atomInlineOtherContent"/>
- <ref name="atomOutOfLineContent"/>
- </choice>
- </define>
- <!-- atom:author -->
- <define name="atomAuthor">
- <element name="atom:author">
- <ref name="atomPersonConstruct"/>
- </element>
- </define>
- <!-- atom:category -->
- <define name="atomCategory">
- <element name="atom:category">
- <ref name="atomCommonAttributes"/>
- <attribute name="term"/>
- <optional>
- <attribute name="scheme">
- <ref name="atomUri"/>
- </attribute>
- </optional>
- <optional>
- <attribute name="label"/>
- </optional>
- <ref name="undefinedContent"/>
- </element>
- </define>
- <!-- atom:contributor -->
- <define name="atomContributor">
- <element name="atom:contributor">
- <ref name="atomPersonConstruct"/>
- </element>
- </define>
- <!-- atom:generator -->
- <define name="atomGenerator">
- <element name="atom:generator">
- <ref name="atomCommonAttributes"/>
- <optional>
- <attribute name="uri">
- <ref name="atomUri"/>
- </attribute>
- </optional>
- <optional>
- <attribute name="version"/>
- </optional>
- <text/>
- </element>
- </define>
- <!-- atom:icon -->
- <define name="atomIcon">
- <element name="atom:icon">
- <ref name="atomCommonAttributes"/>
- <ref name="atomUri"/>
- </element>
- </define>
- <!-- atom:id -->
- <define name="atomId">
- <element name="atom:id">
- <ref name="atomCommonAttributes"/>
- <ref name="atomUri"/>
- </element>
- </define>
- <!-- atom:logo -->
- <define name="atomLogo">
- <element name="atom:logo">
- <ref name="atomCommonAttributes"/>
- <ref name="atomUri"/>
- </element>
- </define>
- <!-- atom:link -->
- <define name="atomLink">
- <element name="atom:link">
- <ref name="atomCommonAttributes"/>
- <attribute name="href">
- <ref name="atomUri"/>
- </attribute>
- <optional>
- <attribute name="rel">
- <choice>
- <ref name="atomNCName"/>
- <ref name="atomUri"/>
- </choice>
- </attribute>
- </optional>
- <optional>
- <attribute name="type">
- <ref name="atomMediaType"/>
- </attribute>
- </optional>
- <optional>
- <attribute name="hreflang">
- <ref name="atomLanguageTag"/>
- </attribute>
- </optional>
- <optional>
- <attribute name="title"/>
- </optional>
- <optional>
- <attribute name="length"/>
- </optional>
- <ref name="undefinedContent"/>
- </element>
- </define>
- <!-- atom:published -->
- <define name="atomPublished">
- <element name="atom:published">
- <ref name="atomDateConstruct"/>
- </element>
- </define>
- <!-- atom:rights -->
- <define name="atomRights">
- <element name="atom:rights">
- <ref name="atomTextConstruct"/>
- </element>
- </define>
- <!-- atom:source -->
- <define name="atomSource">
- <element name="atom:source">
- <ref name="atomCommonAttributes"/>
- <interleave>
- <zeroOrMore>
- <ref name="atomAuthor"/>
- </zeroOrMore>
- <zeroOrMore>
- <ref name="atomCategory"/>
- </zeroOrMore>
- <zeroOrMore>
- <ref name="atomContributor"/>
- </zeroOrMore>
- <optional>
- <ref name="atomGenerator"/>
- </optional>
- <optional>
- <ref name="atomIcon"/>
- </optional>
- <optional>
- <ref name="atomId"/>
- </optional>
- <zeroOrMore>
- <ref name="atomLink"/>
- </zeroOrMore>
- <optional>
- <ref name="atomLogo"/>
- </optional>
- <optional>
- <ref name="atomRights"/>
- </optional>
- <optional>
- <ref name="atomSubtitle"/>
- </optional>
- <optional>
- <ref name="atomTitle"/>
- </optional>
- <optional>
- <ref name="atomUpdated"/>
- </optional>
- <zeroOrMore>
- <ref name="extensionElement"/>
- </zeroOrMore>
- </interleave>
- </element>
- </define>
- <!-- atom:subtitle -->
- <define name="atomSubtitle">
- <element name="atom:subtitle">
- <ref name="atomTextConstruct"/>
- </element>
- </define>
- <!-- atom:summary -->
- <define name="atomSummary">
- <element name="atom:summary">
- <ref name="atomTextConstruct"/>
- </element>
- </define>
- <!-- atom:title -->
- <define name="atomTitle">
- <element name="atom:title">
- <ref name="atomTextConstruct"/>
- </element>
- </define>
- <!-- atom:updated -->
- <define name="atomUpdated">
- <element name="atom:updated">
- <ref name="atomDateConstruct"/>
- </element>
- </define>
- <!-- Low-level simple types -->
- <define name="atomNCName">
- <data type="string">
- <param name="minLength">1</param>
- <param name="pattern">[^:]*</param>
- </data>
- </define>
- <!-- Whatever a media type is, it contains at least one slash -->
- <define name="atomMediaType">
- <data type="string">
- <param name="pattern">.+/.+</param>
- </data>
- </define>
- <!-- As defined in RFC 3066 -->
- <define name="atomLanguageTag">
- <data type="string">
- <param name="pattern">[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*</param>
- </data>
- </define>
- <!--
- Unconstrained; it's not entirely clear how IRI fit into
- xsd:anyURI so let's not try to constrain it here
- -->
- <define name="atomUri">
- <text/>
- </define>
- <!-- Whatever an email address is, it contains at least one @ -->
- <define name="atomEmailAddress">
- <data type="string">
- <param name="pattern">.+@.+</param>
- </data>
- </define>
- <!-- Simple Extension -->
- <define name="simpleExtensionElement">
- <element>
- <anyName>
- <except>
- <nsName ns="http://www.w3.org/2005/Atom"/>
- </except>
- </anyName>
- <text/>
- </element>
- </define>
- <!-- Structured Extension -->
- <define name="structuredExtensionElement">
- <element>
- <anyName>
- <except>
- <nsName ns="http://www.w3.org/2005/Atom"/>
- </except>
- </anyName>
- <choice>
- <group>
- <oneOrMore>
- <attribute>
- <anyName/>
- </attribute>
- </oneOrMore>
- <zeroOrMore>
- <choice>
- <text/>
- <ref name="anyElement"/>
- </choice>
- </zeroOrMore>
- </group>
- <group>
- <zeroOrMore>
- <attribute>
- <anyName/>
- </attribute>
- </zeroOrMore>
- <group>
- <optional>
- <text/>
- </optional>
- <oneOrMore>
- <ref name="anyElement"/>
- </oneOrMore>
- <zeroOrMore>
- <choice>
- <text/>
- <ref name="anyElement"/>
- </choice>
- </zeroOrMore>
- </group>
- </group>
- </choice>
- </element>
- </define>
- <!-- Other Extensibility -->
- <define name="extensionElement">
- <choice>
- <ref name="simpleExtensionElement"/>
- <ref name="structuredExtensionElement"/>
- </choice>
- </define>
- <define name="undefinedAttribute">
- <attribute>
- <anyName>
- <except>
- <name>xml:base</name>
- <name>xml:lang</name>
- <nsName ns=""/>
- </except>
- </anyName>
- </attribute>
- </define>
- <define name="undefinedContent">
- <zeroOrMore>
- <choice>
- <text/>
- <ref name="anyForeignElement"/>
- </choice>
- </zeroOrMore>
- </define>
- <define name="anyElement">
- <element>
- <anyName/>
- <zeroOrMore>
- <choice>
- <attribute>
- <anyName/>
- </attribute>
- <text/>
- <ref name="anyElement"/>
- </choice>
- </zeroOrMore>
- </element>
- </define>
- <define name="anyForeignElement">
- <element>
- <anyName>
- <except>
- <nsName ns="http://www.w3.org/2005/Atom"/>
- </except>
- </anyName>
- <zeroOrMore>
- <choice>
- <attribute>
- <anyName/>
- </attribute>
- <text/>
- <ref name="anyElement"/>
- </choice>
- </zeroOrMore>
- </element>
- </define>
- <!-- XHTML -->
- <define name="anyXHTML">
- <element>
- <nsName/>
- <zeroOrMore>
- <choice>
- <attribute>
- <anyName/>
- </attribute>
- <text/>
- <ref name="anyXHTML"/>
- </choice>
- </zeroOrMore>
- </element>
- </define>
- <define name="xhtmlDiv">
- <element name="xhtml:div">
- <zeroOrMore>
- <choice>
- <attribute>
- <anyName/>
- </attribute>
- <text/>
- <ref name="anyXHTML"/>
- </choice>
- </zeroOrMore>
- </element>
- </define>
- </grammar>
- <!-- EOF -->
|