Annotation of embedaddon/libxml2/test/relaxng/spec_0.xml, revision 1.1.1.1

1.1       misho       1: <?xml version="1.0" encoding="iso-8859-1"?>
                      2: <!DOCTYPE article [
                      3: <!-- ELEMENT declarations work around MSXML bug. -->
                      4: <!ELEMENT section ANY>
                      5: <!ATTLIST section id ID #IMPLIED>
                      6: <!ELEMENT appendix ANY>
                      7: <!ATTLIST appendix id ID #IMPLIED>
                      8: <!ELEMENT bibliomixed ANY>
                      9: <!ATTLIST bibliomixed id ID #IMPLIED>
                     10: ]>
                     11: <article status="Committee Specification" xmlns:p="http://relaxng.org/ns/proofsystem">
                     12: 
                     13: <articleinfo>
                     14: <releaseinfo>$Id: spec.xml,v 1.159 2001/12/02 12:12:12 jjc Exp $</releaseinfo>
                     15: <title>RELAX NG Specification</title>
                     16: <authorgroup>
                     17: <editor>
                     18:   <firstname>James</firstname><surname>Clark</surname>
                     19:   <affiliation>
                     20:     <address><email>jjc@jclark.com</email></address>
                     21:   </affiliation>
                     22: </editor>
                     23: <editor>
                     24:   <surname>MURATA</surname><firstname>Makoto</firstname>
                     25:   <affiliation>
                     26:     <address><email>EB2M-MRT@asahi-net.or.jp</email></address>
                     27:   </affiliation>
                     28: </editor>
                     29: </authorgroup>
                     30: <pubdate>3 December 2001</pubdate>
                     31: <releaseinfo role="meta">
                     32: $Id: spec.xml,v 1.159 2001/12/02 12:12:12 jjc Exp $
                     33: </releaseinfo>
                     34: 
                     35: <copyright><year>2001</year><holder>OASIS</holder></copyright>
                     36: 
                     37: <legalnotice>
                     38: 
                     39: <para>Copyright &#169; The Organization for the Advancement of
                     40: Structured Information Standards [OASIS] 2001. All Rights
                     41: Reserved.</para>
                     42: 
                     43: <para>This document and translations of it may be copied and furnished
                     44: to others, and derivative works that comment on or otherwise explain
                     45: it or assist in its implementation may be prepared, copied, published
                     46: and distributed, in whole or in part, without restriction of any kind,
                     47: provided that the above copyright notice and this paragraph are
                     48: included on all such copies and derivative works. However, this
                     49: document itself may not be modified in any way, such as by removing
                     50: the copyright notice or references to OASIS, except as needed for the
                     51: purpose of developing OASIS specifications, in which case the
                     52: procedures for copyrights defined in the OASIS Intellectual Property
                     53: Rights document must be followed, or as required to translate it into
                     54: languages other than English.</para>
                     55: 
                     56: <para>The limited permissions granted above are perpetual and will not
                     57: be revoked by OASIS or its successors or assigns.</para>
                     58: 
                     59: <para>This document and the information contained herein is provided
                     60: on an <quote>AS IS</quote> basis and OASIS DISCLAIMS ALL WARRANTIES,
                     61: EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE
                     62: USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY
                     63: IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
                     64: PURPOSE.</para>
                     65: 
                     66: </legalnotice>
                     67: 
                     68: <legalnotice role="status"><title>Status of this Document</title>
                     69: 
                     70: <para>This Committee Specification was approved for publication by the
                     71: OASIS RELAX NG technical committee. It is a stable document which
                     72: represents the consensus of the committee. Comments on this document
                     73: may be sent to <ulink
                     74: url="mailto:relax-ng-comment@lists.oasis-open.org"
                     75: >relax-ng-comment@lists.oasis-open.org</ulink>.</para>
                     76: 
                     77: <para>A list of known errors in this document is available at <ulink
                     78: url="http://www.oasis-open.org/committees/relax-ng/spec-20011203-errata.html"
                     79: >http://www.oasis-open.org/committees/relax-ng/spec-20011203-errata.html</ulink
                     80: >.</para>
                     81: 
                     82: </legalnotice>
                     83: 
                     84: <abstract>
                     85: <para>This is the definitive specification of RELAX NG, a simple
                     86: schema language for XML, based on <xref linkend="relax"/> and <xref
                     87: linkend="trex"/>. A RELAX NG schema specifies a pattern for the
                     88: structure and content of an XML document. A RELAX NG schema is itself
                     89: an XML document.</para>
                     90: </abstract>
                     91: 
                     92: <revhistory>
                     93: <revision>
                     94:   <revnumber>Committee Specification</revnumber>
                     95:   <date>3 December 2001</date>
                     96: </revision>
                     97: <revision>
                     98:   <revnumber>Committee Specification</revnumber>
                     99:   <date>11 August 2001</date>
                    100: </revision>
                    101: </revhistory>
                    102: </articleinfo>
                    103: 
                    104: 
                    105: <section>
                    106: <title>Introduction</title>
                    107: 
                    108: <para>This document specifies</para>
                    109: 
                    110: <itemizedlist>
                    111: 
                    112: <listitem><para>when an XML document is a correct RELAX NG
                    113: schema</para></listitem>
                    114: 
                    115: <listitem><para>when an XML document is valid with respect to a
                    116: correct RELAX NG schema</para></listitem>
                    117: 
                    118: </itemizedlist>
                    119: 
                    120: <para>An XML document that is being validated with respect to a RELAX NG
                    121: schema is referred to as an instance.</para>
                    122: 
                    123: <para>The structure of this document is as follows.  <xref
                    124: linkend="data-model"/> describes the data model, which is the
                    125: abstraction of an XML document used throughout the rest of the
                    126: document.  <xref linkend="full-syntax"/> describes the syntax of a
                    127: RELAX NG schema; any correct RELAX NG schema must conform to this
                    128: syntax.  <xref linkend="simplification"/> describes a sequence of
                    129: transformations that are applied to simplify a RELAX NG schema;
                    130: applying the transformations also involves checking certain
                    131: restrictions that must be satisfied by a correct RELAX NG
                    132: schema. <xref linkend="simple-syntax"/> describes the syntax that
                    133: results from applying the transformations; this simple syntax is a
                    134: subset of the full syntax.  <xref linkend="semantics"/> describes the
                    135: semantics of a correct RELAX NG schema that uses the simple syntax;
                    136: the semantics specify when an element is valid with respect to a RELAX
                    137: NG schema.  <xref linkend="restriction"/> describes restrictions in
                    138: terms of the simple syntax; a correct RELAX NG schema must be such
                    139: that, after transformation into the simple form, it satisfies these
                    140: restrictions. Finally, <xref linkend="conformance"/> describes
                    141: conformance requirements for RELAX NG validators.</para>
                    142: 
                    143: <para>A tutorial is available separately (see <xref
                    144: linkend="tutorial"/>).</para>
                    145: 
                    146: </section>
                    147: 
                    148: <section id="data-model">
                    149: <title>Data model</title>
                    150: 
                    151: <para>RELAX NG deals with XML documents representing both schemas and
                    152: instances through an abstract data model.  XML documents representing
                    153: schemas and instances must be well-formed in conformance with <xref
                    154: linkend="xml-rec"/> and must conform to the constraints of <xref
                    155: linkend="xml-names"/>.</para>
                    156: 
                    157: <para>An XML document is represented by an element.  An element consists
                    158: of</para>
                    159: 
                    160: <itemizedlist>
                    161: 
                    162: <listitem><para>a name</para></listitem>
                    163: 
                    164: <listitem><para>a context</para></listitem>
                    165: 
                    166: <listitem><para>a set of attributes</para></listitem>
                    167: 
                    168: <listitem><para>an ordered sequence of zero or more children; each
                    169: child is either an element or a non-empty string; the sequence never contains
                    170: two consecutive strings</para></listitem>
                    171: 
                    172: </itemizedlist>
                    173: 
                    174: <para>A name consists of</para>
                    175: 
                    176: <itemizedlist>
                    177: <listitem><para>a string representing the namespace URI; the empty
                    178: string has special significance, representing the absence of any
                    179: namespace</para></listitem>
                    180: 
                    181: <listitem><para>a string representing the local name; this string matches the NCName
                    182: production of <xref linkend="xml-names"/></para></listitem>
                    183: </itemizedlist>
                    184: 
                    185: <para>A context consists of</para>
                    186: 
                    187: <itemizedlist>
                    188: <listitem><para>a base URI</para></listitem>
                    189: <listitem><para>a namespace map; this maps prefixes to namespace URIs,
                    190: and also may specify a default namespace URI (as declared
                    191: by the <literal>xmlns</literal> attribute)</para></listitem>
                    192: </itemizedlist>
                    193: 
                    194: <para>An attribute consists of</para>
                    195: 
                    196: <itemizedlist>
                    197: <listitem><para>a name</para></listitem>
                    198: <listitem><para>a string representing the value</para></listitem>
                    199: </itemizedlist>
                    200: 
                    201: <para>A string consists of a sequence of zero or more characters,
                    202: where a character is as defined in <xref linkend="xml-rec"/>.</para>
                    203: 
                    204: <para>The element for an XML document is constructed from an instance
                    205: of the <xref linkend="infoset"/> as follows.  We use the notation
                    206: [<replaceable>x</replaceable>] to refer to the value of the
                    207: <replaceable>x</replaceable> property of an information item. An
                    208: element is constructed from a document information item by
                    209: constructing an element from the [document element].  An element is
                    210: constructed from an element information item by constructing the name
                    211: from the [namespace name] and [local name], the context from the [base
                    212: URI] and [in-scope namespaces], the attributes from the [attributes],
                    213: and the children from the [children].  The attributes of an element
                    214: are constructed from the unordered set of attribute information items
                    215: by constructing an attribute for each attribute information item.  The
                    216: children of an element are constructed from the list of child
                    217: information items first by removing information items other than
                    218: element information items and character information items, and then by
                    219: constructing an element for each element information item in the list
                    220: and a string for each maximal sequence of character information items.
                    221: An attribute is constructed from an attribute information item by
                    222: constructing the name from the [namespace name] and [local name], and
                    223: the value from the [normalized value].  When constructing the name of
                    224: an element or attribute from the [namespace name] and [local name], if
                    225: the [namespace name] property is not present, then the name is
                    226: constructed from an empty string and the [local name]. A string is
                    227: constructed from a sequence of character information items by
                    228: constructing a character from the [character code] of each character
                    229: information item.</para>
                    230: 
                    231: <para>It is possible for there to be multiple distinct infosets for a
                    232: single XML document.  This is because XML parsers are not required to
                    233: process all DTD declarations or expand all external parsed general
                    234: entities.  Amongst these multiple infosets, there is exactly one
                    235: infoset for which [all declarations processed] is true and which does
                    236: not contain any unexpanded entity reference information items.  This
                    237: is the infoset that is the basis for defining the RELAX NG data
                    238: model.</para>
                    239: 
                    240: <section id="data-model-example">
                    241: <title>Example</title>
                    242: 
                    243: <para>Suppose the document
                    244: <literal>http://www.example.com/doc.xml</literal> is as
                    245: follows:</para>
                    246: 
                    247: <programlisting><![CDATA[<?xml version="1.0"?>
                    248: <foo><pre1:bar1 xmlns:pre1="http://www.example.com/n1"/><pre2:bar2
                    249:   xmlns:pre2="http://www.example.com/n2"/></foo>
                    250: ]]></programlisting>
                    251: 
                    252: <para>The element representing this document has</para>
                    253: 
                    254: <itemizedlist>
                    255: <listitem><para>a name which has</para>
                    256: <itemizedlist>
                    257: 
                    258: <listitem><para>the empty string as the namespace URI, representing
                    259: the absence of any namespace</para></listitem>
                    260: 
                    261: <listitem><para><literal>foo</literal> as the local
                    262: name</para></listitem>
                    263: 
                    264: </itemizedlist>
                    265: 
                    266: </listitem>
                    267: 
                    268: <listitem><para>a context which has</para>
                    269: 
                    270: <itemizedlist>
                    271: <listitem><para><literal>http://www.example.com/doc.xml</literal> as the base
                    272: URI</para></listitem>
                    273: 
                    274: <listitem><para>a namespace map which</para>
                    275: 
                    276: <itemizedlist>
                    277: 
                    278: <listitem><para>maps the prefix <literal>xml</literal> to the
                    279: namespace URI
                    280: <literal>http://www.w3.org/XML/1998/namespace</literal>
                    281: (the <literal>xml</literal> prefix is implicitly declared
                    282: by every XML document)</para></listitem>
                    283: 
                    284: <listitem><para>specifies the empty string as the default namespace
                    285: URI</para></listitem>
                    286: 
                    287: </itemizedlist>
                    288: 
                    289: </listitem>
                    290: 
                    291: </itemizedlist>
                    292: 
                    293: </listitem>
                    294: 
                    295: <listitem><para>an empty set of attributes</para></listitem>
                    296: 
                    297: <listitem><para>a sequence of children consisting
                    298: of an element which has</para>
                    299: 
                    300: <itemizedlist>
                    301: <listitem><para>a name which has</para>
                    302: <itemizedlist>
                    303: 
                    304: <listitem><para><literal>http://www.example.com/n1</literal> as the
                    305: namespace URI</para></listitem>
                    306: 
                    307: <listitem><para><literal>bar1</literal> as the local
                    308: name</para></listitem>
                    309: 
                    310: </itemizedlist>
                    311: 
                    312: </listitem>
                    313: 
                    314: <listitem><para>a context which has</para>
                    315: 
                    316: <itemizedlist>
                    317: <listitem><para><literal>http://www.example.com/doc.xml</literal> as the base
                    318: URI</para></listitem>
                    319: 
                    320: <listitem><para>a namespace map which</para>
                    321: 
                    322: <itemizedlist>
                    323: 
                    324: <listitem><para>maps the prefix <literal>pre1</literal> to the
                    325: namespace URI
                    326: <literal>http://www.example.com/n1</literal></para></listitem>
                    327: 
                    328: <listitem><para>maps the prefix <literal>xml</literal> to the
                    329: namespace URI
                    330: <literal>http://www.w3.org/XML/1998/namespace</literal></para></listitem>
                    331: 
                    332: <listitem><para>specifies the empty string as the default namespace
                    333: URI</para></listitem>
                    334: 
                    335: </itemizedlist>
                    336: 
                    337: </listitem>
                    338: 
                    339: </itemizedlist>
                    340: 
                    341: </listitem>
                    342: 
                    343: <listitem><para>an empty set of attributes</para></listitem>
                    344: 
                    345: <listitem><para>an empty sequence of children</para></listitem>
                    346: 
                    347: </itemizedlist>
                    348: 
                    349: <para>followed by an element which has</para>
                    350:  
                    351: <itemizedlist>
                    352: <listitem><para>a name which has</para>
                    353: <itemizedlist>
                    354: 
                    355: <listitem><para><literal>http://www.example.com/n2</literal> as the
                    356: namespace URI</para></listitem>
                    357: 
                    358: <listitem><para><literal>bar2</literal> as the local
                    359: name</para></listitem>
                    360: 
                    361: </itemizedlist>
                    362: 
                    363: </listitem>
                    364: 
                    365: <listitem><para>a context which has</para>
                    366: 
                    367: <itemizedlist>
                    368: <listitem><para><literal>http://www.example.com/doc.xml</literal> as the base
                    369: URI</para></listitem>
                    370: 
                    371: <listitem><para>a namespace map which</para>
                    372: 
                    373: <itemizedlist>
                    374: 
                    375: <listitem><para>maps the prefix <literal>pre2</literal> to the
                    376: namespace URI
                    377: <literal>http://www.example.com/n2</literal></para></listitem>
                    378: 
                    379: <listitem><para>maps the prefix <literal>xml</literal> to the
                    380: namespace URI
                    381: <literal>http://www.w3.org/XML/1998/namespace</literal></para></listitem>
                    382: 
                    383: <listitem><para>specifies the empty string as the default namespace
                    384: URI</para></listitem>
                    385: 
                    386: </itemizedlist>
                    387: 
                    388: </listitem>
                    389: 
                    390: </itemizedlist>
                    391: 
                    392: </listitem>
                    393: 
                    394: <listitem><para>an empty set of attributes</para></listitem>
                    395: 
                    396: <listitem><para>an empty sequence of children</para></listitem>
                    397: 
                    398: </itemizedlist>
                    399: 
                    400: </listitem>
                    401: </itemizedlist>
                    402: 
                    403: </section>
                    404: 
                    405: </section>
                    406: 
                    407: <section id="full-syntax">
                    408: <title>Full syntax</title>
                    409: 
                    410: <para>The following grammar summarizes the syntax of RELAX NG.
                    411: Although we use a notation based on the XML representation of an RELAX
                    412: NG schema as a sequence of characters, the grammar must be understood
                    413: as operating at the data model level.  For example, although the
                    414: syntax uses <literal><![CDATA[<text/>]]></literal>, an instance or
                    415: schema can use <literal><![CDATA[<text></text>]]></literal> instead,
                    416: because they both represent the same element at the data model level.
                    417: All elements shown in the grammar are qualified with the namespace
                    418: URI:</para>
                    419: 
                    420: <programlisting>http://relaxng.org/ns/structure/1.0</programlisting>
                    421: 
                    422: <para>The symbols QName and NCName are defined in <xref
                    423: linkend="xml-names"/>.  The anyURI symbol has the same meaning as the
                    424: anyURI datatype of <xref linkend="xmlschema-2"/>: it indicates a
                    425: string that, after escaping of disallowed values as described in
                    426: Section 5.4 of <xref linkend="xlink"/>, is a URI reference as defined
                    427: in <xref linkend="rfc2396"/> (as modified by <xref
                    428: linkend="rfc2732"/>).  The symbol string matches any string.</para>
                    429: 
                    430: <para>In addition to the attributes shown explicitly, any element can
                    431: have an <literal>ns</literal> attribute and any element can have a
                    432: <literal>datatypeLibrary</literal> attribute. The
                    433: <literal>ns</literal> attribute can have any value.  The value of the
                    434: <literal>datatypeLibrary</literal> attribute must match the anyURI
                    435: symbol as described in the previous paragraph; in addition, it must
                    436: not use the relative form of URI reference and must not have a
                    437: fragment identifier; as an exception to this, the value may be the
                    438: empty string.</para>
                    439: 
                    440: <para>Any element can also have foreign attributes in addition to the
                    441: attributes shown in the grammar. A foreign attribute is an attribute
                    442: with a name whose namespace URI is neither the empty string nor the
                    443: RELAX NG namespace URI.  Any element that cannot have string children
                    444: (that is, any element other than <literal>value</literal>, <literal>param</literal>
                    445: and <literal>name</literal>) may have foreign child elements in addition
                    446: to the child elements shown in the grammar. A foreign element is an
                    447: element with a name whose namespace URI is not the RELAX NG namespace
                    448: URI.  There are no constraints on the relative position of foreign
                    449: child elements with respect to other child elements.</para>
                    450: 
                    451: <para>Any element can also have as children strings that consist
                    452: entirely of whitespace characters, where a whitespace character is one
                    453: of #x20, #x9, #xD or #xA. There are no constraints on the relative
                    454: position of whitespace string children with respect to child
                    455: elements.</para>
                    456: 
                    457: <para>Leading and trailing whitespace is allowed for value of each
                    458: <literal>name</literal>, <literal>type</literal> and
                    459: <literal>combine</literal> attribute and for the content of each
                    460: <literal>name</literal> element.</para>
                    461: 
                    462: <grammarref src="full.rng"/>
                    463: 
                    464: <section id="full-syntax-example">
                    465: <title>Example</title>
                    466: 
                    467: <para>Here is an example of a schema in the full syntax for the
                    468: document in <xref linkend="data-model-example"/>.</para>
                    469: 
                    470: <programlisting><![CDATA[<?xml version="1.0"?>
                    471: <element name="foo"
                    472:          xmlns="http://relaxng.org/ns/structure/1.0"
                    473:          xmlns:a="http://relaxng.org/ns/annotation/1.0"
                    474:          xmlns:ex1="http://www.example.com/n1"
                    475:          xmlns:ex2="http://www.example.com/n2">
                    476:   <a:documentation>A foo element.</a:document>
                    477:   <element name="ex1:bar1">
                    478:     <empty/>
                    479:   </element>
                    480:   <element name="ex2:bar2">
                    481:     <empty/>
                    482:   </element>
                    483: </element>]]></programlisting>
                    484: 
                    485: </section>
                    486: 
                    487: </section>
                    488: 
                    489: <section id="simplification">
                    490: <title>Simplification</title>
                    491: 
                    492: <para>The full syntax given in the previous section is transformed
                    493: into a simpler syntax by applying the following transformation rules
                    494: in order. The effect must be as if each rule was applied to all
                    495: elements in the schema before the next rule is applied.  A
                    496: transformation rule may also specify constraints that must be
                    497: satisfied by a correct schema. The transformation rules are applied
                    498: at the data model level.  Before the transformations are applied, the
                    499: schema is parsed into an instance of the data model.</para>
                    500: 
                    501: <section>
                    502: <title>Annotations</title>
                    503: 
                    504: <para>Foreign attributes and elements are removed.</para>
                    505: 
                    506: <note><para>It is safe to remove <literal>xml:base</literal>
                    507: attributes at this stage because <literal>xml:base</literal>
                    508: attributes are used in determining the [base URI] of an element
                    509: information item, which is in turn used to construct the base URI of
                    510: the context of an element.  Thus, after a document has been parsed
                    511: into an instance of the data model, <literal>xml:base</literal>
                    512: attributes can be discarded.</para></note>
                    513: 
                    514: </section>
                    515: 
                    516: <section>
                    517: <title>Whitespace</title>
                    518: 
                    519: <para>For each element other than <literal>value</literal> and
                    520: <literal>param</literal>, each child that is a string containing only
                    521: whitespace characters is removed.</para>
                    522: 
                    523: <para>Leading and trailing whitespace characters are removed from the
                    524: value of each <literal>name</literal>, <literal>type</literal> and
                    525: <literal>combine</literal> attribute and from the content of each
                    526: <literal>name</literal> element.</para>
                    527: 
                    528: </section>
                    529: 
                    530: <section>
                    531: <title><literal>datatypeLibrary</literal> attribute</title>
                    532: 
                    533: <para>The value of each <literal>datatypeLibary</literal> attribute is
                    534: transformed by escaping disallowed characters as specified in Section
                    535: 5.4 of <xref linkend="xlink"/>.</para>
                    536: 
                    537: <para>For any <literal>data</literal> or <literal>value</literal>
                    538: element that does not have a <literal>datatypeLibrary</literal>
                    539: attribute, a <literal>datatypeLibrary</literal> attribute is
                    540: added. The value of the added <literal>datatypeLibrary</literal>
                    541: attribute is the value of the <literal>datatypeLibrary</literal>
                    542: attribute of the nearest ancestor element that has a
                    543: <literal>datatypeLibrary</literal> attribute, or the empty string if
                    544: there is no such ancestor. Then, any <literal>datatypeLibrary</literal>
                    545: attribute that is on an element other than <literal>data</literal> or
                    546: <literal>value</literal> is removed.</para>
                    547: 
                    548: </section>
                    549: 
                    550: <section>
                    551: <title><literal>type</literal> attribute of <literal>value</literal> element</title>
                    552: 
                    553: <para>For any <literal>value</literal> element that does not have a
                    554: <literal>type</literal> attribute, a <literal>type</literal> attribute
                    555: is added with value <literal>token</literal> and the value of the
                    556: <literal>datatypeLibrary</literal> attribute is changed to the empty
                    557: string.</para>
                    558: 
                    559: </section>
                    560: 
                    561: <section id="href">
                    562: <title><literal>href</literal> attribute</title>
                    563: 
                    564: <para>The value of the <literal>href</literal> attribute on an
                    565: <literal>externalRef</literal> or <literal>include</literal> element
                    566: is first transformed by escaping disallowed characters as specified in
                    567: Section 5.4 of <xref linkend="xlink"/>.  The URI reference is then
                    568: resolved into an absolute form as described in section 5.2 of <xref
                    569: linkend="rfc2396"/> using the base URI from the context of the element
                    570: that bears the <literal>href</literal> attribute.</para>
                    571: 
                    572: <para>The value of the <literal>href</literal> attribute will be used
                    573: to construct an element (as specified in <xref
                    574: linkend="data-model"/>). This must be done as follows.  The URI
                    575: reference consists of the URI itself and an optional fragment
                    576: identifier. The resource identified by the URI is retrieved.  The
                    577: result is a MIME entity: a sequence of bytes labeled with a MIME
                    578: media type.  The media type determines how an element is constructed
                    579: from the MIME entity and optional fragment identifier.  When the media
                    580: type is <literal>application/xml</literal> or
                    581: <literal>text/xml</literal>, the MIME entity must be parsed as an XML
                    582: document in accordance with the applicable RFC (at the term of writing
                    583: <xref linkend="rfc3023"/>) and an element constructed from the result
                    584: of the parse as specified in <xref linkend="data-model"/>.  In
                    585: particular, the <literal>charset</literal> parameter must be handled
                    586: as specified by the RFC. This specification does not define the
                    587: handling of media types other than <literal>application/xml</literal>
                    588: and <literal>text/xml</literal>. The <literal>href</literal> attribute
                    589: must not include a fragment identifier unless the registration of the
                    590: media type of the resource identified by the attribute defines the
                    591: interpretation of fragment identifiers for that media type.</para>
                    592: 
                    593: <note><para><xref linkend="rfc3023"/> does not define the
                    594: interpretation of fragment identifiers for
                    595: <literal>application/xml</literal> or
                    596: <literal>text/xml</literal>.</para></note>
                    597: 
                    598: </section>
                    599: 
                    600: <section>
                    601: <title><literal>externalRef</literal> element</title>
                    602: 
                    603: <para>An <literal>externalRef</literal> element is transformed as
                    604: follows.  An element is constructed using the URI reference that is
                    605: the value of <literal>href</literal> attribute as specified in <xref
                    606: linkend="href"/>. This element must match the syntax for pattern.  The
                    607: element is transformed by recursively applying the rules from this
                    608: subsection and from previous subsections of this section. This must
                    609: not result in a loop. In other words, the transformation of the
                    610: referenced element must not require the dereferencing of an
                    611: <literal>externalRef</literal> attribute with an
                    612: <literal>href</literal> attribute with the same value.</para>
                    613: 
                    614: <para>Any <literal>ns</literal> attribute on the
                    615: <literal>externalRef</literal> element is transferred to the
                    616: referenced element if the referenced element does not already have an
                    617: <literal>ns</literal> attribute.  The <literal>externalRef</literal>
                    618: element is then replaced by the referenced element.</para>
                    619: 
                    620: </section>
                    621: 
                    622: <section>
                    623: <title><literal>include</literal> element</title>
                    624: 
                    625: <para>An <literal>include</literal> element is transformed as follows.
                    626: An element is constructed using the URI reference that is the value of
                    627: <literal>href</literal> attribute as specified in <xref
                    628: linkend="href"/>.  This element must be a <literal>grammar</literal>
                    629: element, matching the syntax for grammar.</para>
                    630: 
                    631: <para>This <literal>grammar</literal> element is transformed by
                    632: recursively applying the rules from this subsection and from previous
                    633: subsections of this section.  This must not result in a loop. In other
                    634: words, the transformation of the <literal>grammar</literal> element
                    635: must not require the dereferencing of an <literal>include</literal>
                    636: attribute with an <literal>href</literal> attribute with the same
                    637: value.</para>
                    638: 
                    639: <para>Define the <firstterm>components</firstterm> of an element to
                    640: be the children of the element together with the components of any
                    641: <literal>div</literal> child elements.  If the
                    642: <literal>include</literal> element has a <literal>start</literal>
                    643: component, then the <literal>grammar</literal> element must have a
                    644: <literal>start</literal> component.  If the <literal>include</literal>
                    645: element has a <literal>start</literal> component, then all
                    646: <literal>start</literal> components are removed from the
                    647: <literal>grammar</literal> element.  If the <literal>include</literal>
                    648: element has a <literal>define</literal> component, then the
                    649: <literal>grammar</literal> element must have a
                    650: <literal>define</literal> component with the same name.  For every
                    651: <literal>define</literal> component of the <literal>include</literal>
                    652: element, all <literal>define</literal> components with the same name
                    653: are removed from the <literal>grammar</literal> element.</para>
                    654: 
                    655: <para>The <literal>include</literal> element is transformed into a
                    656: <literal>div</literal> element.  The attributes of the
                    657: <literal>div</literal> element are the attributes of the
                    658: <literal>include</literal> element other than the
                    659: <literal>href</literal> attribute.  The children of the
                    660: <literal>div</literal> element are the <literal>grammar</literal>
                    661: element (after the removal of the <literal>start</literal> and
                    662: <literal>define</literal> components described by the preceding
                    663: paragraph) followed by the children of the <literal>include</literal>
                    664: element.  The <literal>grammar</literal> element is then renamed to
                    665: <literal>div</literal>.</para>
                    666: 
                    667: </section>
                    668: 
                    669: <section>
                    670: <title><literal>name</literal> attribute of <literal>element</literal>
                    671: and <literal>attribute</literal> elements</title>
                    672: 
                    673: <para>The <literal>name</literal> attribute on an
                    674: <literal>element</literal> or <literal>attribute</literal> element is
                    675: transformed into a <literal>name</literal> child element.</para>
                    676: 
                    677: <para>If an <literal>attribute</literal> element has a
                    678: <literal>name</literal> attribute but no <literal>ns</literal>
                    679: attribute, then an <literal>ns=""</literal> attribute is added to the
                    680: <literal>name</literal> child element.</para>
                    681: 
                    682: </section>
                    683: 
                    684: <section>
                    685: <title><literal>ns</literal> attribute</title>
                    686: 
                    687: <para>For any <literal>name</literal>, <literal>nsName</literal> or
                    688: <literal>value</literal> element that does not have an
                    689: <literal>ns</literal> attribute, an <literal>ns</literal> attribute is
                    690: added. The value of the added <literal>ns</literal> attribute is the
                    691: value of the <literal>ns</literal> attribute of the nearest ancestor
                    692: element that has an <literal>ns</literal> attribute, or the empty
                    693: string if there is no such ancestor. Then, any <literal>ns</literal>
                    694: attribute that is on an element other than <literal>name</literal>,
                    695: <literal>nsName</literal> or <literal>value</literal> is
                    696: removed.</para>
                    697: 
                    698: <note><para>The value of the <literal>ns</literal> attribute is
                    699: <emphasis role="strong">not</emphasis> transformed either by escaping
                    700: disallowed characters, or in any other way, because the value of the
                    701: <literal>ns</literal> attribute is compared against namespace URIs in
                    702: the instance, which are not subject to any
                    703: transformation.</para></note>
                    704: 
                    705: <note><para>Since <literal>include</literal> and
                    706: <literal>externalRef</literal> elements are resolved after
                    707: <literal>datatypeLibrary</literal> attributes are added but before
                    708: <literal>ns</literal> attributes are added, <literal>ns</literal>
                    709: attributes are inherited into external schemas but
                    710: <literal>datatypeLibrary</literal> attributes are not.</para></note>
                    711: 
                    712: </section>
                    713: 
                    714: <section>
                    715: <title>QNames</title>
                    716: 
                    717: <para>For any <literal>name</literal> element containing a prefix, the
                    718: prefix is removed and an <literal>ns</literal> attribute is added
                    719: replacing any existing <literal>ns</literal> attribute. The value of
                    720: the added <literal>ns</literal> attribute is the value to which the
                    721: namespace map of the context of the <literal>name</literal> element
                    722: maps the prefix.  The context must have a mapping for the
                    723: prefix.</para>
                    724: 
                    725: </section>
                    726: 
                    727: <section>
                    728: <title><literal>div</literal> element</title>
                    729: 
                    730: <para>Each <literal>div</literal> element is replaced by its
                    731: children.</para>
                    732: 
                    733: </section>
                    734: 
                    735: <section id="number-child-elements">
                    736: <title>Number of child elements</title>
                    737: 
                    738: <para>A <literal>define</literal>, <literal>oneOrMore</literal>,
                    739: <literal>zeroOrMore</literal>, <literal>optional</literal>, <literal>list</literal> or
                    740: <literal>mixed</literal> element is transformed so that it has exactly
                    741: one child element.  If it has more than one child element, then its
                    742: child elements are wrapped in a <literal>group</literal>
                    743: element. Similarly, an <literal>element</literal> element is transformed so
                    744: that it has exactly two child elements, the first being a name class
                    745: and the second being a pattern. If it has more than two child elements,
                    746: then the child elements other than the first are wrapped in a
                    747: <literal>group</literal> element.</para>
                    748: 
                    749: <para>A <literal>except</literal> element is transformed
                    750: so that it has exactly one child element. If it has more
                    751: than one child element, then its child elements are wrapped
                    752: in a <literal>choice</literal> element.</para>
                    753: 
                    754: <para>If an <literal>attribute</literal> element has only one child
                    755: element (a name class), then a <literal>text</literal> element is
                    756: added.</para>
                    757: 
                    758: <para>A <literal>choice</literal>, <literal>group</literal> or
                    759: <literal>interleave</literal> element is transformed so that it has
                    760: exactly two child elements. If it has one child element, then it is
                    761: replaced by its child element.  If it has more than two child
                    762: elements, then the first two child elements are combined into a new
                    763: element with the same name as the parent element and with the first
                    764: two child elements as its children.  For example,</para>
                    765: 
                    766: <programlisting>&lt;choice&gt; <replaceable>p1</replaceable> <replaceable>p2</replaceable> <replaceable>p3</replaceable> &lt;/choice&gt;</programlisting>
                    767: 
                    768: <para>is transformed to</para>
                    769: 
                    770: <programlisting>&lt;choice&gt; &lt;choice&gt; <replaceable>p1</replaceable> <replaceable>p2</replaceable> &lt;/choice&gt; <replaceable>p3</replaceable> &lt;/choice&gt;</programlisting>
                    771: 
                    772: <para>This reduces the number of child elements by one. The
                    773: transformation is applied repeatedly until there are exactly two child
                    774: elements.</para>
                    775: 
                    776: </section>
                    777: 
                    778: <section>
                    779: <title><literal>mixed</literal> element</title>
                    780: 
                    781: <para>A <literal>mixed</literal> element is transformed into an
                    782: interleaving with a <literal>text</literal> element:</para>
                    783: 
                    784: <programlisting>&lt;mixed> <replaceable>p</replaceable> &lt;/mixed></programlisting>
                    785: 
                    786: <para>is transformed into</para>
                    787: 
                    788: <programlisting>&lt;interleave> <replaceable>p</replaceable> &lt;text/> &lt;/interleave></programlisting>
                    789: 
                    790: </section>
                    791: 
                    792: <section>
                    793: <title><literal>optional</literal> element</title>
                    794: 
                    795: <para>An <literal>optional</literal> element is transformed into
                    796: a choice with <literal>empty</literal>:</para>
                    797: 
                    798: <programlisting>&lt;optional> <replaceable>p</replaceable> &lt;/optional></programlisting>
                    799: 
                    800: <para>is transformed into</para>
                    801: 
                    802: <programlisting>&lt;choice> <replaceable>p</replaceable> &lt;empty/> &lt;/choice></programlisting>
                    803: 
                    804: </section>
                    805: 
                    806: <section>
                    807: <title><literal>zeroOrMore</literal> element</title>
                    808: 
                    809: <para>A <literal>zeroOrMore</literal> element is transformed into a choice
                    810: between <literal>oneOrMore</literal> and
                    811: <literal>empty</literal>:</para>
                    812: 
                    813: <programlisting>&lt;zeroOrMore> <replaceable>p</replaceable> &lt;/zeroOrMore></programlisting>
                    814: 
                    815: <para>is transformed into</para>
                    816: 
                    817: <programlisting>&lt;choice> &lt;oneOrMore> <replaceable>p</replaceable> &lt;/oneOrMore> &lt;empty/> &lt;/choice></programlisting>
                    818: 
                    819: </section>
                    820: 
                    821: <section id="constraints">
                    822: <title>Constraints</title>
                    823: 
                    824: <para>In this rule, no transformation is performed, but various
                    825: constraints are checked.</para>
                    826: 
                    827: <note><para>The constraints in this section, unlike the constraints
                    828: specified in <xref linkend="restriction"/>, can be checked without
                    829: resolving any <literal>ref</literal> elements, and are accordingly
                    830: applied even to patterns that will disappear during later stages of
                    831: simplification because they are not reachable (see <xref
                    832: linkend="define-ref"/>) or because of <literal>notAllowed</literal>
                    833: (see <xref linkend="notAllowed"/>).</para></note>
                    834: 
                    835: <para>An <literal>except</literal> element that is a child of an
                    836: <literal>anyName</literal> element must not have any
                    837: <literal>anyName</literal> descendant elements. An
                    838: <literal>except</literal> element that is a child of an
                    839: <literal>nsName</literal> element must not have any
                    840: <literal>nsName</literal> or <literal>anyName</literal> descendant
                    841: elements.</para>
                    842: 
                    843: <para>A <literal>name</literal> element that occurs as the first child
                    844: of an <literal>attribute</literal> element or as the descendant of the
                    845: first child of an <literal>attribute</literal> element and that has an
                    846: <literal>ns</literal> attribute with value equal to the empty string
                    847: must not have content equal to <literal>xmlns</literal>.</para>
                    848: 
                    849: <para>A <literal>name</literal> or <literal>nsName</literal> element
                    850: that occurs as the first child of an <literal>attribute</literal>
                    851: element or as the descendant of the first child of an
                    852: <literal>attribute</literal> element must not have an
                    853: <literal>ns</literal> attribute with value
                    854: <literal>http://www.w3.org/2000/xmlns</literal>.</para>
                    855: 
                    856: <note><para>The <xref linkend="infoset"/> defines the namespace URI of
                    857: namespace declaration attributes to be
                    858: <literal>http://www.w3.org/2000/xmlns</literal>.</para></note>
                    859: 
                    860: <para>A <literal>data</literal> or <literal>value</literal> element
                    861: must be correct in its use of datatypes. Specifically, the
                    862: <literal>type</literal> attribute must identify a datatype within the
                    863: datatype library identified by the value of the
                    864: <literal>datatypeLibrary</literal> attribute.  For a
                    865: <literal>data</literal> element, the parameter list must be one that
                    866: is allowed by the datatype (see <xref
                    867: linkend="data-pattern"/>).</para>
                    868: 
                    869: </section>
                    870: 
                    871: <section>
                    872: <title><literal>combine</literal> attribute</title>
                    873: 
                    874: <para>For each <literal>grammar</literal> element, all
                    875: <literal>define</literal> elements with the same name are combined
                    876: together.  For any name, there must not be more than one
                    877: <literal>define</literal> element with that name that does not have a
                    878: <literal>combine</literal> attribute.  For any name, if there is a
                    879: <literal>define</literal> element with that name that has a
                    880: <literal>combine</literal> attribute with the value
                    881: <literal>choice</literal>, then there must not also be a
                    882: <literal>define</literal> element with that name that has a
                    883: <literal>combine</literal> attribute with the value
                    884: <literal>interleave</literal>. Thus, for any name, if there is more
                    885: than one <literal>define</literal> element with that name, then there
                    886: is a unique value for the <literal>combine</literal> attribute for
                    887: that name.  After determining this unique value, the
                    888: <literal>combine</literal> attributes are removed.  A pair of
                    889: definitions</para>
                    890: 
                    891: <programlisting>&lt;define name="<replaceable>n</replaceable>"&gt;
                    892:   <replaceable>p1</replaceable>
                    893: &lt;/define>
                    894: &lt;define name="<replaceable>n</replaceable>"&gt;
                    895:   <replaceable>p2</replaceable>
                    896: &lt;/define></programlisting>
                    897: 
                    898: <para>is combined into</para>
                    899: 
                    900: <programlisting>&lt;define name="<replaceable>n</replaceable>">
                    901:   &lt;<replaceable>c</replaceable>&gt;
                    902:     <replaceable>p1</replaceable>
                    903:     <replaceable>p2</replaceable>
                    904:   &lt;/<replaceable>c</replaceable>&gt;
                    905: &lt;/define></programlisting>
                    906: 
                    907: <para>where <replaceable>c</replaceable> is the value of the
                    908: <literal>combine</literal> attribute. Pairs of definitions are
                    909: combined until there is exactly one <literal>define</literal> element
                    910: for each name.</para>
                    911: 
                    912: <para>Similarly, for each <literal>grammar</literal> element all
                    913: <literal>start</literal> elements are combined together.  There must
                    914: not be more than one <literal>start</literal> element that does not
                    915: have a <literal>combine</literal> attribute.  If there is a
                    916: <literal>start</literal> element that has a <literal>combine</literal>
                    917: attribute with the value <literal>choice</literal>, there must not
                    918: also be a <literal>start</literal> element that has a
                    919: <literal>combine</literal> attribute with the value
                    920: <literal>interleave</literal>.</para>
                    921: 
                    922: </section>
                    923: 
                    924: <section>
                    925: <title><literal>grammar</literal> element</title>
                    926: 
                    927: <para>In this rule, the schema is transformed so that its top-level
                    928: element is <literal>grammar</literal> and so that it has no other
                    929: <literal>grammar</literal> elements.</para>
                    930: 
                    931: <para>Define the <firstterm>in-scope grammar</firstterm> for an
                    932: element to be the nearest ancestor <literal>grammar</literal> element.  A
                    933: <literal>ref</literal> element <firstterm>refers to</firstterm> a
                    934: <literal>define</literal> element if the value of their
                    935: <literal>name</literal> attributes is the same and their in-scope
                    936: grammars are the same.  A <literal>parentRef</literal> element
                    937: <firstterm>refers to</firstterm> a <literal>define</literal> element
                    938: if the value of their <literal>name</literal> attributes is the same
                    939: and the in-scope grammar of the in-scope grammar of the
                    940: <literal>parentRef</literal> element is the same as the in-scope
                    941: grammar of the <literal>define</literal> element. Every
                    942: <literal>ref</literal> or <literal>parentRef</literal> element must
                    943: refer to a <literal>define</literal> element.  A
                    944: <literal>grammar</literal> must have a <literal>start</literal> child
                    945: element.</para>
                    946: 
                    947: <para>First, transform the top-level pattern
                    948: <replaceable>p</replaceable> into
                    949: <literal>&lt;grammar>&lt;start><replaceable>p</replaceable>&lt;/start>&lt;/grammar></literal>.
                    950: Next, rename <literal>define</literal> elements so that no two
                    951: <literal>define</literal> elements anywhere in the schema have the
                    952: same name.  To rename a <literal>define</literal> element, change the
                    953: value of its <literal>name</literal> attribute and change the value of
                    954: the <literal>name</literal> attribute of all <literal>ref</literal>
                    955: and <literal>parentRef</literal> elements that refer to that
                    956: <literal>define</literal> element. Next, move all
                    957: <literal>define</literal> elements to be children of the top-level
                    958: <literal>grammar</literal> element, replace each nested
                    959: <literal>grammar</literal> element by the child of its
                    960: <literal>start</literal> element and rename each
                    961: <literal>parentRef</literal> element to <literal>ref</literal>.</para>
                    962: 
                    963: </section>
                    964: 
                    965: 
                    966: <section id="define-ref">
                    967: <title><literal>define</literal> and <literal>ref</literal> elements</title>
                    968: 
                    969: <para>In this rule, the grammar is transformed so that every
                    970: <literal>element</literal> element is the child of a
                    971: <literal>define</literal> element, and the child of every
                    972: <literal>define</literal> element is an <literal>element</literal>
                    973: element.</para>
                    974: 
                    975: <para>First, remove any <literal>define</literal> element that is not
                    976: <firstterm>reachable</firstterm>.  A <literal>define</literal> element
                    977: is reachable if there is reachable <literal>ref</literal> element
                    978: referring to it.  A <literal>ref</literal> element is reachable if it
                    979: is the descendant of the <literal>start</literal> element or of a
                    980: reachable <literal>define</literal> element. Now, for
                    981: each <literal>element</literal> element that is not the child of a
                    982: <literal>define</literal> element, add a <literal>define</literal>
                    983: element to the <literal>grammar</literal> element, and replace the
                    984: <literal>element</literal> element by a <literal>ref</literal> element
                    985: referring to the added <literal>define</literal> element. The value of
                    986: the <literal>name</literal> attribute of the added
                    987: <literal>define</literal> element must be different from value of the
                    988: <literal>name</literal> attribute of all other
                    989: <literal>define</literal> elements. The child of the added
                    990: <literal>define</literal> element is the <literal>element</literal>
                    991: element.</para>
                    992: 
                    993: <para>Define a <literal>ref</literal> element to be
                    994: <firstterm>expandable</firstterm> if it refers to a
                    995: <literal>define</literal> element whose child is not an
                    996: <literal>element</literal> element.  For each <literal>ref</literal>
                    997: element that is expandable and is a descendant of a
                    998: <literal>start</literal> element or an <literal>element</literal>
                    999: element, expand it by replacing the <literal>ref</literal> element by
                   1000: the child of the <literal>define</literal> element to which it refers and
                   1001: then recursively expanding any expandable <literal>ref</literal>
                   1002: elements in this replacement.  This must not result in a loop.
                   1003: In other words expanding the replacement of a
                   1004: <literal>ref</literal> element having a <literal>name</literal> with
                   1005: value <replaceable>n</replaceable> must not require the expansion of
                   1006: <literal>ref</literal> element also having a <literal>name</literal>
                   1007: with value <replaceable>n</replaceable>.  Finally, remove any
                   1008: <literal>define</literal> element whose child is not an
                   1009: <literal>element</literal> element.</para>
                   1010: 
                   1011: </section>
                   1012: 
                   1013: <section id="notAllowed">
                   1014: <title><literal>notAllowed</literal> element</title>
                   1015: 
                   1016: <para>In this rule, the grammar is transformed so that a
                   1017: <literal>notAllowed</literal> element occurs only as the child of
                   1018: a <literal>start</literal> or <literal>element</literal> element.  An
                   1019: <literal>attribute</literal>, <literal>list</literal>,
                   1020: <literal>group</literal>, <literal>interleave</literal>,
                   1021: or <literal>oneOrMore</literal> element that has a
                   1022: <literal>notAllowed</literal> child element is transformed into a
                   1023: <literal>notAllowed</literal> element.  A <literal>choice</literal>
                   1024: element that has two <literal>notAllowed</literal> child elements is
                   1025: transformed into a <literal>notAllowed</literal> element.  A
                   1026: <literal>choice</literal> element that has one
                   1027: <literal>notAllowed</literal> child element is transformed into its
                   1028: other child element. An <literal>except</literal> element that has a
                   1029: <literal>notAllowed</literal> child element is removed.
                   1030: The preceding transformations are applied
                   1031: repeatedly until none of them is applicable any more.
                   1032: Any <literal>define</literal> element that is no longer reachable
                   1033: is removed.</para>
                   1034: 
                   1035: </section>
                   1036: 
                   1037: <section>
                   1038: <title><literal>empty</literal> element</title>
                   1039: 
                   1040: <para>In this rule, the grammar is transformed so that an
                   1041: <literal>empty</literal> element does not occur as a child of a
                   1042: <literal>group</literal>, <literal>interleave</literal>, or
                   1043: <literal>oneOrMore</literal> element or as the second child of
                   1044: a <literal>choice</literal> element. A <literal>group</literal>,
                   1045: <literal>interleave</literal> or <literal>choice</literal> element
                   1046: that has two <literal>empty</literal> child elements is transformed
                   1047: into an <literal>empty</literal> element.  A <literal>group</literal>
                   1048: or <literal>interleave</literal> element that has one
                   1049: <literal>empty</literal> child element is transformed into its other
                   1050: child element.  A <literal>choice</literal> element whose
                   1051: second child element is an <literal>empty</literal> element is
                   1052: transformed by interchanging its two child elements.  A
                   1053: <literal>oneOrMore</literal> element that has an
                   1054: <literal>empty</literal> child element is transformed into an
                   1055: <literal>empty</literal> element. The preceding transformations are applied
                   1056: repeatedly until none of them is applicable any more.</para>
                   1057: 
                   1058: </section>
                   1059: 
                   1060: </section>
                   1061: 
                   1062: <section id="simple-syntax">
                   1063: <title>Simple syntax</title>
                   1064: 
                   1065: <para>After applying all the rules in <xref
                   1066: linkend="simplification"/>, the schema will match the following
                   1067: grammar:</para>
                   1068: 
                   1069: <grammarref src="simple.rng"/>
                   1070: 
                   1071: <para>With this grammar, no elements or attributes are allowed other
                   1072: than those explicitly shown.</para>
                   1073: 
                   1074: <section id="simple-syntax-example">
                   1075: <title>Example</title>
                   1076: 
                   1077: <para>The following is an example of how the schema in <xref
                   1078: linkend="full-syntax-example"/> can be transformed into the simple
                   1079: syntax:</para>
                   1080: 
                   1081: <programlisting><![CDATA[<?xml version="1.0"?>
                   1082: <grammar xmlns="http://relaxng.org/ns/structure/1.0">
                   1083:   <start>
                   1084:     <ref name="foo.element"/>
                   1085:   </start>
                   1086: 
                   1087:   <define name="foo.element">
                   1088:     <element>
                   1089:       <name ns="">foo</name>
                   1090:       <group>
                   1091:         <ref name="bar1.element"/>
                   1092:         <ref name="bar2.element"/>
                   1093:       </group>
                   1094:     </element>
                   1095:   </define>
                   1096: 
                   1097:   <define name="bar1.element">
                   1098:     <element>
                   1099:       <name ns="http://www.example.com/n1">bar1</name>
                   1100:       <empty/>
                   1101:     </element>
                   1102:   </define>
                   1103: 
                   1104:   <define name="bar2.element">
                   1105:     <element>
                   1106:       <name ns="http://www.example.com/n2">bar2</name>
                   1107:       <empty/>
                   1108:     </element>
                   1109:   </define>
                   1110: </grammar>]]></programlisting>
                   1111: 
                   1112: <note><para>Strictly speaking, the result of simplification is an
                   1113: instance of the data model rather than an XML document.  For
                   1114: convenience, we use an XML document to represent an instance of the
                   1115: data model.</para></note>
                   1116: 
                   1117: </section>
                   1118: 
                   1119: </section>
                   1120: 
                   1121: <section id="semantics">
                   1122: <title>Semantics</title>
                   1123: 
                   1124: <para>In this section, we define the semantics of a correct RELAX NG
                   1125: schema that has been transformed into the simple syntax.  The
                   1126: semantics of a RELAX NG schema consist of a specification of what XML
                   1127: documents are valid with respect to that schema.  The semantics are
                   1128: described formally.  The formalism uses axioms and inference rules.
                   1129: Axioms are propositions that are provable unconditionally.  An
                   1130: inference rule consists of one or more antecedents and exactly one
                   1131: consequent.  An antecedent is either positive or negative.  If all the
                   1132: positive antecedents of an inference rule are provable and none of the
                   1133: negative antecedents are provable, then the consequent of the
                   1134: inference rule is provable. An XML document is valid with respect to a
                   1135: RELAX NG schema if and only if the proposition that it is valid is
                   1136: provable in the formalism specified in this section.</para>
                   1137: 
                   1138: <note><para>This kind of formalism is similar to a proof system.
                   1139: However, a traditional proof system only has positive
                   1140: antecedents.</para></note>
                   1141: 
                   1142: <para>The notation for inference rules separates the antecedents from
                   1143: the consequent by a horizontal line: the antecedents are above the
                   1144: line; the consequent is below the line.  If an antecedent is of the
                   1145: form not(<replaceable>p</replaceable>), then it is a negative
                   1146: antecedent; otherwise, it is a positive antecedent.  Both axioms and
                   1147: inferences
                   1148: rules may use variables.  A variable has a name and optionally a
                   1149: subscript.  The name of a variable is italicized.  Each variable has a
                   1150: range that is determined by its name.  Axioms and inference rules are
                   1151: implicitly universally quantified over the variables they contain.  We
                   1152: explain this further below.</para>
                   1153: 
                   1154: <para>The possibility that an inference rule or axiom may contain more
                   1155: than one occurrence of a particular variable requires that an identity
                   1156: relation be defined on each kind of object over which a variable can
                   1157: range.  The identity relation for all kinds of object is value-based.
                   1158: Two objects of a particular kind are identical if the constituents of
                   1159: the objects are identical.  For example, two attributes are considered
                   1160: the same if they have the same name and the same value. Two characters
                   1161: are identical if their Unicode character codes are the same.</para>
                   1162: 
                   1163: <section id="name-classes">
                   1164: <title>Name classes</title>
                   1165: 
                   1166: <para>The main semantic concept for name classes is that of a name
                   1167: belonging to a name class. A name class is an element that matches the
                   1168: production nameClass. A name is as defined in <xref
                   1169: linkend="data-model"/>: it consists of a namespace URI and a local
                   1170: name.</para>
                   1171: 
                   1172: <para>We use the following notation:</para>
                   1173: 
                   1174: <variablelist>
                   1175: 
                   1176: <varlistentry><term><p:var range="name"/></term><listitem><para>is a variable
                   1177: that ranges over names</para></listitem></varlistentry>
                   1178: 
                   1179: <varlistentry><term><p:var range="nameClass"/></term><listitem><para>ranges over name classes</para></listitem></varlistentry>
                   1180: 
                   1181: <varlistentry><term><p:judgement name="belongs">
                   1182:       <p:var range="name"/>
                   1183:       <p:var range="nameClass"/>
                   1184:     </p:judgement></term><listitem><para>
                   1185:     
                   1186: asserts that name <p:var range="name"/> is a member of name class <p:var range="nameClass"/>
                   1187: 
                   1188: </para></listitem></varlistentry>
                   1189: 
                   1190: </variablelist>
                   1191: 
                   1192: <para>We are now ready for our first axiom, which is called "anyName
                   1193: 1":</para>
                   1194: 
                   1195: <p:proofSystem>
                   1196:   <p:rule name="anyName 1">
                   1197:     <p:judgement name="belongs">
                   1198:       <p:var range="name"/>
                   1199:       <p:element name="anyName"/>
                   1200:     </p:judgement>
                   1201:   </p:rule>
                   1202: </p:proofSystem>
                   1203: 
                   1204: <para>This says for any name <p:var range="name"/>, <p:var
                   1205: range="name"/> belongs to the name class <p:element name="anyName"/>,
                   1206: in other words <p:element name="anyName"/> matches any name. Note the
                   1207: effect of the implicit universal quantification over the variables in
                   1208: the axiom: this is what makes the axiom apply for any name <p:var
                   1209: range="name"/>.</para>
                   1210: 
                   1211: <para>Our first inference rule is almost as simple:</para>
                   1212: 
                   1213: <p:proofSystem>
                   1214:   <p:rule name="anyName 2">
                   1215:     <p:not>
                   1216:       <p:judgement name="belongs">
                   1217:        <p:var range="name"/>
                   1218:        <p:var range="nameClass"/>
                   1219:       </p:judgement>
                   1220:     </p:not>
                   1221:     <p:judgement name="belongs">
                   1222:       <p:var range="name"/>
                   1223:       <p:element name="anyName">
                   1224:         <p:element name="except">
                   1225:          <p:var range="nameClass"/>
                   1226:         </p:element>
                   1227:       </p:element>
                   1228:     </p:judgement>
                   1229:   </p:rule>
                   1230: 
                   1231: </p:proofSystem>
                   1232: 
                   1233: <para>This says that for any name <p:var range="name"/>
                   1234: and for any name class         <p:var range="nameClass"/>,
                   1235: if <p:var range="name"/> does not belong to <p:var range="nameClass"/>,
                   1236: then <p:var range="name"/> belongs to 
                   1237:       <p:element name="anyName">
                   1238:         <p:element name="except">
                   1239:          <p:var range="nameClass"/>
                   1240:         </p:element>
                   1241:       </p:element>. In other words,       <p:element name="anyName">
                   1242:         <p:element name="except">
                   1243:          <p:var range="nameClass"/>
                   1244:         </p:element>
                   1245:       </p:element> matches any name that does not match <p:var range="nameClass"/>.</para>
                   1246: 
                   1247: <para>We now need the following additional notation:</para>
                   1248: 
                   1249: <variablelist>
                   1250: 
                   1251: <varlistentry><term><p:var range="ncname"/></term>
                   1252: 
                   1253: <listitem><para>ranges over local names; a local name is a string that
                   1254: matches the NCName production of <xref linkend="xml-names"/>, that is,
                   1255: a name with no colons</para></listitem>
                   1256: </varlistentry>
                   1257: 
                   1258: <varlistentry><term><p:var range="uri"/></term><listitem><para>ranges over URIs</para></listitem></varlistentry>
                   1259: 
                   1260: <varlistentry>
                   1261: <term>
                   1262:   <p:function name="name">
                   1263:     <p:var range="uri"/>
                   1264:     <p:var range="ncname"/>
                   1265:   </p:function>
                   1266: </term>
                   1267: <listitem><para>constructs a name with URI <p:var range="uri"/> and local
                   1268: name <p:var range="ncname"/></para></listitem>
                   1269: </varlistentry>
                   1270: 
                   1271: </variablelist>
                   1272: 
                   1273: <para>The remaining axioms and inference rules for name classes are as
                   1274: follows:</para>
                   1275: 
                   1276: <p:proofSystem>
                   1277: 
                   1278:   <p:rule name="nsName 1">
                   1279:     <p:judgement name="belongs">
                   1280:       <p:function name="name">
                   1281:         <p:var range="uri"/>
                   1282:         <p:var range="ncname"/>
                   1283:       </p:function>
                   1284:       <p:element name="nsName">
                   1285:         <p:attribute name="ns">
                   1286:           <p:var range="uri"/>
                   1287:         </p:attribute>
                   1288:       </p:element>
                   1289:     </p:judgement>
                   1290:   </p:rule>
                   1291: 
                   1292:   <p:rule name="nsName 2">
                   1293:     <p:not>
                   1294:       <p:judgement name="belongs">
                   1295:        <p:function name="name">
                   1296:          <p:var range="uri"/>
                   1297:          <p:var range="ncname"/>
                   1298:        </p:function>
                   1299:        <p:var range="nameClass"/>
                   1300:       </p:judgement>
                   1301:     </p:not>
                   1302:     <p:judgement name="belongs">
                   1303:       <p:function name="name">
                   1304:         <p:var range="uri"/>
                   1305:         <p:var range="ncname"/>
                   1306:       </p:function>
                   1307:       <p:element name="nsName">
                   1308:         <p:attribute name="ns">
                   1309:           <p:var range="uri"/>
                   1310:         </p:attribute>
                   1311:         <p:element name="except">
                   1312:           <p:var range="nameClass"/>
                   1313:         </p:element>
                   1314:       </p:element>
                   1315:     </p:judgement>
                   1316:   </p:rule>
                   1317: 
                   1318:   <p:rule name="name">
                   1319:     <p:judgement name="belongs">
                   1320:       <p:function name="name">
                   1321:         <p:var range="uri"/>
                   1322:         <p:var range="ncname"/>
                   1323:       </p:function>
                   1324:       <p:element name="name">
                   1325:         <p:attribute name="ns">
                   1326:           <p:var range="uri"/>
                   1327:         </p:attribute>
                   1328:         <p:var range="ncname"/>
                   1329:       </p:element>
                   1330:     </p:judgement>
                   1331:   </p:rule>
                   1332: 
                   1333:   <p:rule name="name choice 1">
                   1334:     <p:judgement name="belongs">
                   1335:       <p:var range="name"/>
                   1336:       <p:var range="nameClass" sub="1"/>
                   1337:     </p:judgement>
                   1338:     <p:judgement name="belongs">
                   1339:       <p:var range="name"/>
                   1340:       <p:element name="choice">
                   1341:         <p:var range="nameClass" sub="1"/>
                   1342:         <p:var range="nameClass" sub="2"/>
                   1343:       </p:element>
                   1344:     </p:judgement>
                   1345:   </p:rule>
                   1346: 
                   1347:   <p:rule name="name choice 2">
                   1348:     <p:judgement name="belongs">
                   1349:       <p:var range="name"/>
                   1350:       <p:var range="nameClass" sub="2"/>
                   1351:     </p:judgement>
                   1352:     <p:judgement name="belongs">
                   1353:       <p:var range="name"/>
                   1354:       <p:element name="choice">
                   1355:         <p:var range="nameClass" sub="1"/>
                   1356:         <p:var range="nameClass" sub="2"/>
                   1357:       </p:element>
                   1358:     </p:judgement>
                   1359:   </p:rule>
                   1360: 
                   1361: </p:proofSystem>
                   1362: 
                   1363: </section>
                   1364: 
                   1365: 
                   1366: <section>
                   1367: <title>Patterns</title>
                   1368: 
                   1369: <para>The axioms and inference rules for patterns use the following
                   1370: notation:</para>
                   1371: 
                   1372: <variablelist>
                   1373: 
                   1374: <varlistentry><term><p:var range="context"/></term><listitem><para>ranges
                   1375: over contexts (as defined in <xref
                   1376: linkend="data-model"/>)</para></listitem></varlistentry>
                   1377: 
                   1378: <varlistentry><term><p:var range="att"/></term><listitem><para>ranges over
                   1379: sets of attributes; a set with a single member
                   1380: is considered the same as that member</para></listitem></varlistentry>
                   1381: 
                   1382: <varlistentry><term><p:var
                   1383: range="mixed"/></term><listitem><para>ranges over sequences of
                   1384: elements and strings; a sequence with a single member is considered
                   1385: the same as that member; the sequences ranged over by <p:var
                   1386: range="mixed"/> may contain consecutive strings and may contain strings
                   1387: that are empty; thus, there are sequences ranged over by <p:var
                   1388: range="mixed"/> that cannot occur as the children of an
                   1389: element</para></listitem></varlistentry>
                   1390: 
                   1391: <varlistentry><term><p:var range="pattern"/></term><listitem><para>ranges
                   1392: over patterns (elements matching the pattern
                   1393: production)</para></listitem></varlistentry>
                   1394: 
                   1395: <varlistentry><term><p:judgement name="match">
                   1396:       <p:var range="context"/>
                   1397:       <p:var range="att"/>
                   1398:       <p:var range="mixed"/>
                   1399:       <p:var range="pattern"/>
                   1400:     </p:judgement></term><listitem><para>
                   1401:     
                   1402: asserts that with respect to context <p:var range="context"/>, the
                   1403: attributes <p:var range="att"/> and the sequence of elements and
                   1404: strings <p:var range="mixed"/> matches the pattern <p:var
                   1405: range="pattern"/></para></listitem></varlistentry>
                   1406: 
                   1407: </variablelist>
                   1408: 
                   1409: <section id="choice-pattern">
                   1410: <title><literal>choice</literal> pattern</title>
                   1411: 
                   1412: <para>The semantics of the <literal>choice</literal> pattern are as follows:</para>
                   1413: 
                   1414: <p:proofSystem>
                   1415:   <p:rule name="choice 1">
                   1416: 
                   1417:     <p:judgement name="match">
                   1418:       <p:var range="context"/>
                   1419:       <p:var range="att"/>
                   1420:       <p:var range="mixed"/>
                   1421:       <p:var range="pattern" sub="1"/>
                   1422:     </p:judgement>
                   1423: 
                   1424:     <p:judgement name="match">
                   1425:       <p:var range="context"/>
                   1426:       <p:var range="att"/>
                   1427:       <p:var range="mixed"/>
                   1428:       <p:element name="choice">
                   1429:        <p:var range="pattern" sub="1"/>
                   1430:        <p:var range="pattern" sub="2"/>
                   1431:       </p:element>
                   1432:     </p:judgement>
                   1433: 
                   1434:   </p:rule>
                   1435: 
                   1436:   <p:rule name="choice 2">
                   1437: 
                   1438:     <p:judgement name="match">
                   1439:       <p:var range="context"/>
                   1440:       <p:var range="att"/>
                   1441:       <p:var range="mixed"/>
                   1442:       <p:var range="pattern" sub="2"/>
                   1443:     </p:judgement>
                   1444: 
                   1445:     <p:judgement name="match">
                   1446:       <p:var range="context"/>
                   1447:       <p:var range="att"/>
                   1448:       <p:var range="mixed"/>
                   1449:       <p:element name="choice">
                   1450:        <p:var range="pattern" sub="1"/>
                   1451:        <p:var range="pattern" sub="2"/>
                   1452:       </p:element>
                   1453:     </p:judgement>
                   1454: 
                   1455:   </p:rule>
                   1456: 
                   1457: 
                   1458: </p:proofSystem>
                   1459: 
                   1460: </section>
                   1461: 
                   1462: <section>
                   1463: <title><literal>group</literal> pattern</title>
                   1464: 
                   1465: <para>We use the following additional notation:</para>
                   1466: 
                   1467: <variablelist>
                   1468: 
                   1469: <varlistentry><term><p:function name="append">
                   1470:        <p:var range="mixed" sub="1"/>
                   1471:        <p:var range="mixed" sub="2"/>
                   1472:       </p:function></term><listitem>
                   1473: <para>represents the concatenation of the sequences <p:var range="mixed" sub="1"/> and <p:var range="mixed" sub="2"/>
                   1474: 
                   1475: </para></listitem></varlistentry>
                   1476: 
                   1477: <varlistentry><term><p:function name="union">
                   1478:        <p:var range="att" sub="1"/>
                   1479:        <p:var range="att" sub="2"/>
                   1480:       </p:function></term><listitem>
                   1481: <para>represents the union of <p:var range="att" sub="1"/>
                   1482: and <p:var range="att" sub="2"/></para>
                   1483: </listitem>
                   1484: </varlistentry>
                   1485: 
                   1486: </variablelist>
                   1487: 
                   1488: <para>The semantics of the <literal>group</literal> pattern are as follows:</para>
                   1489: 
                   1490: <p:proofSystem>
                   1491:   <p:rule name="group">
                   1492: 
                   1493:     <p:judgement name="match">
                   1494:       <p:var range="context"/>
                   1495:       <p:var range="att" sub="1"/>
                   1496:       <p:var range="mixed" sub="1"/>
                   1497:       <p:var range="pattern" sub="1"/>
                   1498:     </p:judgement>
                   1499: 
                   1500:     <p:judgement name="match">
                   1501:       <p:var range="context"/>
                   1502:       <p:var range="att" sub="2"/>
                   1503:       <p:var range="mixed" sub="2"/>
                   1504:       <p:var range="pattern" sub="2"/>
                   1505:     </p:judgement>
                   1506: 
                   1507:     <p:judgement name="match">
                   1508:       <p:var range="context"/>
                   1509:       <p:function name="union">
                   1510:        <p:var range="att" sub="1"/>
                   1511:        <p:var range="att" sub="2"/>
                   1512:       </p:function>
                   1513:       <p:function name="append">
                   1514:        <p:var range="mixed" sub="1"/>
                   1515:        <p:var range="mixed" sub="2"/>
                   1516:       </p:function>
                   1517:       <p:element name="group">
                   1518:        <p:var range="pattern" sub="1"/>
                   1519:        <p:var range="pattern" sub="2"/>
                   1520:       </p:element>
                   1521:     </p:judgement>
                   1522: 
                   1523:   </p:rule>
                   1524: 
                   1525: </p:proofSystem>
                   1526: 
                   1527: <note><para>The restriction in <xref linkend="attribute-restrictions"/>
                   1528: ensures that the set of attributes constructed in the consequent will
                   1529: not have multiple attributes with the same name.</para></note>
                   1530: 
                   1531: </section>
                   1532: 
                   1533: 
                   1534: <section id="empty-pattern">
                   1535: <title><literal>empty</literal> pattern</title>
                   1536: 
                   1537: <para>We use the following additional notation:</para>
                   1538: 
                   1539: <variablelist>
                   1540: <varlistentry><term><p:function name="emptySequence"/></term><listitem><para>represents an empty sequence</para></listitem></varlistentry>
                   1541: 
                   1542: <varlistentry><term><p:function name="emptySet"/></term><listitem><para>represents an empty set</para></listitem></varlistentry>
                   1543: 
                   1544: </variablelist>
                   1545: 
                   1546: <para>The semantics of the <literal>empty</literal> pattern are as follows:</para>
                   1547: 
                   1548: <p:proofSystem>
                   1549:   <p:rule name="empty">
                   1550:     <p:judgement name="match">
                   1551:       <p:var range="context"/>
                   1552:       <p:function name="emptySet"/>
                   1553:       <p:function name="emptySequence"/>
                   1554:       <p:element name="empty"></p:element>
                   1555:       <p:function name="emptySet"/>
                   1556:       <p:function name="emptySet"/>
                   1557:     </p:judgement>
                   1558:   </p:rule>
                   1559: </p:proofSystem>
                   1560: 
                   1561: </section>
                   1562: 
                   1563: 
                   1564: <section id="text-pattern">
                   1565: <title><literal>text</literal> pattern</title>
                   1566: 
                   1567: <para>We use the following additional notation:</para>
                   1568: 
                   1569: <variablelist>
                   1570: <varlistentry><term><p:var range="string"/></term><listitem><para>ranges
                   1571: over strings</para></listitem></varlistentry>
                   1572: </variablelist>
                   1573: 
                   1574: <para>The semantics of the <literal>text</literal> pattern are as follows:</para>
                   1575: 
                   1576: <p:proofSystem>
                   1577:   <p:rule name="text 1">
                   1578:     <p:judgement name="match">
                   1579:       <p:var range="context"/>
                   1580:       <p:function name="emptySet"/>
                   1581:       <p:function name="emptySequence"/>
                   1582:       <p:element name="text"></p:element>
                   1583:       <p:function name="emptySet"/>
                   1584:       <p:function name="emptySet"/>
                   1585:     </p:judgement>
                   1586:   </p:rule>
                   1587: 
                   1588:   <p:rule name="text 2">
                   1589:     <p:judgement name="match">
                   1590:       <p:var range="context"/>
                   1591:       <p:function name="emptySet"/>
                   1592:       <p:var range="mixed"/>
                   1593:       <p:element name="text"></p:element>
                   1594:       <p:function name="emptySet"/>
                   1595:       <p:function name="emptySet"/>
                   1596:     </p:judgement>
                   1597:     <p:judgement name="match">
                   1598:       <p:var range="context"/>
                   1599:       <p:function name="emptySet"/>
                   1600:       <p:function name="append">
                   1601:         <p:var range="mixed"/>
                   1602:         <p:var range="string"/>
                   1603:       </p:function>
                   1604:       <p:element name="text"></p:element>
                   1605:       <p:function name="emptySet"/>
                   1606:       <p:function name="emptySet"/>
                   1607:     </p:judgement>
                   1608:   </p:rule>
                   1609: 
                   1610: </p:proofSystem>
                   1611: 
                   1612: <para>The effect of the above rule is that a <literal>text</literal>
                   1613: element matches zero or more strings.</para>
                   1614: 
                   1615: </section>
                   1616: 
                   1617: 
                   1618: <section>
                   1619: <title><literal>oneOrMore</literal> pattern</title>
                   1620: 
                   1621: <para>We use the following additional notation:</para>
                   1622: 
                   1623: <variablelist>
                   1624: <varlistentry><term><p:judgement name="disjoint">
                   1625:       <p:var range="att" sub="1"/>
                   1626:       <p:var range="att" sub="2"/>
                   1627:     </p:judgement></term><listitem><para>
                   1628: asserts that there is no name that is
                   1629: the name of both an attribute in <p:var range="att" sub="1"/>
                   1630: and of an attribute in <p:var range="att" sub="2"/>
                   1631: </para></listitem></varlistentry>
                   1632: </variablelist>
                   1633: 
                   1634: <para>The semantics of the <literal>oneOrMore</literal> pattern are as follows:</para>
                   1635: 
                   1636: <p:proofSystem>
                   1637:   <p:rule name="oneOrMore 1">
                   1638:     <p:judgement name="match">
                   1639:       <p:var range="context"/>
                   1640:       <p:var range="att"/>
                   1641:       <p:var range="mixed"/>
                   1642:       <p:var range="pattern"/>
                   1643:     </p:judgement>
                   1644: 
                   1645:     <p:judgement name="match">
                   1646:       <p:var range="context"/>
                   1647:       <p:var range="att"/>
                   1648:       <p:var range="mixed"/>
                   1649:       <p:element name="oneOrMore">
                   1650:         <p:var range="pattern"/>
                   1651:       </p:element>
                   1652:     </p:judgement>
                   1653:   </p:rule>
                   1654: 
                   1655:   <p:rule name="oneOrMore 2">
                   1656:     <p:judgement name="match">
                   1657:       <p:var range="context"/>
                   1658:       <p:var range="att" sub="1"/>
                   1659:       <p:var range="mixed" sub="1"/>
                   1660:       <p:var range="pattern"/>
                   1661:     </p:judgement>
                   1662: 
                   1663:     <p:judgement name="match">
                   1664:       <p:var range="context"/>
                   1665:       <p:var range="att" sub="2"/>
                   1666:       <p:var range="mixed" sub="2"/>
                   1667:       <p:element name="oneOrMore">
                   1668:         <p:var range="pattern"/>
                   1669:       </p:element>
                   1670:     </p:judgement>
                   1671: 
                   1672:     <p:judgement name="disjoint">
                   1673:       <p:var range="att" sub="1"/>
                   1674:       <p:var range="att" sub="2"/>
                   1675:     </p:judgement>
                   1676: 
                   1677:     <p:judgement name="match">
                   1678:       <p:var range="context"/>
                   1679:       <p:function name="union">
                   1680:        <p:var range="att" sub="1"/>
                   1681:        <p:var range="att" sub="2"/>
                   1682:       </p:function>
                   1683:       <p:function name="append">
                   1684:        <p:var range="mixed" sub="1"/>
                   1685:        <p:var range="mixed" sub="2"/>
                   1686:       </p:function>
                   1687:       <p:element name="oneOrMore">
                   1688:         <p:var range="pattern"/>
                   1689:       </p:element>
                   1690:     </p:judgement>
                   1691:   </p:rule>
                   1692: 
                   1693: </p:proofSystem>
                   1694: 
                   1695: </section>
                   1696: 
                   1697: 
                   1698: <section>
                   1699: <title><literal>interleave</literal> pattern</title>
                   1700: 
                   1701: <para>We use the following additional notation:</para>
                   1702: 
                   1703: <variablelist>
                   1704: <varlistentry><term><p:judgement name="interleave">
                   1705:       <p:var range="mixed" sub="1"/>
                   1706:       <p:var range="mixed" sub="2"/>
                   1707:       <p:var range="mixed" sub="3"/>
                   1708:     </p:judgement></term><listitem><para>
                   1709:     
                   1710: asserts that <p:var range="mixed" sub="1"/>
                   1711: is an interleaving of <p:var range="mixed" sub="2"/>
                   1712: and <p:var range="mixed" sub="3"/>
                   1713: </para></listitem></varlistentry>
                   1714: 
                   1715: </variablelist>
                   1716: 
                   1717: <para>The semantics of interleaving are defined by the following rules.</para>
                   1718: 
                   1719: 
                   1720: <p:proofSystem>
                   1721:   <p:rule name="interleaves 1">
                   1722:    
                   1723:     <p:judgement name="interleave">
                   1724:       <p:function name="emptySequence"/>
                   1725:       <p:function name="emptySequence"/>
                   1726:       <p:function name="emptySequence"/>
                   1727:     </p:judgement>
                   1728: 
                   1729:   </p:rule>
                   1730: 
                   1731:   <p:rule name="interleaves 2">
                   1732:    
                   1733:     <p:judgement name="interleave">
                   1734:       <p:var range="mixed" sub="1"/>
                   1735:       <p:var range="mixed" sub="2"/>
                   1736:       <p:var range="mixed" sub="3"/>
                   1737:     </p:judgement>
                   1738: 
                   1739:     <p:judgement name="interleave">
                   1740:       <p:function name="append">
                   1741:         <p:var range="mixed" sub="4"/>
                   1742:         <p:var range="mixed" sub="1"/>
                   1743:       </p:function>
                   1744:       <p:function name="append">
                   1745:         <p:var range="mixed" sub="4"/>
                   1746:         <p:var range="mixed" sub="2"/>
                   1747:       </p:function>
                   1748:       <p:var range="mixed" sub="3"/>
                   1749:     </p:judgement>
                   1750: 
                   1751:   </p:rule>
                   1752: 
                   1753:   <p:rule name="interleaves 3">
                   1754:    
                   1755:     <p:judgement name="interleave">
                   1756:       <p:var range="mixed" sub="1"/>
                   1757:       <p:var range="mixed" sub="2"/>
                   1758:       <p:var range="mixed" sub="3"/>
                   1759:     </p:judgement>
                   1760: 
                   1761:     <p:judgement name="interleave">
                   1762:       <p:function name="append">
                   1763:         <p:var range="mixed" sub="4"/>
                   1764:         <p:var range="mixed" sub="1"/>
                   1765:       </p:function>
                   1766:       <p:var range="mixed" sub="2"/>
                   1767:       <p:function name="append">
                   1768:         <p:var range="mixed" sub="4"/>
                   1769:         <p:var range="mixed" sub="3"/>
                   1770:       </p:function>
                   1771:     </p:judgement>
                   1772: 
                   1773:   </p:rule>
                   1774: 
                   1775: </p:proofSystem>
                   1776: 
                   1777: <para>For example, the interleavings of
                   1778: <literal><![CDATA[<a/><a/>]]></literal> and
                   1779: <literal><![CDATA[<b/>]]></literal> are
                   1780: <literal><![CDATA[<a/><a/><b/>]]></literal>,
                   1781: <literal><![CDATA[<a/><b/><a/>]]></literal>, and
                   1782: <literal><![CDATA[<b/><a/><a/>]]></literal>.</para>
                   1783: 
                   1784: <para>The semantics of the <literal>interleave</literal> pattern are
                   1785: as follows:</para>
                   1786: 
                   1787: <p:proofSystem>
                   1788:   <p:rule name="interleave">
                   1789: 
                   1790:     <p:judgement name="match">
                   1791:       <p:var range="context"/>
                   1792:       <p:var range="att" sub="1"/>
                   1793:       <p:var range="mixed" sub="1"/>
                   1794:       <p:var range="pattern" sub="1"/>
                   1795:     </p:judgement>
                   1796: 
                   1797:     <p:judgement name="match">
                   1798:       <p:var range="context"/>
                   1799:       <p:var range="att" sub="2"/>
                   1800:       <p:var range="mixed" sub="2"/>
                   1801:       <p:var range="pattern" sub="2"/>
                   1802:     </p:judgement>
                   1803: 
                   1804:     <p:judgement name="interleave">
                   1805:       <p:var range="mixed" sub="3"/>
                   1806:       <p:var range="mixed" sub="1"/>
                   1807:       <p:var range="mixed" sub="2"/>
                   1808:     </p:judgement>
                   1809: 
                   1810: 
                   1811:     <p:judgement name="match">
                   1812:       <p:var range="context"/>
                   1813:       <p:function name="union">
                   1814:        <p:var range="att" sub="1"/>
                   1815:        <p:var range="att" sub="2"/>
                   1816:       </p:function>
                   1817:       <p:var range="mixed" sub="3"/>
                   1818:       <p:element name="interleave">
                   1819:        <p:var range="pattern" sub="1"/>
                   1820:        <p:var range="pattern" sub="2"/>
                   1821:       </p:element>
                   1822:     </p:judgement>
                   1823: 
                   1824:   </p:rule>
                   1825: 
                   1826: </p:proofSystem>
                   1827: 
                   1828: <note><para>The restriction in <xref linkend="attribute-restrictions"/>
                   1829: ensures that the set of attributes constructed in the consequent will
                   1830: not have multiple attributes with the same name.</para></note>
                   1831: 
                   1832: </section>
                   1833: 
                   1834: <section id="element-pattern">
                   1835: <title><literal>element</literal> and <literal>attribute</literal> pattern</title>
                   1836: 
                   1837: <para>The value of an attribute is always a single string, which may
                   1838: be empty.  Thus, the empty sequence is not a possible attribute value.
                   1839: On the hand, the children of an element can be an empty sequence and
                   1840: cannot consist of an empty string.  In order to ensure that validation
                   1841: handles attributes and elements consistently, we introduce a variant
                   1842: of matching called <firstterm>weak matching</firstterm>.  Weak
                   1843: matching is used when matching the pattern for the value of an
                   1844: attribute or for the attributes and children of an element.  We use
                   1845: the following notation to define weak matching.</para>
                   1846: 
                   1847: <variablelist>
                   1848: 
                   1849: <varlistentry><term><p:function
                   1850: name="emptyString"/></term><listitem><para>represents an empty
                   1851: string</para></listitem></varlistentry>
                   1852: 
                   1853: <varlistentry><term><p:var
                   1854: range="whiteSpace"/></term><listitem><para>ranges over the empty
                   1855: sequence and strings that consist entirely of
                   1856: whitespace</para></listitem></varlistentry>
                   1857: 
                   1858: <varlistentry><term><p:judgement name="weakMatch">
                   1859:       <p:var range="context"/>
                   1860:       <p:var range="att"/>
                   1861:       <p:var range="mixed"/>
                   1862:       <p:var range="pattern"/>
                   1863:     </p:judgement></term><listitem><para>
                   1864:     
                   1865: asserts that with respect to context <p:var range="context"/>, the
                   1866: attributes <p:var range="att"/> and the sequence of elements and
                   1867: strings <p:var range="mixed"/> weakly matches the pattern <p:var
                   1868: range="pattern"/></para></listitem></varlistentry>
                   1869: 
                   1870: </variablelist>
                   1871: 
                   1872: <para>The semantics of weak matching are as follows:</para>
                   1873: 
                   1874: <p:proofSystem>
                   1875:   <p:rule name="weak match 1">
                   1876:     <p:judgement name="match">
                   1877:       <p:var range="context"/>
                   1878:       <p:var range="att"/>
                   1879:       <p:var range="mixed"/>
                   1880:       <p:var range="pattern"/>
                   1881:     </p:judgement>
                   1882:     <p:judgement name="weakMatch">
                   1883:       <p:var range="context"/>
                   1884:       <p:var range="att"/>
                   1885:       <p:var range="mixed"/>
                   1886:       <p:var range="pattern"/>
                   1887:     </p:judgement>
                   1888:   </p:rule>
                   1889:   <p:rule name="weak match 2">
                   1890:     <p:judgement name="match">
                   1891:       <p:var range="context"/>
                   1892:       <p:var range="att"/>
                   1893:       <p:function name="emptySequence"/>
                   1894:       <p:var range="pattern"/>
                   1895:     </p:judgement>
                   1896:     <p:judgement name="weakMatch">
                   1897:       <p:var range="context"/>
                   1898:       <p:var range="att"/>
                   1899:       <p:var range="whiteSpace"/>
                   1900:       <p:var range="pattern"/>
                   1901:     </p:judgement>
                   1902:   </p:rule>
                   1903:   <p:rule name="weak match 3">
                   1904:     <p:judgement name="match">
                   1905:       <p:var range="context"/>
                   1906:       <p:var range="att"/>
                   1907:       <p:function name="emptyString"/>
                   1908:       <p:var range="pattern"/>
                   1909:     </p:judgement>
                   1910:     <p:judgement name="weakMatch">
                   1911:       <p:var range="context"/>
                   1912:       <p:var range="att"/>
                   1913:       <p:function name="emptySequence"/>
                   1914:       <p:var range="pattern"/>
                   1915:     </p:judgement>
                   1916:   </p:rule>
                   1917: </p:proofSystem>
                   1918: 
                   1919: <para>We use the following additional notation:</para>
                   1920: 
                   1921: <variablelist>
                   1922: 
                   1923: <varlistentry><term><p:function name="attribute">
                   1924:         <p:var range="name"/>
                   1925:         <p:var range="string"/>
                   1926:       </p:function></term><listitem><para>
                   1927:       
                   1928: constructs an attribute with name <p:var range="name"/>
                   1929: and value <p:var range="string"/>
                   1930: </para></listitem></varlistentry>
                   1931: 
                   1932: <varlistentry><term><p:function name="element">
                   1933:        <p:var range="name"/>
                   1934:         <p:var range="context"/>
                   1935:        <p:var range="att"/>
                   1936:        <p:var range="mixed"/>
                   1937:       </p:function></term><listitem><para>
                   1938:       
                   1939: constructs an element with name <p:var range="name"/>,
                   1940: context <p:var range="context"/>,
                   1941: attributes <p:var range="att"/>
                   1942: and mixed sequence <p:var range="mixed"/> as children
                   1943: </para></listitem></varlistentry>
                   1944: 
                   1945: <varlistentry><term><p:judgement name="okAsChildren">
                   1946:       <p:var range="mixed"/>
                   1947:     </p:judgement></term><listitem><para>
                   1948:     
                   1949: asserts that the mixed sequence <p:var range="mixed"/> can occur as
                   1950: the children of an element: it does not contain any member that is an
                   1951: empty string, nor does it contain two consecutive members that are
                   1952: both strings</para></listitem></varlistentry>
                   1953: 
                   1954: <varlistentry><term><p:judgement name="bind">
                   1955:       <p:var range="ncname"/>
                   1956:       <p:var range="nameClass"/>
                   1957:       <p:var range="pattern"/>
                   1958:     </p:judgement></term><listitem><para>
                   1959:     
                   1960: asserts that the grammar contains
                   1961: <p:element name="define">
                   1962:   <p:attribute name="name">
                   1963:     <p:var range="ncname"/>
                   1964:   </p:attribute>
                   1965:   <p:element name="element">
                   1966:      <p:var range="nameClass"/>
                   1967:      <p:var range="pattern"/>
                   1968:   </p:element>
                   1969: </p:element>
                   1970: </para></listitem></varlistentry>
                   1971: 
                   1972: </variablelist>
                   1973: 
                   1974: <para>The semantics of the <literal>attribute</literal> pattern are as follows:</para>
                   1975: 
                   1976: <p:proofSystem>
                   1977:   <p:rule name="attribute">
                   1978: 
                   1979:     <p:judgement name="weakMatch">
                   1980:       <p:var range="context"/>
                   1981:       <p:function name="emptySet"/>
                   1982:       <p:var range="string"/>
                   1983:       <p:var range="pattern"/>
                   1984:     </p:judgement>
                   1985: 
                   1986:     <p:judgement name="belongs">
                   1987:       <p:var range="name"/>
                   1988:       <p:var range="nameClass"/>
                   1989:     </p:judgement>
                   1990: 
                   1991:     <p:judgement name="match">
                   1992:       <p:var range="context"/>
                   1993:       <p:function name="attribute">
                   1994:         <p:var range="name"/>
                   1995:         <p:var range="string"/>
                   1996:       </p:function>
                   1997:       <p:function name="emptySequence"/>
                   1998:       <p:element name="attribute">
                   1999:         <p:var range="nameClass"/>
                   2000:        <p:var range="pattern"/>
                   2001:       </p:element>
                   2002:     </p:judgement>
                   2003: 
                   2004:   </p:rule>
                   2005: 
                   2006: </p:proofSystem>
                   2007: 
                   2008: <para>The semantics of the <literal>element</literal> pattern are as follows:</para>
                   2009: 
                   2010: <p:proofSystem>
                   2011:   <p:rule name="element">
                   2012: 
                   2013:     <p:judgement name="weakMatch">
                   2014:       <p:var range="context" sub="1"/>
                   2015:       <p:var range="att"/>
                   2016:       <p:var range="mixed"/>
                   2017:       <p:var range="pattern"/>
                   2018:     </p:judgement>
                   2019: 
                   2020:     <p:judgement name="belongs">
                   2021:       <p:var range="name"/>
                   2022:       <p:var range="nameClass"/>
                   2023:     </p:judgement>
                   2024: 
                   2025:     <p:judgement name="okAsChildren">
                   2026:       <p:var range="mixed"/>
                   2027:     </p:judgement>
                   2028: 
                   2029:     <p:judgement name="bind">
                   2030:       <p:var range="ncname"/>
                   2031:       <p:var range="nameClass"/>
                   2032:       <p:var range="pattern"/>
                   2033:     </p:judgement>
                   2034: 
                   2035:     <p:judgement name="match">
                   2036:       <p:var range="context" sub="2"/>
                   2037:       <p:function name="emptySet"/>
                   2038:       <p:function name="append">
                   2039:         <p:var range="whiteSpace" sub="1"/>
                   2040:        <p:function name="element">
                   2041:          <p:var range="name"/>
                   2042:          <p:var range="context" sub="1"/>
                   2043:          <p:var range="att"/>
                   2044:          <p:var range="mixed"/>
                   2045:        </p:function>
                   2046:         <p:var range="whiteSpace" sub="2"/>
                   2047:       </p:function>
                   2048:       <p:element name="ref">
                   2049:         <p:attribute name="name">
                   2050:           <p:var range="ncname"/>
                   2051:         </p:attribute>
                   2052:       </p:element>
                   2053:     </p:judgement>
                   2054: 
                   2055:   </p:rule>
                   2056: 
                   2057: </p:proofSystem>
                   2058: 
                   2059: 
                   2060: </section>
                   2061: 
                   2062: <section id="data-pattern">
                   2063: <title><literal>data</literal> and <literal>value</literal> pattern</title>
                   2064: 
                   2065: <para>RELAX NG relies on datatype libraries to perform datatyping.
                   2066: A datatype library is identified by a URI.  A datatype within a
                   2067: datatype library is identified by an NCName.  A datatype library
                   2068: provides two services.</para>
                   2069: 
                   2070: <itemizedlist>
                   2071: 
                   2072: <listitem><para>It can determine whether a string is a legal
                   2073: representation of a datatype. This service accepts a list of zero or
                   2074: more parameters. For example, a string datatype might have a parameter
                   2075: specifying the length of a string.  The datatype library determines
                   2076: what parameters are applicable for each datatype.</para></listitem>
                   2077: 
                   2078: <listitem><para>It can determine whether two strings represent the
                   2079: same value of a datatype.  This service does not have any
                   2080: parameters.</para></listitem>
                   2081: 
                   2082: </itemizedlist>
                   2083: 
                   2084: <para>Both services may make use of the context of a string.  For
                   2085: example, a datatype representing a QName would use the namespace
                   2086: map.</para>
                   2087: 
                   2088: <para>We use the following additional notation:</para>
                   2089: 
                   2090: <variablelist>
                   2091: <varlistentry><term><p:judgement name="datatypeAllows">
                   2092:       <p:var range="uri"/>
                   2093:       <p:var range="ncname"/>
                   2094:       <p:var range="params"/>
                   2095:       <p:var range="string"/>
                   2096:       <p:var range="context"/>
                   2097:     </p:judgement></term><listitem><para>
                   2098:     
                   2099: asserts that in the datatype library identified by URI <p:var range="uri"/>, the string <p:var range="string"/> interpreted with
                   2100: context <p:var range="context"/> is a legal
                   2101: value of datatype <p:var range="ncname"/> with parameters <p:var range="params"/></para></listitem></varlistentry>
                   2102: 
                   2103: <varlistentry><term><p:judgement name="datatypeEqual">
                   2104:       <p:var range="uri"/>
                   2105:       <p:var range="ncname"/>
                   2106:       <p:var range="string" sub="1"/>
                   2107:       <p:var range="context" sub="1"/>
                   2108:       <p:var range="string" sub="2"/>
                   2109:       <p:var range="context" sub="2"/>
                   2110:     </p:judgement></term><listitem><para>
                   2111:     
                   2112: asserts that in the datatype library identified by URI <p:var range="uri"/>, string <p:var range="string" sub="1"/> interpreted with
                   2113: context <p:var range="context" sub="1"/> represents the same value of
                   2114: the datatype <p:var range="ncname"/> as the string <p:var range="string" sub="2"/> interpreted in the context of <p:var range="context" sub="2"/>
                   2115: </para></listitem></varlistentry>
                   2116: 
                   2117: <varlistentry><term><p:var range="params"/></term><listitem><para>ranges over sequences of parameters</para></listitem></varlistentry>
                   2118: 
                   2119: <varlistentry><term><p:context>
                   2120:      <p:var range="context"/>
                   2121:    </p:context></term><listitem><para>
                   2122:    
                   2123: within the start-tag of a pattern refers to the context
                   2124: of the pattern element
                   2125: </para></listitem></varlistentry>
                   2126: 
                   2127: <varlistentry>
                   2128: <term>
                   2129:   <p:function name="context">
                   2130:      <p:var range="uri"/>
                   2131:      <p:var range="context"/>
                   2132:   </p:function>
                   2133: </term>
                   2134: <listitem><para>constructs a context which is the same as <p:var range="context"/>
                   2135: except that the default namespace is <p:var range="uri"/>; if <p:var
                   2136: range="uri"/> is the empty string, then there is no default namespace
                   2137: in the constructed context</para></listitem></varlistentry>
                   2138: 
                   2139: </variablelist>
                   2140: 
                   2141: <para>The datatypeEqual function must be reflexive, transitive
                   2142: and symmetric, that is, the following inference rules must hold:</para>
                   2143: 
                   2144: <p:proofSystem>
                   2145:   <p:rule name="datatypeEqual reflexive">
                   2146:     <p:judgement name="datatypeAllows">
                   2147:       <p:var range="uri"/>
                   2148:       <p:var range="ncname"/>
                   2149:       <p:var range="params"/>
                   2150:       <p:var range="string"/>
                   2151:       <p:var range="context"/>
                   2152:     </p:judgement>
                   2153:     <p:judgement name="datatypeEqual">
                   2154:       <p:var range="uri"/>
                   2155:       <p:var range="ncname"/>
                   2156:       <p:var range="string"/>
                   2157:       <p:var range="context"/>
                   2158:       <p:var range="string"/>
                   2159:       <p:var range="context"/>
                   2160:     </p:judgement>
                   2161:   </p:rule>
                   2162:   <p:rule name="datatypeEqual transitive">
                   2163:     <p:judgement name="datatypeEqual">
                   2164:       <p:var range="uri"/>
                   2165:       <p:var range="ncname"/>
                   2166:       <p:var range="string" sub="1"/>
                   2167:       <p:var range="context" sub="1"/>
                   2168:       <p:var range="string" sub="2"/>
                   2169:       <p:var range="context" sub="2"/>
                   2170:     </p:judgement>
                   2171:     <p:judgement name="datatypeEqual">
                   2172:       <p:var range="uri"/>
                   2173:       <p:var range="ncname"/>
                   2174:       <p:var range="string" sub="2"/>
                   2175:       <p:var range="context" sub="3"/>
                   2176:       <p:var range="string" sub="3"/>
                   2177:       <p:var range="context" sub="3"/>
                   2178:     </p:judgement>
                   2179:     <p:judgement name="datatypeEqual">
                   2180:       <p:var range="uri"/>
                   2181:       <p:var range="ncname"/>
                   2182:       <p:var range="string" sub="1"/>
                   2183:       <p:var range="context" sub="1"/>
                   2184:       <p:var range="string" sub="3"/>
                   2185:       <p:var range="context" sub="3"/>
                   2186:     </p:judgement>
                   2187:   </p:rule>
                   2188:   <p:rule name="datatypeEqual symmetric">
                   2189:     <p:judgement name="datatypeEqual">
                   2190:       <p:var range="uri"/>
                   2191:       <p:var range="ncname"/>
                   2192:       <p:var range="string" sub="1"/>
                   2193:       <p:var range="context" sub="1"/>
                   2194:       <p:var range="string" sub="2"/>
                   2195:       <p:var range="context" sub="2"/>
                   2196:     </p:judgement>
                   2197:     <p:judgement name="datatypeEqual">
                   2198:       <p:var range="uri"/>
                   2199:       <p:var range="ncname"/>
                   2200:       <p:var range="string" sub="2"/>
                   2201:       <p:var range="context" sub="2"/>
                   2202:       <p:var range="string" sub="1"/>
                   2203:       <p:var range="context" sub="1"/>
                   2204:     </p:judgement>
                   2205:   </p:rule>
                   2206: </p:proofSystem>
                   2207: 
                   2208: <para>The semantics of the <literal>data</literal> and
                   2209: <literal>value</literal> patterns are as follows:</para>
                   2210: 
                   2211: <p:proofSystem>
                   2212:   <p:rule name="value">
                   2213:     <p:judgement name="datatypeEqual">
                   2214:       <p:var range="uri" sub="1"/>
                   2215:       <p:var range="ncname"/>
                   2216:       <p:var range="string" sub="1"/>
                   2217:       <p:var range="context" sub="1"/>
                   2218:       <p:var range="string" sub="2"/>
                   2219:       <p:function name="context">
                   2220:         <p:var range="uri" sub="2"/>
                   2221:         <p:var range="context" sub="2"/>
                   2222:       </p:function>
                   2223:     </p:judgement>
                   2224:     <p:judgement name="match">
                   2225:       <p:var range="context" sub="1"/>
                   2226:       <p:function name="emptySet"/>
                   2227:       <p:var range="string" sub="1"/>
                   2228:       <p:element name="value">
                   2229:         <p:attribute name="datatypeLibrary">
                   2230:           <p:var range="uri" sub="1"/>
                   2231:         </p:attribute>
                   2232:         <p:attribute name="type">
                   2233:           <p:var range="ncname"/>
                   2234:         </p:attribute>
                   2235:         <p:attribute name="ns">
                   2236:           <p:var range="uri" sub="2"/>
                   2237:         </p:attribute>
                   2238:         <p:context>
                   2239:           <p:var range="context" sub="2"/>
                   2240:         </p:context>
                   2241:         <p:var range="string" sub="2"/>
                   2242:       </p:element>
                   2243:       <p:function name="emptySet"/>
                   2244:       <p:function name="emptySet"/>
                   2245:     </p:judgement>
                   2246:   </p:rule>
                   2247: 
                   2248:   <p:rule name="data 1">
                   2249:     <p:judgement name="datatypeAllows">
                   2250:       <p:var range="uri"/>
                   2251:       <p:var range="ncname"/>
                   2252:       <p:var range="params"/>
                   2253:       <p:var range="string"/>
                   2254:       <p:var range="context"/>
                   2255:     </p:judgement>
                   2256:     <p:judgement name="match">
                   2257:       <p:var range="context"/>
                   2258:       <p:function name="emptySet"/>
                   2259:       <p:var range="string"/>
                   2260:       <p:element name="data">
                   2261:         <p:attribute name="datatypeLibrary">
                   2262:           <p:var range="uri"/>
                   2263:         </p:attribute>
                   2264:         <p:attribute name="type">
                   2265:           <p:var range="ncname"/>
                   2266:         </p:attribute>
                   2267:         <p:var range="params"/>
                   2268:       </p:element>
                   2269:       <p:function name="emptySet"/>
                   2270:       <p:function name="emptySet"/>
                   2271:     </p:judgement>
                   2272:   </p:rule>
                   2273: 
                   2274:   <p:rule name="data 2">
                   2275:     <p:judgement name="datatypeAllows">
                   2276:       <p:var range="uri"/>
                   2277:       <p:var range="ncname"/>
                   2278:       <p:var range="params"/>
                   2279:       <p:var range="string"/>
                   2280:       <p:var range="context"/>
                   2281:     </p:judgement>
                   2282:     <p:not>
                   2283:       <p:judgement name="match">
                   2284:        <p:var range="context"/>
                   2285:        <p:var range="att"/>
                   2286:        <p:var range="string"/>
                   2287:         <p:var range="pattern"/>
                   2288:       </p:judgement>
                   2289:     </p:not>
                   2290:     <p:judgement name="match">
                   2291:       <p:var range="context"/>
                   2292:       <p:function name="emptySet"/>
                   2293:       <p:var range="string"/>
                   2294:       <p:element name="data">
                   2295:         <p:attribute name="datatypeLibrary">
                   2296:           <p:var range="uri"/>
                   2297:         </p:attribute>
                   2298:         <p:attribute name="type">
                   2299:           <p:var range="ncname"/>
                   2300:         </p:attribute>
                   2301:         <p:var range="params"/>
                   2302:         <p:element name="except">
                   2303:           <p:var range="pattern"/>
                   2304:         </p:element>
                   2305:       </p:element>
                   2306:       <p:function name="emptySet"/>
                   2307:       <p:function name="emptySet"/>
                   2308:     </p:judgement>
                   2309:   </p:rule>
                   2310: 
                   2311: </p:proofSystem>
                   2312: 
                   2313: </section>
                   2314: 
                   2315: <section id="built-in-datatype">
                   2316: <title>Built-in datatype library</title>
                   2317: 
                   2318: <para>The empty URI identifies a special built-in datatype library.
                   2319: This provides two datatypes, <literal>string</literal> and
                   2320: <literal>token</literal>.  No parameters are allowed for either of
                   2321: these datatypes.</para>
                   2322: 
                   2323: <variablelist>
                   2324: <varlistentry><term>
                   2325:     <p:judgement name="equal">
                   2326:       <p:var range="string" sub="1"/>
                   2327:       <p:var range="string" sub="2"/>
                   2328:     </p:judgement></term>
                   2329: <listitem><para>asserts that <p:var range="string" sub="1"/>
                   2330: and <p:var range="string" sub="2"/> are identical</para></listitem>
                   2331: </varlistentry>
                   2332: 
                   2333: <varlistentry><term>
                   2334:       <p:function name="normalizeWhiteSpace">
                   2335:         <p:var range="string"/>
                   2336:       </p:function>
                   2337: </term>
                   2338: <listitem><para>returns the string <p:var range="string"/>,
                   2339: with leading and trailing whitespace characters removed,
                   2340: and with each other maximal sequence of whitespace characters
                   2341: replaced by a single space character </para></listitem>
                   2342: </varlistentry>
                   2343: </variablelist>
                   2344: 
                   2345: <para>The semantics of the two built-in datatypes are as
                   2346: follows:</para>
                   2347: 
                   2348: <p:proofSystem>
                   2349: 
                   2350:   <p:rule name="string allows">
                   2351:     <p:judgement name="datatypeAllows">
                   2352:       <p:function name="emptyString"/>
                   2353:       <p:string>string</p:string>
                   2354:       <p:function name="emptySequence"/>
                   2355:       <p:var range="string"/>
                   2356:       <p:var range="context"/>
                   2357:     </p:judgement>
                   2358:   </p:rule>
                   2359: 
                   2360:   <p:rule name="string equal">
                   2361:     <p:judgement name="datatypeEqual">
                   2362:       <p:function name="emptyString"/>
                   2363:       <p:string>string</p:string>
                   2364:       <p:var range="string"/>
                   2365:       <p:var range="context" sub="1"/>
                   2366:       <p:var range="string"/>
                   2367:       <p:var range="context" sub="2"/>
                   2368:     </p:judgement>
                   2369:   </p:rule>
                   2370: 
                   2371:   <p:rule name="token allows">
                   2372:     <p:judgement name="datatypeAllows">
                   2373:       <p:function name="emptyString"/>
                   2374:       <p:string>token</p:string>
                   2375:       <p:function name="emptySequence"/>
                   2376:       <p:var range="string"/>
                   2377:       <p:var range="context"/>
                   2378:     </p:judgement>
                   2379:   </p:rule>
                   2380: 
                   2381:   <p:rule name="token equal">
                   2382:     <p:judgement name="equal">
                   2383:       <p:function name="normalizeWhiteSpace">
                   2384:         <p:var range="string" sub="1"/>
                   2385:       </p:function>
                   2386:       <p:function name="normalizeWhiteSpace">
                   2387:         <p:var range="string" sub="2"/>
                   2388:       </p:function>
                   2389:     </p:judgement>
                   2390:     <p:judgement name="datatypeEqual">
                   2391:       <p:function name="emptyString"/>
                   2392:       <p:string>token</p:string>
                   2393:       <p:var range="string" sub="1"/>
                   2394:       <p:var range="context" sub="1"/>
                   2395:       <p:var range="string" sub="2"/>
                   2396:       <p:var range="context" sub="2"/>
                   2397:     </p:judgement>
                   2398:   </p:rule>
                   2399: 
                   2400: </p:proofSystem>
                   2401: 
                   2402: </section>
                   2403: 
                   2404: <section>
                   2405: <title><literal>list</literal> pattern</title>
                   2406: 
                   2407: <para>We use the following additional notation:</para>
                   2408: 
                   2409: <variablelist>
                   2410: <varlistentry><term><p:function name="split">
                   2411:         <p:var range="string"/>
                   2412:       </p:function></term><listitem><para>
                   2413:       
                   2414: returns a sequence of strings one for each whitespace delimited token
                   2415: of <p:var range="string"/>; each string in the returned sequence will
                   2416: be non-empty and will not contain any
                   2417: whitespace</para></listitem></varlistentry>
                   2418: 
                   2419: </variablelist>
                   2420: 
                   2421: <para>The semantics of the <literal>list</literal> pattern are as follows:</para>
                   2422: 
                   2423: <p:proofSystem>
                   2424:   <p:rule name="list">
                   2425: 
                   2426:     <p:judgement name="match">
                   2427:       <p:var range="context"/>
                   2428:       <p:function name="emptySet"/>
                   2429:       <p:function name="split">
                   2430:         <p:var range="string"/>
                   2431:       </p:function>
                   2432:       <p:var range="pattern"/>
                   2433:     </p:judgement>
                   2434: 
                   2435:     <p:judgement name="match">
                   2436:       <p:var range="context"/>
                   2437:       <p:function name="emptySet"/>
                   2438:       <p:var range="string"/>
                   2439:       <p:element name="list">
                   2440:        <p:var range="pattern"/>
                   2441:       </p:element>
                   2442:     </p:judgement>
                   2443: 
                   2444:   </p:rule>
                   2445: </p:proofSystem>
                   2446: 
                   2447: <note><para>It is crucial in the above inference rule that the
                   2448: sequence that is matched against a pattern can contain consecutive
                   2449: strings.</para></note>
                   2450: 
                   2451: </section>
                   2452: 
                   2453: </section>
                   2454: 
                   2455: <section id="validity">
                   2456: <title>Validity</title>
                   2457: 
                   2458: <para>Now we can define when an element is valid with respect to a
                   2459: schema.  We use the following additional notation:</para>
                   2460: 
                   2461: <variablelist>
                   2462: 
                   2463: <varlistentry><term><p:var range="element"/></term><listitem><para>ranges over elements</para></listitem></varlistentry>
                   2464: 
                   2465: <varlistentry><term><p:judgement name="valid">
                   2466:       <p:var range="element"/>
                   2467:     </p:judgement></term><listitem><para>
                   2468:     
                   2469: asserts that the element <p:var range="element"/> is valid with
                   2470: respect to the grammar</para></listitem></varlistentry>
                   2471: 
                   2472: <varlistentry><term><p:judgement name="start">
                   2473:       <p:var range="pattern"/>
                   2474:     </p:judgement></term><listitem><para>
                   2475: asserts that the grammar contains
                   2476: <p:element name="start"><p:var range="pattern"/> </p:element></para></listitem></varlistentry>
                   2477: 
                   2478: </variablelist>
                   2479: 
                   2480: <para>An element is valid if together with an empty set of attributes
                   2481: it matches the <literal>start</literal> pattern of the grammar.</para>
                   2482: 
                   2483: <p:proofSystem>
                   2484:   <p:rule name="valid">
                   2485:     <p:judgement name="start">
                   2486:       <p:var range="pattern"/>
                   2487:     </p:judgement>
                   2488:     <p:judgement name="match">
                   2489:       <p:var range="context"/>
                   2490:       <p:function name="emptySet"/>
                   2491:       <p:var range="element"/>
                   2492:       <p:var range="pattern"/>
                   2493:     </p:judgement>
                   2494:     <p:judgement name="valid">
                   2495:       <p:var range="element"/>
                   2496:     </p:judgement>
                   2497:   </p:rule>
                   2498:       
                   2499: 
                   2500: </p:proofSystem>
                   2501: 
                   2502: </section>
                   2503: 
                   2504: <section>
                   2505: <title>Example</title>
                   2506: 
                   2507: <para>Let <p:var range="element" sub="0"/> be</para>
                   2508: 
                   2509: <p:formula>
                   2510: 
                   2511: <p:function name="element">
                   2512:   <p:function name="name">
                   2513:     <p:function name="emptyString"/>
                   2514:     <p:string>foo</p:string>
                   2515:   </p:function>
                   2516:   <p:var range="context" sub="0"/>
                   2517:   <p:function name="emptySet"/>
                   2518:   <p:var range="mixed"/>
                   2519: </p:function>
                   2520: 
                   2521: </p:formula>
                   2522: 
                   2523: <para>where <p:var range="mixed"/> is</para>
                   2524: 
                   2525: <p:formula>
                   2526:   <p:function name="append">
                   2527:     <p:var range="element" sub="1"/>
                   2528:     <p:var range="element" sub="2"/>
                   2529:   </p:function>
                   2530: </p:formula>
                   2531: 
                   2532: <para>and <p:var range="element" sub="1"/> is</para>
                   2533: 
                   2534: <p:formula>
                   2535:   <p:function name="element">
                   2536:     <p:function name="name">
                   2537:       <p:string>http://www.example.com/n1</p:string>
                   2538:       <p:string>bar1</p:string>
                   2539:     </p:function>
                   2540:     <p:var range="context" sub="1"/>
                   2541:     <p:function name="emptySet"/>
                   2542:     <p:function name="emptySequence"/>
                   2543:   </p:function>
                   2544: </p:formula>
                   2545: 
                   2546: <para>and <p:var range="element" sub="2"/> is</para>
                   2547: 
                   2548: <p:formula>
                   2549:   <p:function name="element">
                   2550:     <p:function name="name">
                   2551:       <p:string>http://www.example.com/n2</p:string>
                   2552:       <p:string>bar2</p:string>
                   2553:     </p:function>
                   2554:     <p:var range="context" sub="2"/>
                   2555:     <p:function name="emptySet"/>
                   2556:     <p:function name="emptySequence"/>
                   2557:   </p:function>
                   2558: </p:formula>
                   2559: 
                   2560: <para>Assuming appropriate definitions of <p:var range="context"
                   2561: sub="0"/>, <p:var range="context" sub="1"/> and <p:var range="context"
                   2562: sub="2"/>, this represents the document in <xref
                   2563: linkend="data-model-example"/>.</para>
                   2564: 
                   2565: <para>We now show how <p:var range="element" sub="0"/> can be shown to
                   2566: be valid with respect to the schema in <xref
                   2567: linkend="simple-syntax-example"/>.  The schema is equivalent to the
                   2568: following propositions:</para>
                   2569: 
                   2570: <p:formula>
                   2571:   <p:judgement name="start">
                   2572:     <p:element name="ref">
                   2573:       <p:attribute name="name"><p:string>foo</p:string></p:attribute>
                   2574:     </p:element>
                   2575:   </p:judgement>
                   2576: </p:formula>
                   2577: 
                   2578: <p:formula>
                   2579:   <p:judgement name="bind">
                   2580:     <p:string>foo.element</p:string>
                   2581:     <p:element name="name">
                   2582:       <p:attribute name="ns"><p:function name="emptyString"/></p:attribute>
                   2583:       <p:string>foo</p:string>
                   2584:     </p:element>
                   2585:     <p:element name="group">
                   2586:       <p:element name="ref">
                   2587:        <p:attribute name="name">
                   2588:          <p:string>bar1</p:string>
                   2589:        </p:attribute>
                   2590:       </p:element>
                   2591:       <p:element name="ref">
                   2592:        <p:attribute name="name">
                   2593:          <p:string>bar2</p:string>
                   2594:        </p:attribute>
                   2595:       </p:element>
                   2596:     </p:element>
                   2597:   </p:judgement>
                   2598: </p:formula>
                   2599: 
                   2600: <p:formula>
                   2601:   <p:judgement name="bind">
                   2602:     <p:string>bar1.element</p:string>
                   2603:     <p:element name="name">
                   2604:       <p:attribute name="ns">
                   2605:        <p:string>http://www.example.com/n1</p:string>
                   2606:       </p:attribute>
                   2607:       <p:string>bar1</p:string>
                   2608:     </p:element>
                   2609:     <p:element name="empty"/>
                   2610:   </p:judgement>
                   2611: </p:formula>
                   2612: 
                   2613: <p:formula>
                   2614:   <p:judgement name="bind">
                   2615:     <p:string>bar2.element</p:string>
                   2616:     <p:element name="name">
                   2617:       <p:attribute name="ns">
                   2618:        <p:string>http://www.example.com/n2</p:string>
                   2619:       </p:attribute>
                   2620:       <p:string>bar2</p:string>
                   2621:     </p:element>
                   2622:     <p:element name="empty"/>
                   2623:   </p:judgement>
                   2624: </p:formula>
                   2625: 
                   2626: 
                   2627: <para>Let name class <p:var range="nameClass" sub="1"/> be</para>
                   2628: 
                   2629: <p:formula>
                   2630:   <p:element name="name">
                   2631:     <p:attribute name="ns">
                   2632:       <p:string>http://www.example.com/n1</p:string>
                   2633:     </p:attribute>
                   2634:     <p:string>bar1</p:string>
                   2635:   </p:element>
                   2636: </p:formula>
                   2637: 
                   2638: <para>and let <p:var range="nameClass" sub="2"/> be</para>
                   2639: 
                   2640: <p:formula>
                   2641:   <p:element name="name">
                   2642:     <p:attribute name="ns">
                   2643:       <p:string>http://www.example.com/n2</p:string>
                   2644:     </p:attribute>
                   2645:     <p:string>bar2</p:string>
                   2646:   </p:element>
                   2647: </p:formula>
                   2648: 
                   2649: <para>Then, by the inference rule (name) in <xref
                   2650: linkend="name-classes"/>, we have</para>
                   2651: 
                   2652: <p:formula>
                   2653:   <p:judgement name="belongs">
                   2654:     <p:function name="name">
                   2655:       <p:string>http://www.example.com/n1</p:string>
                   2656:       <p:string>bar1</p:string>
                   2657:     </p:function>
                   2658:     <p:var range="nameClass" sub="1"/>
                   2659:   </p:judgement>
                   2660: </p:formula>
                   2661: 
                   2662: <para>and</para>
                   2663: 
                   2664: <p:formula>
                   2665:   <p:judgement name="belongs">
                   2666:     <p:function name="name">
                   2667:       <p:string>http://www.example.com/n2</p:string>
                   2668:       <p:string>bar2</p:string>
                   2669:     </p:function>
                   2670:     <p:var range="nameClass" sub="2"/>
                   2671:   </p:judgement>
                   2672: </p:formula>
                   2673: 
                   2674: 
                   2675: <para>By the inference rule (empty) in <xref linkend="empty-pattern"/>,
                   2676: we have</para>
                   2677: 
                   2678: <p:formula>
                   2679:   <p:judgement name="match">
                   2680:     <p:var range="context" sub="1"/>
                   2681:     <p:function name="emptySet"/>
                   2682:     <p:function name="emptySequence"/>
                   2683:     <p:element name="empty"></p:element>
                   2684:   </p:judgement>
                   2685: </p:formula>
                   2686: 
                   2687: <para>and</para>
                   2688: 
                   2689: <p:formula>
                   2690:   <p:judgement name="match">
                   2691:     <p:var range="context" sub="2"/>
                   2692:     <p:function name="emptySet"/>
                   2693:     <p:function name="emptySequence"/>
                   2694:     <p:element name="empty"></p:element>
                   2695:   </p:judgement>
                   2696: </p:formula>
                   2697: 
                   2698: <para>Thus by the inference rule (element) in <xref
                   2699: linkend="element-pattern"/>, we have</para>
                   2700: 
                   2701: <p:formula>
                   2702:   <p:judgement name="match">
                   2703:     <p:var range="context" sub="0"/>
                   2704:     <p:function name="emptySet"/>
                   2705:     <p:var range="element" sub="1"/>
                   2706:     <p:element name="ref">
                   2707:       <p:attribute name="name">
                   2708:         <p:string>bar1</p:string>
                   2709:       </p:attribute>
                   2710:     </p:element>
                   2711:   </p:judgement>
                   2712: </p:formula>
                   2713: 
                   2714: <para>Note that we have chosen <p:var
                   2715: range="context" sub="0"/>, since any context is allowed.</para>
                   2716: 
                   2717: <para>Likewise, we have</para>
                   2718: 
                   2719: <p:formula>
                   2720:   <p:judgement name="match">
                   2721:     <p:var range="context" sub="0"/>
                   2722:     <p:function name="emptySet"/>
                   2723:     <p:var range="element" sub="2"/>
                   2724:     <p:element name="ref">
                   2725:       <p:attribute name="name">
                   2726:         <p:string>bar2</p:string>
                   2727:       </p:attribute>
                   2728:     </p:element>
                   2729:   </p:judgement>
                   2730: </p:formula>
                   2731: 
                   2732: <para>By the inference rule (group) in <xref
                   2733: linkend="choice-pattern"/>, we have</para>
                   2734: 
                   2735: <p:formula>
                   2736:   <p:judgement name="match">
                   2737:     <p:var range="context" sub="0"/>
                   2738:     <p:function name="emptySet"/>
                   2739:     <p:function name="append">
                   2740:       <p:var range="element" sub="1"/>
                   2741:       <p:var range="element" sub="2"/>
                   2742:     </p:function>
                   2743:     <p:element name="group">
                   2744:       <p:element name="ref">
                   2745:         <p:attribute name="name">
                   2746:           <p:string>bar1</p:string>
                   2747:         </p:attribute>
                   2748:       </p:element>
                   2749:       <p:element name="ref">
                   2750:         <p:attribute name="name">
                   2751:           <p:string>bar2</p:string>
                   2752:         </p:attribute>
                   2753:       </p:element>
                   2754:     </p:element>
                   2755:   </p:judgement>
                   2756: </p:formula>
                   2757: 
                   2758: <para>By the inference rule (element) in <xref
                   2759: linkend="element-pattern"/>, we have</para>
                   2760: 
                   2761: <p:formula>
                   2762:   <p:judgement name="match">
                   2763:     <p:var range="context" sub="3"/>
                   2764:     <p:function name="emptySet"/>
                   2765:     <p:function name="element">
                   2766:       <p:function name="name">
                   2767:         <p:function name="emptyString"/>
                   2768:         <p:string>foo</p:string>
                   2769:       </p:function>
                   2770:       <p:var range="context" sub="0"/>
                   2771:       <p:function name="emptySet"/>
                   2772:       <p:var range="mixed"/>
                   2773:     </p:function>
                   2774:     <p:element name="ref">
                   2775:       <p:attribute name="name">
                   2776:         <p:string>foo</p:string>
                   2777:       </p:attribute>
                   2778:     </p:element>
                   2779:   </p:judgement>
                   2780: </p:formula>
                   2781: 
                   2782: <para>Here <p:var range="context" sub="3"/> is an arbitrary
                   2783: context.</para>
                   2784: 
                   2785: <para>Thus we can apply the inference rule (valid) in <xref
                   2786: linkend="validity"/> and obtain</para>
                   2787: 
                   2788: <p:formula>
                   2789:   <p:judgement name="valid">
                   2790:     <p:var range="element" sub="0"/>
                   2791:   </p:judgement>
                   2792: </p:formula>
                   2793: 
                   2794: </section>
                   2795: 
                   2796: </section>
                   2797: 
                   2798: <section id="restriction">
                   2799: <title>Restrictions</title>
                   2800: 
                   2801: <para>The following constraints are all checked after the grammar has
                   2802: been transformed to the simple form described in <xref
                   2803: linkend="simple-syntax"/>. The purpose of these restrictions is to
                   2804: catch user errors and to facilitate implementation.</para>
                   2805: 
                   2806: <section id="contextual-restriction">
                   2807: <title>Contextual restrictions</title>
                   2808: 
                   2809: <para>In this section we describe restrictions on where elements are
                   2810: allowed in the schema based on the names of the ancestor elements. We
                   2811: use the concept of a <firstterm>prohibited path</firstterm> to
                   2812: describe these restrictions. A path is a sequence of NCNames separated
                   2813: by <literal>/</literal> or <literal>//</literal>.</para>
                   2814: 
                   2815: <itemizedlist>
                   2816: 
                   2817: <listitem><para>An element matches a path
                   2818: <replaceable>x</replaceable>, where <replaceable>x</replaceable> is an
                   2819: NCName, if and only if the local name of the element is
                   2820: <replaceable>x</replaceable></para></listitem>
                   2821: 
                   2822: <listitem><para>An element matches a path
                   2823: <replaceable>x</replaceable><literal>/</literal><replaceable>p</replaceable>,
                   2824: where <replaceable>x</replaceable> is an NCName and
                   2825: <replaceable>p</replaceable> is a path, if and only if the local name
                   2826: of the element is <replaceable>x</replaceable> and the element has a
                   2827: child that matches <replaceable>p</replaceable></para></listitem>
                   2828: 
                   2829: <listitem><para>An element matches a path
                   2830: <replaceable>x</replaceable><literal>//</literal><replaceable>p</replaceable>,
                   2831: where <replaceable>x</replaceable> is an NCName and
                   2832: <replaceable>p</replaceable> is a path, if and only if the local name
                   2833: of the element is <replaceable>x</replaceable> and the element has a
                   2834: descendant that matches <replaceable>p</replaceable></para></listitem>
                   2835: 
                   2836: </itemizedlist>
                   2837: 
                   2838: <para>For example, the element</para>
                   2839: 
                   2840: <programlisting><![CDATA[<foo>
                   2841:   <bar>
                   2842:     <baz/>
                   2843:   </bar>
                   2844: </foo>]]></programlisting>
                   2845: 
                   2846: <para>matches the paths <literal>foo</literal>,
                   2847: <literal>foo/bar</literal>, <literal>foo//bar</literal>,
                   2848: <literal>foo//baz</literal>, <literal>foo/bar/baz</literal>,
                   2849: <literal>foo/bar//baz</literal> and <literal>foo//bar/baz</literal>,
                   2850: but not <literal>foo/baz</literal> or
                   2851: <literal>foobar</literal>.</para>
                   2852: 
                   2853: <para>A correct RELAX NG schema must be such that, after
                   2854: transformation to the simple form, it does not contain any element
                   2855: that matches a prohibited path.</para>
                   2856: 
                   2857: <section>
                   2858: <title><literal>attribute</literal> pattern</title>
                   2859: 
                   2860: <para>The following paths are prohibited:</para>
                   2861: 
                   2862: <itemizedlist>
                   2863: <listitem><para><literal>attribute//ref</literal></para></listitem>
                   2864: <listitem><para><literal>attribute//attribute</literal></para></listitem>
                   2865: </itemizedlist>
                   2866: 
                   2867: </section>
                   2868: 
                   2869: <section>
                   2870: <title><literal>oneOrMore</literal> pattern</title>
                   2871: 
                   2872: <para>The following paths are prohibited:</para>
                   2873: 
                   2874: <itemizedlist>
                   2875: <listitem><para><literal>oneOrMore//group//attribute</literal></para></listitem>
                   2876: <listitem><para><literal>oneOrMore//interleave//attribute</literal></para></listitem>
                   2877: </itemizedlist>
                   2878: 
                   2879: </section>
                   2880: 
                   2881: <section id="list-restrictions">
                   2882: <title><literal>list</literal> pattern</title>
                   2883: 
                   2884: <para>The following paths are prohibited:</para>
                   2885: 
                   2886: <itemizedlist>
                   2887: <listitem><para><literal>list//list</literal></para></listitem>
                   2888: <listitem><para><literal>list//ref</literal></para></listitem>
                   2889: <listitem><para><literal>list//attribute</literal></para></listitem>
                   2890: <listitem><para><literal>list//text</literal></para></listitem>
                   2891: <listitem><para><literal>list//interleave</literal></para></listitem>
                   2892: </itemizedlist>
                   2893: </section>
                   2894: 
                   2895: <section id="context-data-except">
                   2896: <title><literal>except</literal> in <literal>data</literal> pattern</title>
                   2897: 
                   2898: <para>The following paths are prohibited:</para>
                   2899: 
                   2900: <itemizedlist>
                   2901: <listitem><para><literal>data/except//attribute</literal></para></listitem>
                   2902: <listitem><para><literal>data/except//ref</literal></para></listitem>
                   2903: <listitem><para><literal>data/except//text</literal></para></listitem>
                   2904: <listitem><para><literal>data/except//list</literal></para></listitem>
                   2905: <listitem><para><literal>data/except//group</literal></para></listitem>
                   2906: <listitem><para><literal>data/except//interleave</literal></para></listitem>
                   2907: <listitem><para><literal>data/except//oneOrMore</literal></para></listitem>
                   2908: <listitem><para><literal>data/except//empty</literal></para></listitem>
                   2909: </itemizedlist>
                   2910: 
                   2911: <note><para>This implies that an <literal>except</literal> element
                   2912: with a <literal>data</literal> parent can contain only
                   2913: <literal>data</literal>, <literal>value</literal> and
                   2914: <literal>choice</literal> elements.</para></note>
                   2915: 
                   2916: </section>
                   2917: 
                   2918: <section id="context-start">
                   2919: <title><literal>start</literal> element</title>
                   2920: 
                   2921: <para>The following paths are prohibited:</para>
                   2922: 
                   2923: <itemizedlist>
                   2924: <listitem><para><literal>start//attribute</literal></para></listitem>
                   2925: <listitem><para><literal>start//data</literal></para></listitem>
                   2926: <listitem><para><literal>start//value</literal></para></listitem>
                   2927: <listitem><para><literal>start//text</literal></para></listitem>
                   2928: <listitem><para><literal>start//list</literal></para></listitem>
                   2929: <listitem><para><literal>start//group</literal></para></listitem>
                   2930: <listitem><para><literal>start//interleave</literal></para></listitem>
                   2931: <listitem><para><literal>start//oneOrMore</literal></para></listitem>
                   2932: <listitem><para><literal>start//empty</literal></para></listitem>
                   2933: </itemizedlist>
                   2934: </section>
                   2935: 
                   2936: </section>
                   2937: 
                   2938: <section id="string-sequences">
                   2939: <title>String sequences</title>
                   2940: 
                   2941: <para>RELAX NG does not allow a pattern such as:</para>
                   2942: 
                   2943: <programlisting><![CDATA[<element name="foo">
                   2944:   <group>
                   2945:     <data type="int"/>
                   2946:     <element name="bar">
                   2947:       <empty/>
                   2948:     </element>
                   2949:   </group>
                   2950: </element>]]></programlisting>
                   2951: 
                   2952: <para>Nor does it allow a pattern such as:</para>
                   2953: 
                   2954: <programlisting><![CDATA[<element name="foo">
                   2955:   <group>
                   2956:     <data type="int"/>
                   2957:     <text/>
                   2958:   </group>
                   2959: </element>]]></programlisting>
                   2960: 
                   2961: <para>More generally, if the pattern for the content of an element or
                   2962: attribute contains</para>
                   2963: 
                   2964: <itemizedlist>
                   2965: 
                   2966: <listitem><para>a pattern that can match a child
                   2967: (that is, an <literal>element</literal>, <literal>data</literal>,
                   2968: <literal>value</literal>, <literal>list</literal> or
                   2969: <literal>text</literal> pattern), and</para></listitem>
                   2970: 
                   2971: <listitem><para>a pattern that matches a single string (that is, a
                   2972: <literal>data</literal>, <literal>value</literal> or
                   2973: <literal>list</literal> pattern),</para></listitem>
                   2974: 
                   2975: </itemizedlist>
                   2976: 
                   2977: <para>then the two patterns must be alternatives to each other.</para>
                   2978: 
                   2979: <para>This rule does not apply to patterns occurring within a
                   2980: <literal>list</literal> pattern.</para>
                   2981: 
                   2982: <para>To formalize this, we use the concept of a content-type.  A
                   2983: pattern that is allowable as the content of an element has one of
                   2984: three content-types: empty, complex and simple.  We use the following
                   2985: notation.</para>
                   2986: 
                   2987: <variablelist>
                   2988: 
                   2989: <varlistentry>
                   2990: <term><p:function name="empty"/></term>
                   2991: <listitem><para>returns the empty content-type</para></listitem>
                   2992: </varlistentry>
                   2993: 
                   2994: <varlistentry>
                   2995: <term><p:function name="complex"/></term>
                   2996: <listitem><para>returns the complex content-type</para></listitem>
                   2997: </varlistentry>
                   2998: 
                   2999: <varlistentry>
                   3000: <term><p:function name="simple"/></term>
                   3001: <listitem><para>returns the simple content-type</para></listitem>
                   3002: </varlistentry>
                   3003: 
                   3004: <varlistentry><term><p:var range="contentType"/></term>
                   3005: <listitem><para>ranges over content-types</para></listitem>
                   3006: </varlistentry>
                   3007: 
                   3008: <varlistentry><term>
                   3009:   <p:judgement name="groupable">
                   3010:     <p:var range="contentType" sub="1"/>
                   3011:     <p:var range="contentType" sub="2"/>
                   3012:   </p:judgement>
                   3013: </term>
                   3014: <listitem><para>asserts that the content-types <p:var
                   3015: range="contentType" sub="1"/> and <p:var range="contentType" sub="2"/>
                   3016: are groupable</para></listitem>
                   3017: </varlistentry>
                   3018: 
                   3019: </variablelist>
                   3020: 
                   3021: <para>The empty content-type is groupable with anything.  In addition,
                   3022: the complex content-type is groupable with the complex content-type. The
                   3023: following rules formalize this.</para>
                   3024: 
                   3025: <p:proofSystem>
                   3026: <p:rule name="group empty 1">
                   3027:   <p:judgement name="groupable">
                   3028:     <p:function name="empty"/>
                   3029:     <p:var range="contentType"/>
                   3030:   </p:judgement>
                   3031: </p:rule>
                   3032: <p:rule name="group empty 2">
                   3033:   <p:judgement name="groupable">
                   3034:     <p:var range="contentType"/>
                   3035:     <p:function name="empty"/>
                   3036:   </p:judgement>
                   3037: </p:rule>
                   3038: <p:rule name="group complex">
                   3039:   <p:judgement name="groupable">
                   3040:     <p:function name="complex"/>
                   3041:     <p:function name="complex"/>
                   3042:   </p:judgement>
                   3043: </p:rule>
                   3044: </p:proofSystem>
                   3045: 
                   3046: <para>Some patterns have a content-type. We use the following
                   3047: additional notation.</para>
                   3048: 
                   3049: <variablelist>
                   3050: 
                   3051: <varlistentry><term>
                   3052:   <p:judgement name="contentType">
                   3053:     <p:var range="pattern"/>
                   3054:     <p:var range="contentType"/>
                   3055:   </p:judgement>
                   3056: </term>
                   3057: <listitem><para>asserts that pattern <p:var range="pattern"/> has
                   3058: content-type <p:var range="contentType"/></para></listitem>
                   3059: </varlistentry>
                   3060: 
                   3061: <varlistentry><term>
                   3062:   <p:function name="max">
                   3063:     <p:var range="contentType" sub="1"/>
                   3064:     <p:var range="contentType" sub="2"/>
                   3065:   </p:function>
                   3066: </term>
                   3067: <listitem><para>returns the maximum of <p:var range="contentType"
                   3068: sub="1"/> and <p:var range="contentType" sub="2"/> where the
                   3069: content-types in increasing order are <p:function name="empty"/>,
                   3070: <p:function name="complex"/>, <p:function
                   3071: name="simple"/></para></listitem>
                   3072: </varlistentry>
                   3073: 
                   3074: </variablelist>
                   3075: 
                   3076: <para>The following rules define when a pattern has a content-type and,
                   3077: if so, what it is.</para>
                   3078: 
                   3079: <p:proofSystem>
                   3080: <p:rule name="value">
                   3081:   <p:judgement name="contentType">
                   3082:     <p:element name="value">
                   3083:       <p:attribute name="datatypeLibrary">
                   3084:        <p:var range="uri" sub="1"/>
                   3085:       </p:attribute>
                   3086:       <p:attribute name="type">
                   3087:        <p:var range="ncname"/>
                   3088:       </p:attribute>
                   3089:       <p:attribute name="ns">
                   3090:        <p:var range="uri" sub="2"/>
                   3091:       </p:attribute>
                   3092:       <p:var range="string"/>
                   3093:     </p:element>
                   3094:     <p:function name="simple"/>
                   3095:   </p:judgement>
                   3096: </p:rule>
                   3097: 
                   3098: <p:rule name="data 1">
                   3099:   <p:judgement name="contentType">
                   3100:     <p:element name="data">
                   3101:       <p:attribute name="datatypeLibrary">
                   3102:        <p:var range="uri"/>
                   3103:       </p:attribute>
                   3104:       <p:attribute name="type">
                   3105:        <p:var range="ncname"/>
                   3106:       </p:attribute>
                   3107:       <p:var range="params"/>
                   3108:     </p:element>
                   3109:     <p:function name="simple"/>
                   3110:   </p:judgement>
                   3111: </p:rule>
                   3112: 
                   3113: <p:rule name="data 2">
                   3114:   <p:judgement name="contentType">
                   3115:     <p:var range="pattern"/>
                   3116:     <p:var range="contentType"/>
                   3117:   </p:judgement>
                   3118:   <p:judgement name="contentType">
                   3119:     <p:element name="data">
                   3120:       <p:attribute name="datatypeLibrary">
                   3121:        <p:var range="uri"/>
                   3122:       </p:attribute>
                   3123:       <p:attribute name="type">
                   3124:        <p:var range="ncname"/>
                   3125:       </p:attribute>
                   3126:       <p:var range="params"/>
                   3127:       <p:element name="except">
                   3128:         <p:var range="pattern"/>
                   3129:       </p:element>
                   3130:     </p:element>
                   3131:     <p:function name="simple"/>
                   3132:   </p:judgement>
                   3133: </p:rule>
                   3134: 
                   3135: <p:rule name="list">
                   3136:   <p:judgement name="contentType">
                   3137:     <p:element name="list">
                   3138:       <p:var range="pattern"/>
                   3139:     </p:element>
                   3140:     <p:function name="simple"/>
                   3141:   </p:judgement>
                   3142: </p:rule>
                   3143: 
                   3144: <p:rule name="text">
                   3145:   <p:judgement name="contentType">
                   3146:     <p:element name="text"/>
                   3147:     <p:function name="complex"/>
                   3148:   </p:judgement>
                   3149: </p:rule>
                   3150: 
                   3151: <p:rule name="ref">
                   3152:   <p:judgement name="contentType">
                   3153:     <p:element name="ref">
                   3154:       <p:attribute name="name">
                   3155:        <p:var range="ncname"/>
                   3156:       </p:attribute>
                   3157:     </p:element>
                   3158:     <p:function name="complex"/>
                   3159:   </p:judgement>
                   3160: </p:rule>
                   3161: 
                   3162: <p:rule name="empty">
                   3163:   <p:judgement name="contentType">
                   3164:     <p:element name="empty"/>
                   3165:     <p:function name="empty"/>
                   3166:   </p:judgement>
                   3167: </p:rule>
                   3168: 
                   3169: <p:rule name="attribute">
                   3170:   <p:judgement name="contentType">
                   3171:     <p:var range="pattern"/>
                   3172:     <p:var range="contentType"/>
                   3173:   </p:judgement>
                   3174:   <p:judgement name="contentType">
                   3175:     <p:element name="attribute">
                   3176:       <p:var range="nameClass"/>
                   3177:       <p:var range="pattern"/>
                   3178:     </p:element>
                   3179:     <p:function name="empty"/>
                   3180:   </p:judgement>
                   3181: </p:rule>
                   3182: 
                   3183: <p:rule name="group">
                   3184:   <p:judgement name="contentType">
                   3185:     <p:var range="pattern" sub="1"/>
                   3186:     <p:var range="contentType" sub="1"/>
                   3187:   </p:judgement>
                   3188:   <p:judgement name="contentType">
                   3189:     <p:var range="pattern" sub="2"/>
                   3190:     <p:var range="contentType" sub="2"/>
                   3191:   </p:judgement>
                   3192:   <p:judgement name="groupable">
                   3193:     <p:var range="contentType" sub="1"/>
                   3194:     <p:var range="contentType" sub="2"/>
                   3195:   </p:judgement>
                   3196:   <p:judgement name="contentType">
                   3197:     <p:element name="group">
                   3198:       <p:var range="pattern" sub="1"/>
                   3199:       <p:var range="pattern" sub="2"/>
                   3200:     </p:element>
                   3201:     <p:function name="max">
                   3202:       <p:var range="contentType" sub="1"/>
                   3203:       <p:var range="contentType" sub="2"/>
                   3204:     </p:function>
                   3205:   </p:judgement>
                   3206: </p:rule>
                   3207: 
                   3208: <p:rule name="interleave">
                   3209:   <p:judgement name="contentType">
                   3210:     <p:var range="pattern" sub="1"/>
                   3211:     <p:var range="contentType" sub="1"/>
                   3212:   </p:judgement>
                   3213:   <p:judgement name="contentType">
                   3214:     <p:var range="pattern" sub="2"/>
                   3215:     <p:var range="contentType" sub="2"/>
                   3216:   </p:judgement>
                   3217:   <p:judgement name="groupable">
                   3218:     <p:var range="contentType" sub="1"/>
                   3219:     <p:var range="contentType" sub="2"/>
                   3220:   </p:judgement>
                   3221:   <p:judgement name="contentType">
                   3222:     <p:element name="interleave">
                   3223:       <p:var range="pattern" sub="1"/>
                   3224:       <p:var range="pattern" sub="2"/>
                   3225:     </p:element>
                   3226:     <p:function name="max">
                   3227:       <p:var range="contentType" sub="1"/>
                   3228:       <p:var range="contentType" sub="2"/>
                   3229:     </p:function>
                   3230:   </p:judgement>
                   3231: </p:rule>
                   3232: 
                   3233: <p:rule name="oneOrMore">
                   3234:   <p:judgement name="contentType">
                   3235:     <p:var range="pattern"/>
                   3236:     <p:var range="contentType"/>
                   3237:   </p:judgement>
                   3238:   <p:judgement name="groupable">
                   3239:     <p:var range="contentType"/>
                   3240:     <p:var range="contentType"/>
                   3241:   </p:judgement>
                   3242:   <p:judgement name="contentType">
                   3243:     <p:element name="oneOrMore">
                   3244:       <p:var range="pattern"/>
                   3245:     </p:element>
                   3246:     <p:var range="contentType"/>
                   3247:   </p:judgement>
                   3248: </p:rule>
                   3249: 
                   3250: <p:rule name="choice">
                   3251:   <p:judgement name="contentType">
                   3252:     <p:var range="pattern" sub="1"/>
                   3253:     <p:var range="contentType" sub="1"/>
                   3254:   </p:judgement>
                   3255:   <p:judgement name="contentType">
                   3256:     <p:var range="pattern" sub="2"/>
                   3257:     <p:var range="contentType" sub="2"/>
                   3258:   </p:judgement>
                   3259:   <p:judgement name="contentType">
                   3260:     <p:element name="choice">
                   3261:       <p:var range="pattern" sub="1"/>
                   3262:       <p:var range="pattern" sub="2"/>
                   3263:     </p:element>
                   3264:     <p:function name="max">
                   3265:       <p:var range="contentType" sub="1"/>
                   3266:       <p:var range="contentType" sub="2"/>
                   3267:     </p:function>
                   3268:   </p:judgement>
                   3269: </p:rule>
                   3270: 
                   3271: </p:proofSystem>
                   3272: 
                   3273: <note><para>The antecedent in the (data 2) rule above is in fact
                   3274: redundant because of the prohibited paths in <xref
                   3275: linkend="context-data-except"/>.</para></note>
                   3276: 
                   3277: <para>Now we can describe the restriction. We use the following
                   3278: notation.</para>
                   3279: 
                   3280: <variablelist>
                   3281: 
                   3282: <varlistentry><term>
                   3283:   <p:judgement name="incorrectSchema"/>
                   3284: </term>
                   3285: <listitem><para>asserts that the schema is incorrect</para></listitem>
                   3286: </varlistentry>
                   3287: 
                   3288: </variablelist>
                   3289: 
                   3290: <para>All patterns occurring as the content of an element pattern must
                   3291: have a content-type.</para>
                   3292: 
                   3293: <p:proofSystem>
                   3294: 
                   3295: <p:rule name="element">
                   3296:   <p:judgement name="bind">
                   3297:     <p:var range="ncname"/>
                   3298:     <p:var range="nameClass"/>
                   3299:     <p:var range="pattern"/>
                   3300:   </p:judgement>
                   3301:   <p:not>
                   3302:     <p:judgement name="contentType">
                   3303:       <p:var range="pattern"/>
                   3304:       <p:var range="contentType"/>
                   3305:     </p:judgement>
                   3306:   </p:not>
                   3307:   <p:judgement name="incorrectSchema"/>
                   3308: </p:rule>
                   3309: 
                   3310: </p:proofSystem>
                   3311: 
                   3312: </section>
                   3313: 
                   3314: <section id="attribute-restrictions">
                   3315: <title>Restrictions on attributes</title>
                   3316: 
                   3317: <para>Duplicate attributes are not allowed.  More precisely, for a
                   3318: pattern <literal>&lt;group> <replaceable>p1</replaceable>
                   3319: <replaceable>p2</replaceable> &lt;/group></literal> or
                   3320: <literal>&lt;interleave> <replaceable>p1</replaceable>
                   3321: <replaceable>p2</replaceable> &lt;/interleave></literal>, there must
                   3322: not be a name that belongs to both the name class of an
                   3323: <literal>attribute</literal> pattern occurring in
                   3324: <replaceable>p1</replaceable> and the name class of an
                   3325: <literal>attribute</literal> pattern occurring in
                   3326: <replaceable>p2</replaceable>. A pattern <replaceable>p1</replaceable>
                   3327: is defined to <firstterm>occur in</firstterm> a pattern
                   3328: <replaceable>p2</replaceable> if</para>
                   3329: 
                   3330: <itemizedlist>
                   3331: 
                   3332: <listitem><para><replaceable>p1</replaceable> is
                   3333: <replaceable>p2</replaceable>, or</para></listitem>
                   3334: 
                   3335: <listitem><para><replaceable>p2</replaceable> is a
                   3336: <literal>choice</literal>, <literal>interleave</literal>,
                   3337: <literal>group</literal> or <literal>oneOrMore</literal> element and
                   3338: <replaceable>p1</replaceable> occurs in one or more children of
                   3339: <replaceable>p2</replaceable>.</para></listitem>
                   3340: 
                   3341: </itemizedlist>
                   3342: 
                   3343: <para>Attributes using infinite name classes must be repeated.  More
                   3344: precisely, an <literal>attribute</literal> element that has an
                   3345: <literal>anyName</literal> or <literal>nsName</literal> descendant
                   3346: element must have a <literal>oneOrMore</literal> ancestor
                   3347: element.</para>
                   3348: 
                   3349: <note><para>This restriction is necessary for closure under
                   3350: negation.</para></note>
                   3351: 
                   3352: </section>
                   3353: 
                   3354: <section id="interleave-restrictions">
                   3355: <title>Restrictions on <literal>interleave</literal></title>
                   3356: 
                   3357: <para>For a pattern <literal>&lt;interleave>
                   3358: <replaceable>p1</replaceable> <replaceable>p2</replaceable>
                   3359: &lt;/interleave></literal>,</para>
                   3360: 
                   3361: <itemizedlist>
                   3362: 
                   3363: <listitem><para>there must not be a name that belongs to both the name
                   3364: class of an <literal>element</literal> pattern referenced by a
                   3365: <literal>ref</literal> pattern occurring in
                   3366: <replaceable>p1</replaceable> and the name class of an
                   3367: <literal>element</literal> pattern referenced by a
                   3368: <literal>ref</literal> pattern occurring in
                   3369: <replaceable>p2</replaceable>, and</para></listitem>
                   3370: 
                   3371: <listitem><para>a <literal>text</literal> pattern must not occur in
                   3372: both <replaceable>p1</replaceable> and
                   3373: <replaceable>p2</replaceable>.</para></listitem>
                   3374: 
                   3375: </itemizedlist>
                   3376: 
                   3377: <para><xref linkend="attribute-restrictions"/> defines when one
                   3378: pattern is considered to occur in another pattern.</para>
                   3379: 
                   3380: </section>
                   3381: 
                   3382: </section>
                   3383: 
                   3384: <section id="conformance">
                   3385: <title>Conformance</title>
                   3386: 
                   3387: <para>A conforming RELAX NG validator must be able to determine for
                   3388: any XML document whether it is a correct RELAX NG schema.  A
                   3389: conforming RELAX NG validator must be able to determine for any XML
                   3390: document and for any correct RELAX NG schema whether the document is
                   3391: valid with respect to the schema.</para>
                   3392: 
                   3393: <para>However, the requirements in the preceding paragraph do not
                   3394: apply if the schema uses a datatype library that the validator does
                   3395: not support.  A conforming RELAX NG validator is only required to
                   3396: support the built-in datatype library described in <xref
                   3397: linkend="built-in-datatype"/>.  A validator that claims conformance to
                   3398: RELAX NG should document which datatype libraries it supports.  The
                   3399: requirements in the preceding paragraph also do not apply if the
                   3400: schema includes <literal>externalRef</literal> or
                   3401: <literal>include</literal> elements and the validator is unable to
                   3402: retrieve the resource identified by the URI or is unable to construct
                   3403: an element from the retrieved resource.  A validator that claims
                   3404: conformance to RELAX NG should document its capabilities for handling
                   3405: URI references.</para>
                   3406: 
                   3407: </section>
                   3408: 
                   3409: <appendix>
                   3410: <title>RELAX NG schema for RELAX NG</title>
                   3411: 
                   3412: <rngref src="relaxng.rng"/>
                   3413: 
                   3414: </appendix>
                   3415: 
                   3416: <appendix>
                   3417: <title>Changes since version 0.9</title>
                   3418: 
                   3419: <para>The changes in this version relative to version 0.9
                   3420: are as follows:</para>
                   3421: 
                   3422: <itemizedlist>
                   3423: 
                   3424: <listitem><para>in the namespace URI, <literal>0.9</literal> has been
                   3425: changed to <literal>1.0</literal></para></listitem>
                   3426: 
                   3427: <listitem><para><literal>data/except//empty</literal> has been added
                   3428: as a prohibited path (see <xref
                   3429: linkend="context-data-except"/>)</para></listitem>
                   3430: 
                   3431: <listitem><para><literal>start//empty</literal> has been added
                   3432: as a prohibited path (see <xref
                   3433: linkend="context-start"/>)</para></listitem>
                   3434: 
                   3435: <listitem><para><xref linkend="number-child-elements"/> now specifies how a
                   3436: <literal>list</literal> element with more than one child element is
                   3437: transformed</para></listitem>
                   3438: 
                   3439: <listitem><para><xref linkend="notAllowed"/> now specifies how a
                   3440: <literal>notAllowed</literal> element occurring in an
                   3441: <literal>except</literal> element is transformed</para></listitem>
                   3442: 
                   3443: <listitem><para>although a relative URI is not allowed as the value of
                   3444: the <literal>ns</literal> and <literal>datatypeLibrary</literal>
                   3445: attributes, an empty string is allowed (see <xref
                   3446: linkend="full-syntax"/>)</para></listitem>
                   3447: 
                   3448: <listitem><para>the removal of unreachable definitions in <xref
                   3449: linkend="define-ref"/> is now correctly specified</para></listitem>
                   3450: 
                   3451: <listitem><para><xref linkend="notAllowed"/> now specifies that
                   3452: <literal>define</literal> elements that are no longer reachable are
                   3453: removed</para></listitem>
                   3454: 
                   3455: <listitem><para><xref linkend="constraints"/> has been added; the
                   3456: restrictions on the contents of <literal>except</literal> in name
                   3457: classes that are now specified in the newly added section were
                   3458: previously specified in a subsection of <xref
                   3459: linkend="contextual-restriction"/>, which has been
                   3460: removed</para></listitem>
                   3461: 
                   3462: <listitem><para>the treatment of element and attribute values that
                   3463: consist only of whitespace has been refined (see <xref
                   3464: linkend="element-pattern"/> and <xref
                   3465: linkend="data-pattern"/>)</para></listitem>
                   3466: 
                   3467: <listitem><para>attributes with infinite name classes are now required
                   3468: to be repeated (see <xref
                   3469: linkend="attribute-restrictions"/>)</para></listitem>
                   3470: 
                   3471: <listitem><para>restrictions have been imposed on
                   3472: <literal>interleave</literal> (see <xref
                   3473: linkend="interleave-restrictions"/>); <literal>list//interleave</literal>
                   3474: has been added as a prohibited path (see <xref
                   3475: linkend="list-restrictions"/>)</para></listitem>
                   3476: 
                   3477: <listitem><para>some of the prohibited paths in <xref
                   3478: linkend="contextual-restriction"/> have been corrected to use
                   3479: <literal>ref</literal> rather than
                   3480: <literal>element</literal></para></listitem>
                   3481: 
                   3482: <listitem><para>an error in the inference rule (text 1) in <xref
                   3483: linkend="text-pattern"/> has been corrected</para></listitem>
                   3484: 
                   3485: <listitem><para>the value of the <literal>ns</literal> attribute is
                   3486: now unconstrained (see <xref
                   3487: linkend="full-syntax"/>)</para></listitem>
                   3488: 
                   3489: </itemizedlist>
                   3490: 
                   3491: </appendix>
                   3492: 
                   3493: <appendix>
                   3494: <title>RELAX NG TC (Non-Normative)</title>
                   3495: 
                   3496: <para>This specification was prepared and approved for publication by
                   3497: the RELAX NG TC. The current members of the TC are:</para>
                   3498: 
                   3499: <itemizedlist>
                   3500: <listitem><para>Fabio Arciniegas</para></listitem>
                   3501: <listitem><para>James Clark</para></listitem>
                   3502: <listitem><para>Mike Fitzgerald</para></listitem>
                   3503: <listitem><para>KAWAGUCHI Kohsuke</para></listitem>
                   3504: <listitem><para>Josh Lubell</para></listitem>
                   3505: <listitem><para>MURATA Makoto</para></listitem>
                   3506: <listitem><para>Norman Walsh</para></listitem>
                   3507: <listitem><para>David Webber</para></listitem>
                   3508: </itemizedlist>
                   3509: 
                   3510: </appendix>
                   3511: 
                   3512: <bibliography><title>References</title>
                   3513: 
                   3514: <bibliodiv><title>Normative</title>
                   3515: 
                   3516: <bibliomixed id="xml-rec"><abbrev>XML 1.0</abbrev>Tim Bray,
                   3517: Jean Paoli, and
                   3518: C. M. Sperberg-McQueen, Eve Maler, editors.
                   3519: <citetitle><ulink url="http://www.w3.org/TR/REC-xml">Extensible Markup
                   3520: Language (XML) 1.0 Second Edition</ulink></citetitle>.
                   3521: W3C (World Wide Web Consortium), 2000.</bibliomixed>
                   3522: 
                   3523: <bibliomixed id="xml-names"><abbrev>XML Namespaces</abbrev>Tim Bray,
                   3524: Dave Hollander,
                   3525: and Andrew Layman, editors.
                   3526: <citetitle><ulink url="http://www.w3.org/TR/REC-xml-names/">Namespaces in
                   3527: XML</ulink></citetitle>.
                   3528: W3C (World Wide Web Consortium), 1999.</bibliomixed>
                   3529: 
                   3530: <bibliomixed id="xlink"><abbrev>XLink</abbrev>Steve DeRose, Eve Maler
                   3531: and David Orchard, editors.
                   3532: <citetitle><ulink url="http://www.w3.org/TR/xlink/">XML Linking
                   3533: Language (XLink) Version 1.0</ulink></citetitle>.
                   3534: W3C (World Wide Web Consortium), 2001.</bibliomixed>
                   3535: 
                   3536: <bibliomixed id="infoset"><abbrev>XML Infoset</abbrev>John Cowan, Richard Tobin,
                   3537: editors.
                   3538: <citetitle><ulink url="http://www.w3.org/TR/xml-infoset/">XML
                   3539: Information Set</ulink></citetitle>.
                   3540: W3C (World Wide Web Consortium), 2001.</bibliomixed>
                   3541: 
                   3542: <bibliomixed id="rfc2396"><abbrev>RFC 2396</abbrev>T. Berners-Lee, R. Fielding, L. Masinter.
                   3543: <citetitle><ulink url="http://www.ietf.org/rfc/rfc2396.txt" >RFC 2396:
                   3544: Uniform Resource Identifiers (URI): Generic
                   3545: Syntax</ulink></citetitle>.
                   3546: IETF (Internet Engineering Task Force). 1998.</bibliomixed>
                   3547: 
                   3548: <bibliomixed id="rfc2732"><abbrev>RFC 2732</abbrev>R. Hinden, B. Carpenter, L. Masinter.
                   3549: <citetitle><ulink url="http://www.ietf.org/rfc/rfc2732.txt">RFC 2732: Format for Literal IPv6 Addresses in URL's</ulink></citetitle>.
                   3550: IETF (Internet Engineering Task Force), 1999.</bibliomixed>
                   3551: 
                   3552: <bibliomixed id="rfc3023"><abbrev>RFC 3023</abbrev> M. Murata,
                   3553: S. St.Laurent, D. Kohn.  <citetitle><ulink
                   3554: url="http://www.ietf.org/rfc/rfc3023.txt">RFC 3023: XML Media
                   3555: Types</ulink></citetitle>. IETF (Internet Engineering Task Force),
                   3556: 2001.</bibliomixed>
                   3557: 
                   3558: </bibliodiv>
                   3559: 
                   3560: <bibliodiv><title>Non-Normative</title>
                   3561: 
                   3562: <bibliomixed id="xmlschema-2"><abbrev>W3C XML Schema Datatypes</abbrev>Paul V. Biron, Ashok Malhotra, editors.
                   3563: <citetitle><ulink url="http://www.w3.org/TR/xmlschema-2/">XML Schema Part 2: Datatypes</ulink></citetitle>.
                   3564: W3C (World Wide Web Consortium), 2001.</bibliomixed>
                   3565: 
                   3566: <bibliomixed id="trex"><abbrev>TREX</abbrev>James Clark.
                   3567: <citetitle><ulink url="http://www.thaiopensource.com/trex/">TREX - Tree Regular Expressions for XML</ulink></citetitle>.
                   3568: Thai Open Source Software Center, 2001.</bibliomixed>
                   3569: 
                   3570: <bibliomixed id="relax"><abbrev>RELAX</abbrev>MURATA Makoto.
                   3571: <citetitle><ulink url="http://www.xml.gr.jp/relax/">RELAX (Regular
                   3572: Language description for XML)</ulink></citetitle>.  INSTAC
                   3573: (Information Technology Research and Standardization Center), 2001.</bibliomixed>
                   3574: 
                   3575: <bibliomixed id="xsfd"><abbrev>XML Schema Formal</abbrev>Allen Brown,
                   3576: Matthew Fuchs, Jonathan Robie, Philip Wadler, editors.
                   3577: <citetitle><ulink url="http://www.w3.org/TR/xmlschema-formal/">XML Schema: Formal Description</ulink></citetitle>.
                   3578: W3C (World Wide Web Consortium), 2001.</bibliomixed>
                   3579: 
                   3580: <bibliomixed id="tutorial"><abbrev>Tutorial</abbrev>James Clark,
                   3581: Makoto MURATA, editors.  <citetitle><ulink
                   3582: url="http://www.oasis-open.org/committees/relax-ng/tutorial.html">RELAX
                   3583: NG Tutorial</ulink></citetitle>.  OASIS, 2001.</bibliomixed>
                   3584: 
                   3585: </bibliodiv>
                   3586: 
                   3587: </bibliography>
                   3588: 
                   3589: </article>

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>