Annotation of embedaddon/libxml2/test/relaxng/spec_0.xml, revision 1.1
1.1 ! misho 1: <?xml version="1.0" encoding="iso-8859-1"?>
! 2: <!DOCTYPE article [
! 3: <!-- ELEMENT declarations work around MSXML bug. -->
! 4: <!ELEMENT section ANY>
! 5: <!ATTLIST section id ID #IMPLIED>
! 6: <!ELEMENT appendix ANY>
! 7: <!ATTLIST appendix id ID #IMPLIED>
! 8: <!ELEMENT bibliomixed ANY>
! 9: <!ATTLIST bibliomixed id ID #IMPLIED>
! 10: ]>
! 11: <article status="Committee Specification" xmlns:p="http://relaxng.org/ns/proofsystem">
! 12:
! 13: <articleinfo>
! 14: <releaseinfo>$Id: spec.xml,v 1.159 2001/12/02 12:12:12 jjc Exp $</releaseinfo>
! 15: <title>RELAX NG Specification</title>
! 16: <authorgroup>
! 17: <editor>
! 18: <firstname>James</firstname><surname>Clark</surname>
! 19: <affiliation>
! 20: <address><email>jjc@jclark.com</email></address>
! 21: </affiliation>
! 22: </editor>
! 23: <editor>
! 24: <surname>MURATA</surname><firstname>Makoto</firstname>
! 25: <affiliation>
! 26: <address><email>EB2M-MRT@asahi-net.or.jp</email></address>
! 27: </affiliation>
! 28: </editor>
! 29: </authorgroup>
! 30: <pubdate>3 December 2001</pubdate>
! 31: <releaseinfo role="meta">
! 32: $Id: spec.xml,v 1.159 2001/12/02 12:12:12 jjc Exp $
! 33: </releaseinfo>
! 34:
! 35: <copyright><year>2001</year><holder>OASIS</holder></copyright>
! 36:
! 37: <legalnotice>
! 38:
! 39: <para>Copyright © 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><choice> <replaceable>p1</replaceable> <replaceable>p2</replaceable> <replaceable>p3</replaceable> </choice></programlisting>
! 767:
! 768: <para>is transformed to</para>
! 769:
! 770: <programlisting><choice> <choice> <replaceable>p1</replaceable> <replaceable>p2</replaceable> </choice> <replaceable>p3</replaceable> </choice></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><mixed> <replaceable>p</replaceable> </mixed></programlisting>
! 785:
! 786: <para>is transformed into</para>
! 787:
! 788: <programlisting><interleave> <replaceable>p</replaceable> <text/> </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><optional> <replaceable>p</replaceable> </optional></programlisting>
! 799:
! 800: <para>is transformed into</para>
! 801:
! 802: <programlisting><choice> <replaceable>p</replaceable> <empty/> </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><zeroOrMore> <replaceable>p</replaceable> </zeroOrMore></programlisting>
! 814:
! 815: <para>is transformed into</para>
! 816:
! 817: <programlisting><choice> <oneOrMore> <replaceable>p</replaceable> </oneOrMore> <empty/> </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><define name="<replaceable>n</replaceable>">
! 892: <replaceable>p1</replaceable>
! 893: </define>
! 894: <define name="<replaceable>n</replaceable>">
! 895: <replaceable>p2</replaceable>
! 896: </define></programlisting>
! 897:
! 898: <para>is combined into</para>
! 899:
! 900: <programlisting><define name="<replaceable>n</replaceable>">
! 901: <<replaceable>c</replaceable>>
! 902: <replaceable>p1</replaceable>
! 903: <replaceable>p2</replaceable>
! 904: </<replaceable>c</replaceable>>
! 905: </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><grammar><start><replaceable>p</replaceable></start></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><group> <replaceable>p1</replaceable>
! 3319: <replaceable>p2</replaceable> </group></literal> or
! 3320: <literal><interleave> <replaceable>p1</replaceable>
! 3321: <replaceable>p2</replaceable> </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><interleave>
! 3358: <replaceable>p1</replaceable> <replaceable>p2</replaceable>
! 3359: </interleave></literal>,</para>
! 3360:
! 3361: <itemizedlist>
! 3362:
! 3363: <listitem><para>there must not be a name that belongs to both the name
! 3364: class of an <literal>element</literal> pattern referenced by a
! 3365: <literal>ref</literal> pattern occurring in
! 3366: <replaceable>p1</replaceable> and the name class of an
! 3367: <literal>element</literal> pattern referenced by a
! 3368: <literal>ref</literal> pattern occurring in
! 3369: <replaceable>p2</replaceable>, and</para></listitem>
! 3370:
! 3371: <listitem><para>a <literal>text</literal> pattern must not occur in
! 3372: both <replaceable>p1</replaceable> and
! 3373: <replaceable>p2</replaceable>.</para></listitem>
! 3374:
! 3375: </itemizedlist>
! 3376:
! 3377: <para><xref linkend="attribute-restrictions"/> defines when one
! 3378: pattern is considered to occur in another pattern.</para>
! 3379:
! 3380: </section>
! 3381:
! 3382: </section>
! 3383:
! 3384: <section id="conformance">
! 3385: <title>Conformance</title>
! 3386:
! 3387: <para>A conforming RELAX NG validator must be able to determine for
! 3388: any XML document whether it is a correct RELAX NG schema. A
! 3389: conforming RELAX NG validator must be able to determine for any XML
! 3390: document and for any correct RELAX NG schema whether the document is
! 3391: valid with respect to the schema.</para>
! 3392:
! 3393: <para>However, the requirements in the preceding paragraph do not
! 3394: apply if the schema uses a datatype library that the validator does
! 3395: not support. A conforming RELAX NG validator is only required to
! 3396: support the built-in datatype library described in <xref
! 3397: linkend="built-in-datatype"/>. A validator that claims conformance to
! 3398: RELAX NG should document which datatype libraries it supports. The
! 3399: requirements in the preceding paragraph also do not apply if the
! 3400: schema includes <literal>externalRef</literal> or
! 3401: <literal>include</literal> elements and the validator is unable to
! 3402: retrieve the resource identified by the URI or is unable to construct
! 3403: an element from the retrieved resource. A validator that claims
! 3404: conformance to RELAX NG should document its capabilities for handling
! 3405: URI references.</para>
! 3406:
! 3407: </section>
! 3408:
! 3409: <appendix>
! 3410: <title>RELAX NG schema for RELAX NG</title>
! 3411:
! 3412: <rngref src="relaxng.rng"/>
! 3413:
! 3414: </appendix>
! 3415:
! 3416: <appendix>
! 3417: <title>Changes since version 0.9</title>
! 3418:
! 3419: <para>The changes in this version relative to version 0.9
! 3420: are as follows:</para>
! 3421:
! 3422: <itemizedlist>
! 3423:
! 3424: <listitem><para>in the namespace URI, <literal>0.9</literal> has been
! 3425: changed to <literal>1.0</literal></para></listitem>
! 3426:
! 3427: <listitem><para><literal>data/except//empty</literal> has been added
! 3428: as a prohibited path (see <xref
! 3429: linkend="context-data-except"/>)</para></listitem>
! 3430:
! 3431: <listitem><para><literal>start//empty</literal> has been added
! 3432: as a prohibited path (see <xref
! 3433: linkend="context-start"/>)</para></listitem>
! 3434:
! 3435: <listitem><para><xref linkend="number-child-elements"/> now specifies how a
! 3436: <literal>list</literal> element with more than one child element is
! 3437: transformed</para></listitem>
! 3438:
! 3439: <listitem><para><xref linkend="notAllowed"/> now specifies how a
! 3440: <literal>notAllowed</literal> element occurring in an
! 3441: <literal>except</literal> element is transformed</para></listitem>
! 3442:
! 3443: <listitem><para>although a relative URI is not allowed as the value of
! 3444: the <literal>ns</literal> and <literal>datatypeLibrary</literal>
! 3445: attributes, an empty string is allowed (see <xref
! 3446: linkend="full-syntax"/>)</para></listitem>
! 3447:
! 3448: <listitem><para>the removal of unreachable definitions in <xref
! 3449: linkend="define-ref"/> is now correctly specified</para></listitem>
! 3450:
! 3451: <listitem><para><xref linkend="notAllowed"/> now specifies that
! 3452: <literal>define</literal> elements that are no longer reachable are
! 3453: removed</para></listitem>
! 3454:
! 3455: <listitem><para><xref linkend="constraints"/> has been added; the
! 3456: restrictions on the contents of <literal>except</literal> in name
! 3457: classes that are now specified in the newly added section were
! 3458: previously specified in a subsection of <xref
! 3459: linkend="contextual-restriction"/>, which has been
! 3460: removed</para></listitem>
! 3461:
! 3462: <listitem><para>the treatment of element and attribute values that
! 3463: consist only of whitespace has been refined (see <xref
! 3464: linkend="element-pattern"/> and <xref
! 3465: linkend="data-pattern"/>)</para></listitem>
! 3466:
! 3467: <listitem><para>attributes with infinite name classes are now required
! 3468: to be repeated (see <xref
! 3469: linkend="attribute-restrictions"/>)</para></listitem>
! 3470:
! 3471: <listitem><para>restrictions have been imposed on
! 3472: <literal>interleave</literal> (see <xref
! 3473: linkend="interleave-restrictions"/>); <literal>list//interleave</literal>
! 3474: has been added as a prohibited path (see <xref
! 3475: linkend="list-restrictions"/>)</para></listitem>
! 3476:
! 3477: <listitem><para>some of the prohibited paths in <xref
! 3478: linkend="contextual-restriction"/> have been corrected to use
! 3479: <literal>ref</literal> rather than
! 3480: <literal>element</literal></para></listitem>
! 3481:
! 3482: <listitem><para>an error in the inference rule (text 1) in <xref
! 3483: linkend="text-pattern"/> has been corrected</para></listitem>
! 3484:
! 3485: <listitem><para>the value of the <literal>ns</literal> attribute is
! 3486: now unconstrained (see <xref
! 3487: linkend="full-syntax"/>)</para></listitem>
! 3488:
! 3489: </itemizedlist>
! 3490:
! 3491: </appendix>
! 3492:
! 3493: <appendix>
! 3494: <title>RELAX NG TC (Non-Normative)</title>
! 3495:
! 3496: <para>This specification was prepared and approved for publication by
! 3497: the RELAX NG TC. The current members of the TC are:</para>
! 3498:
! 3499: <itemizedlist>
! 3500: <listitem><para>Fabio Arciniegas</para></listitem>
! 3501: <listitem><para>James Clark</para></listitem>
! 3502: <listitem><para>Mike Fitzgerald</para></listitem>
! 3503: <listitem><para>KAWAGUCHI Kohsuke</para></listitem>
! 3504: <listitem><para>Josh Lubell</para></listitem>
! 3505: <listitem><para>MURATA Makoto</para></listitem>
! 3506: <listitem><para>Norman Walsh</para></listitem>
! 3507: <listitem><para>David Webber</para></listitem>
! 3508: </itemizedlist>
! 3509:
! 3510: </appendix>
! 3511:
! 3512: <bibliography><title>References</title>
! 3513:
! 3514: <bibliodiv><title>Normative</title>
! 3515:
! 3516: <bibliomixed id="xml-rec"><abbrev>XML 1.0</abbrev>Tim Bray,
! 3517: Jean Paoli, and
! 3518: C. M. Sperberg-McQueen, Eve Maler, editors.
! 3519: <citetitle><ulink url="http://www.w3.org/TR/REC-xml">Extensible Markup
! 3520: Language (XML) 1.0 Second Edition</ulink></citetitle>.
! 3521: W3C (World Wide Web Consortium), 2000.</bibliomixed>
! 3522:
! 3523: <bibliomixed id="xml-names"><abbrev>XML Namespaces</abbrev>Tim Bray,
! 3524: Dave Hollander,
! 3525: and Andrew Layman, editors.
! 3526: <citetitle><ulink url="http://www.w3.org/TR/REC-xml-names/">Namespaces in
! 3527: XML</ulink></citetitle>.
! 3528: W3C (World Wide Web Consortium), 1999.</bibliomixed>
! 3529:
! 3530: <bibliomixed id="xlink"><abbrev>XLink</abbrev>Steve DeRose, Eve Maler
! 3531: and David Orchard, editors.
! 3532: <citetitle><ulink url="http://www.w3.org/TR/xlink/">XML Linking
! 3533: Language (XLink) Version 1.0</ulink></citetitle>.
! 3534: W3C (World Wide Web Consortium), 2001.</bibliomixed>
! 3535:
! 3536: <bibliomixed id="infoset"><abbrev>XML Infoset</abbrev>John Cowan, Richard Tobin,
! 3537: editors.
! 3538: <citetitle><ulink url="http://www.w3.org/TR/xml-infoset/">XML
! 3539: Information Set</ulink></citetitle>.
! 3540: W3C (World Wide Web Consortium), 2001.</bibliomixed>
! 3541:
! 3542: <bibliomixed id="rfc2396"><abbrev>RFC 2396</abbrev>T. Berners-Lee, R. Fielding, L. Masinter.
! 3543: <citetitle><ulink url="http://www.ietf.org/rfc/rfc2396.txt" >RFC 2396:
! 3544: Uniform Resource Identifiers (URI): Generic
! 3545: Syntax</ulink></citetitle>.
! 3546: IETF (Internet Engineering Task Force). 1998.</bibliomixed>
! 3547:
! 3548: <bibliomixed id="rfc2732"><abbrev>RFC 2732</abbrev>R. Hinden, B. Carpenter, L. Masinter.
! 3549: <citetitle><ulink url="http://www.ietf.org/rfc/rfc2732.txt">RFC 2732: Format for Literal IPv6 Addresses in URL's</ulink></citetitle>.
! 3550: IETF (Internet Engineering Task Force), 1999.</bibliomixed>
! 3551:
! 3552: <bibliomixed id="rfc3023"><abbrev>RFC 3023</abbrev> M. Murata,
! 3553: S. St.Laurent, D. Kohn. <citetitle><ulink
! 3554: url="http://www.ietf.org/rfc/rfc3023.txt">RFC 3023: XML Media
! 3555: Types</ulink></citetitle>. IETF (Internet Engineering Task Force),
! 3556: 2001.</bibliomixed>
! 3557:
! 3558: </bibliodiv>
! 3559:
! 3560: <bibliodiv><title>Non-Normative</title>
! 3561:
! 3562: <bibliomixed id="xmlschema-2"><abbrev>W3C XML Schema Datatypes</abbrev>Paul V. Biron, Ashok Malhotra, editors.
! 3563: <citetitle><ulink url="http://www.w3.org/TR/xmlschema-2/">XML Schema Part 2: Datatypes</ulink></citetitle>.
! 3564: W3C (World Wide Web Consortium), 2001.</bibliomixed>
! 3565:
! 3566: <bibliomixed id="trex"><abbrev>TREX</abbrev>James Clark.
! 3567: <citetitle><ulink url="http://www.thaiopensource.com/trex/">TREX - Tree Regular Expressions for XML</ulink></citetitle>.
! 3568: Thai Open Source Software Center, 2001.</bibliomixed>
! 3569:
! 3570: <bibliomixed id="relax"><abbrev>RELAX</abbrev>MURATA Makoto.
! 3571: <citetitle><ulink url="http://www.xml.gr.jp/relax/">RELAX (Regular
! 3572: Language description for XML)</ulink></citetitle>. INSTAC
! 3573: (Information Technology Research and Standardization Center), 2001.</bibliomixed>
! 3574:
! 3575: <bibliomixed id="xsfd"><abbrev>XML Schema Formal</abbrev>Allen Brown,
! 3576: Matthew Fuchs, Jonathan Robie, Philip Wadler, editors.
! 3577: <citetitle><ulink url="http://www.w3.org/TR/xmlschema-formal/">XML Schema: Formal Description</ulink></citetitle>.
! 3578: W3C (World Wide Web Consortium), 2001.</bibliomixed>
! 3579:
! 3580: <bibliomixed id="tutorial"><abbrev>Tutorial</abbrev>James Clark,
! 3581: Makoto MURATA, editors. <citetitle><ulink
! 3582: url="http://www.oasis-open.org/committees/relax-ng/tutorial.html">RELAX
! 3583: NG Tutorial</ulink></citetitle>. OASIS, 2001.</bibliomixed>
! 3584:
! 3585: </bibliodiv>
! 3586:
! 3587: </bibliography>
! 3588:
! 3589: </article>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>