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