Home | History | Annotate | Download | only in relaxng
      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 (a] jclark.com</email></address>
     21   </affiliation>
     22 </editor>
     23 <editor>
     24   <surname>MURATA</surname><firstname>Makoto</firstname>
     25   <affiliation>
     26     <address><email>EB2M-MRT (a] 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 (a] lists.oasis-open.org"
     75 >relax-ng-comment (a] 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>
   3590