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 40Structured Information Standards [OASIS] 2001. All Rights 41Reserved.</para> 42 43<para>This document and translations of it may be copied and furnished 44to others, and derivative works that comment on or otherwise explain 45it or assist in its implementation may be prepared, copied, published 46and distributed, in whole or in part, without restriction of any kind, 47provided that the above copyright notice and this paragraph are 48included on all such copies and derivative works. However, this 49document itself may not be modified in any way, such as by removing 50the copyright notice or references to OASIS, except as needed for the 51purpose of developing OASIS specifications, in which case the 52procedures for copyrights defined in the OASIS Intellectual Property 53Rights document must be followed, or as required to translate it into 54languages other than English.</para> 55 56<para>The limited permissions granted above are perpetual and will not 57be revoked by OASIS or its successors or assigns.</para> 58 59<para>This document and the information contained herein is provided 60on an <quote>AS IS</quote> basis and OASIS DISCLAIMS ALL WARRANTIES, 61EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE 62USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY 63IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR 64PURPOSE.</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 71OASIS RELAX NG technical committee. It is a stable document which 72represents the consensus of the committee. Comments on this document 73may be sent to <ulink 74url="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 78url="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 86schema language for XML, based on <xref linkend="relax"/> and <xref 87linkend="trex"/>. A RELAX NG schema specifies a pattern for the 88structure and content of an XML document. A RELAX NG schema is itself 89an 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 113schema</para></listitem> 114 115<listitem><para>when an XML document is valid with respect to a 116correct RELAX NG schema</para></listitem> 117 118</itemizedlist> 119 120<para>An XML document that is being validated with respect to a RELAX NG 121schema is referred to as an instance.</para> 122 123<para>The structure of this document is as follows. <xref 124linkend="data-model"/> describes the data model, which is the 125abstraction of an XML document used throughout the rest of the 126document. <xref linkend="full-syntax"/> describes the syntax of a 127RELAX NG schema; any correct RELAX NG schema must conform to this 128syntax. <xref linkend="simplification"/> describes a sequence of 129transformations that are applied to simplify a RELAX NG schema; 130applying the transformations also involves checking certain 131restrictions that must be satisfied by a correct RELAX NG 132schema. <xref linkend="simple-syntax"/> describes the syntax that 133results from applying the transformations; this simple syntax is a 134subset of the full syntax. <xref linkend="semantics"/> describes the 135semantics of a correct RELAX NG schema that uses the simple syntax; 136the semantics specify when an element is valid with respect to a RELAX 137NG schema. <xref linkend="restriction"/> describes restrictions in 138terms of the simple syntax; a correct RELAX NG schema must be such 139that, after transformation into the simple form, it satisfies these 140restrictions. Finally, <xref linkend="conformance"/> describes 141conformance requirements for RELAX NG validators.</para> 142 143<para>A tutorial is available separately (see <xref 144linkend="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 152instances through an abstract data model. XML documents representing 153schemas and instances must be well-formed in conformance with <xref 154linkend="xml-rec"/> and must conform to the constraints of <xref 155linkend="xml-names"/>.</para> 156 157<para>An XML document is represented by an element. An element consists 158of</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 169child is either an element or a non-empty string; the sequence never contains 170two 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 178string has special significance, representing the absence of any 179namespace</para></listitem> 180 181<listitem><para>a string representing the local name; this string matches the NCName 182production 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, 190and also may specify a default namespace URI (as declared 191by 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, 202where 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 205of 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 208element is constructed from a document information item by 209constructing an element from the [document element]. An element is 210constructed from an element information item by constructing the name 211from the [namespace name] and [local name], the context from the [base 212URI] and [in-scope namespaces], the attributes from the [attributes], 213and the children from the [children]. The attributes of an element 214are constructed from the unordered set of attribute information items 215by constructing an attribute for each attribute information item. The 216children of an element are constructed from the list of child 217information items first by removing information items other than 218element information items and character information items, and then by 219constructing an element for each element information item in the list 220and a string for each maximal sequence of character information items. 221An attribute is constructed from an attribute information item by 222constructing the name from the [namespace name] and [local name], and 223the value from the [normalized value]. When constructing the name of 224an element or attribute from the [namespace name] and [local name], if 225the [namespace name] property is not present, then the name is 226constructed from an empty string and the [local name]. A string is 227constructed from a sequence of character information items by 228constructing a character from the [character code] of each character 229information item.</para> 230 231<para>It is possible for there to be multiple distinct infosets for a 232single XML document. This is because XML parsers are not required to 233process all DTD declarations or expand all external parsed general 234entities. Amongst these multiple infosets, there is exactly one 235infoset for which [all declarations processed] is true and which does 236not contain any unexpanded entity reference information items. This 237is the infoset that is the basis for defining the RELAX NG data 238model.</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 245follows:</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 259the absence of any namespace</para></listitem> 260 261<listitem><para><literal>foo</literal> as the local 262name</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 272URI</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 279namespace URI 280<literal>http://www.w3.org/XML/1998/namespace</literal> 281(the <literal>xml</literal> prefix is implicitly declared 282by every XML document)</para></listitem> 283 284<listitem><para>specifies the empty string as the default namespace 285URI</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 298of 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 305namespace URI</para></listitem> 306 307<listitem><para><literal>bar1</literal> as the local 308name</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 318URI</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 325namespace URI 326<literal>http://www.example.com/n1</literal></para></listitem> 327 328<listitem><para>maps the prefix <literal>xml</literal> to the 329namespace 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 333URI</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 356namespace URI</para></listitem> 357 358<listitem><para><literal>bar2</literal> as the local 359name</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 369URI</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 376namespace URI 377<literal>http://www.example.com/n2</literal></para></listitem> 378 379<listitem><para>maps the prefix <literal>xml</literal> to the 380namespace 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 384URI</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. 411Although we use a notation based on the XML representation of an RELAX 412NG schema as a sequence of characters, the grammar must be understood 413as operating at the data model level. For example, although the 414syntax uses <literal><![CDATA[<text/>]]></literal>, an instance or 415schema can use <literal><![CDATA[<text></text>]]></literal> instead, 416because they both represent the same element at the data model level. 417All elements shown in the grammar are qualified with the namespace 418URI:</para> 419 420<programlisting>http://relaxng.org/ns/structure/1.0</programlisting> 421 422<para>The symbols QName and NCName are defined in <xref 423linkend="xml-names"/>. The anyURI symbol has the same meaning as the 424anyURI datatype of <xref linkend="xmlschema-2"/>: it indicates a 425string that, after escaping of disallowed values as described in 426Section 5.4 of <xref linkend="xlink"/>, is a URI reference as defined 427in <xref linkend="rfc2396"/> (as modified by <xref 428linkend="rfc2732"/>). The symbol string matches any string.</para> 429 430<para>In addition to the attributes shown explicitly, any element can 431have 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 435symbol as described in the previous paragraph; in addition, it must 436not use the relative form of URI reference and must not have a 437fragment identifier; as an exception to this, the value may be the 438empty string.</para> 439 440<para>Any element can also have foreign attributes in addition to the 441attributes shown in the grammar. A foreign attribute is an attribute 442with a name whose namespace URI is neither the empty string nor the 443RELAX NG namespace URI. Any element that cannot have string children 444(that is, any element other than <literal>value</literal>, <literal>param</literal> 445and <literal>name</literal>) may have foreign child elements in addition 446to the child elements shown in the grammar. A foreign element is an 447element with a name whose namespace URI is not the RELAX NG namespace 448URI. There are no constraints on the relative position of foreign 449child elements with respect to other child elements.</para> 450 451<para>Any element can also have as children strings that consist 452entirely of whitespace characters, where a whitespace character is one 453of #x20, #x9, #xD or #xA. There are no constraints on the relative 454position of whitespace string children with respect to child 455elements.</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 468document 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 493into a simpler syntax by applying the following transformation rules 494in order. The effect must be as if each rule was applied to all 495elements in the schema before the next rule is applied. A 496transformation rule may also specify constraints that must be 497satisfied by a correct schema. The transformation rules are applied 498at the data model level. Before the transformations are applied, the 499schema 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> 507attributes at this stage because <literal>xml:base</literal> 508attributes are used in determining the [base URI] of an element 509information item, which is in turn used to construct the base URI of 510the context of an element. Thus, after a document has been parsed 511into an instance of the data model, <literal>xml:base</literal> 512attributes 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 521whitespace characters is removed.</para> 522 523<para>Leading and trailing whitespace characters are removed from the 524value 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 534transformed by escaping disallowed characters as specified in Section 5355.4 of <xref linkend="xlink"/>.</para> 536 537<para>For any <literal>data</literal> or <literal>value</literal> 538element that does not have a <literal>datatypeLibrary</literal> 539attribute, a <literal>datatypeLibrary</literal> attribute is 540added. The value of the added <literal>datatypeLibrary</literal> 541attribute is the value of the <literal>datatypeLibrary</literal> 542attribute of the nearest ancestor element that has a 543<literal>datatypeLibrary</literal> attribute, or the empty string if 544there is no such ancestor. Then, any <literal>datatypeLibrary</literal> 545attribute 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 555is added with value <literal>token</literal> and the value of the 556<literal>datatypeLibrary</literal> attribute is changed to the empty 557string.</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 566is first transformed by escaping disallowed characters as specified in 567Section 5.4 of <xref linkend="xlink"/>. The URI reference is then 568resolved into an absolute form as described in section 5.2 of <xref 569linkend="rfc2396"/> using the base URI from the context of the element 570that bears the <literal>href</literal> attribute.</para> 571 572<para>The value of the <literal>href</literal> attribute will be used 573to construct an element (as specified in <xref 574linkend="data-model"/>). This must be done as follows. The URI 575reference consists of the URI itself and an optional fragment 576identifier. The resource identified by the URI is retrieved. The 577result is a MIME entity: a sequence of bytes labeled with a MIME 578media type. The media type determines how an element is constructed 579from the MIME entity and optional fragment identifier. When the media 580type is <literal>application/xml</literal> or 581<literal>text/xml</literal>, the MIME entity must be parsed as an XML 582document in accordance with the applicable RFC (at the term of writing 583<xref linkend="rfc3023"/>) and an element constructed from the result 584of the parse as specified in <xref linkend="data-model"/>. In 585particular, the <literal>charset</literal> parameter must be handled 586as specified by the RFC. This specification does not define the 587handling of media types other than <literal>application/xml</literal> 588and <literal>text/xml</literal>. The <literal>href</literal> attribute 589must not include a fragment identifier unless the registration of the 590media type of the resource identified by the attribute defines the 591interpretation of fragment identifiers for that media type.</para> 592 593<note><para><xref linkend="rfc3023"/> does not define the 594interpretation 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 604follows. An element is constructed using the URI reference that is 605the value of <literal>href</literal> attribute as specified in <xref 606linkend="href"/>. This element must match the syntax for pattern. The 607element is transformed by recursively applying the rules from this 608subsection and from previous subsections of this section. This must 609not result in a loop. In other words, the transformation of the 610referenced 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 616referenced element if the referenced element does not already have an 617<literal>ns</literal> attribute. The <literal>externalRef</literal> 618element 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. 626An element is constructed using the URI reference that is the value of 627<literal>href</literal> attribute as specified in <xref 628linkend="href"/>. This element must be a <literal>grammar</literal> 629element, matching the syntax for grammar.</para> 630 631<para>This <literal>grammar</literal> element is transformed by 632recursively applying the rules from this subsection and from previous 633subsections of this section. This must not result in a loop. In other 634words, the transformation of the <literal>grammar</literal> element 635must not require the dereferencing of an <literal>include</literal> 636attribute with an <literal>href</literal> attribute with the same 637value.</para> 638 639<para>Define the <firstterm>components</firstterm> of an element to 640be 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> 643component, then the <literal>grammar</literal> element must have a 644<literal>start</literal> component. If the <literal>include</literal> 645element 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> 648element 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> 652element, all <literal>define</literal> components with the same name 653are 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> 661element (after the removal of the <literal>start</literal> and 662<literal>define</literal> components described by the preceding 663paragraph) followed by the children of the <literal>include</literal> 664element. 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> 671and <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 675transformed 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> 679attribute, 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 690added. The value of the added <literal>ns</literal> attribute is the 691value of the <literal>ns</literal> attribute of the nearest ancestor 692element that has an <literal>ns</literal> attribute, or the empty 693string if there is no such ancestor. Then, any <literal>ns</literal> 694attribute that is on an element other than <literal>name</literal>, 695<literal>nsName</literal> or <literal>value</literal> is 696removed.</para> 697 698<note><para>The value of the <literal>ns</literal> attribute is 699<emphasis role="strong">not</emphasis> transformed either by escaping 700disallowed characters, or in any other way, because the value of the 701<literal>ns</literal> attribute is compared against namespace URIs in 702the instance, which are not subject to any 703transformation.</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> 709attributes 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 718prefix is removed and an <literal>ns</literal> attribute is added 719replacing any existing <literal>ns</literal> attribute. The value of 720the added <literal>ns</literal> attribute is the value to which the 721namespace map of the context of the <literal>name</literal> element 722maps the prefix. The context must have a mapping for the 723prefix.</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 731children.</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 741one child element. If it has more than one child element, then its 742child elements are wrapped in a <literal>group</literal> 743element. Similarly, an <literal>element</literal> element is transformed so 744that it has exactly two child elements, the first being a name class 745and the second being a pattern. If it has more than two child elements, 746then 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 750so that it has exactly one child element. If it has more 751than one child element, then its child elements are wrapped 752in a <literal>choice</literal> element.</para> 753 754<para>If an <literal>attribute</literal> element has only one child 755element (a name class), then a <literal>text</literal> element is 756added.</para> 757 758<para>A <literal>choice</literal>, <literal>group</literal> or 759<literal>interleave</literal> element is transformed so that it has 760exactly two child elements. If it has one child element, then it is 761replaced by its child element. If it has more than two child 762elements, then the first two child elements are combined into a new 763element with the same name as the parent element and with the first 764two 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 773transformation is applied repeatedly until there are exactly two child 774elements.</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 782interleaving 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 796a 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 810between <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 825constraints are checked.</para> 826 827<note><para>The constraints in this section, unlike the constraints 828specified in <xref linkend="restriction"/>, can be checked without 829resolving any <literal>ref</literal> elements, and are accordingly 830applied even to patterns that will disappear during later stages of 831simplification because they are not reachable (see <xref 832linkend="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 841elements.</para> 842 843<para>A <literal>name</literal> element that occurs as the first child 844of an <literal>attribute</literal> element or as the descendant of the 845first child of an <literal>attribute</literal> element and that has an 846<literal>ns</literal> attribute with value equal to the empty string 847must not have content equal to <literal>xmlns</literal>.</para> 848 849<para>A <literal>name</literal> or <literal>nsName</literal> element 850that occurs as the first child of an <literal>attribute</literal> 851element 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 857namespace 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 861must be correct in its use of datatypes. Specifically, the 862<literal>type</literal> attribute must identify a datatype within the 863datatype 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 866is allowed by the datatype (see <xref 867linkend="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 876together. 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 885than one <literal>define</literal> element with that name, then there 886is a unique value for the <literal>combine</literal> attribute for 887that name. After determining this unique value, the 888<literal>combine</literal> attributes are removed. A pair of 889definitions</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 909combined until there is exactly one <literal>define</literal> element 910for each name.</para> 911 912<para>Similarly, for each <literal>grammar</literal> element all 913<literal>start</literal> elements are combined together. There must 914not be more than one <literal>start</literal> element that does not 915have a <literal>combine</literal> attribute. If there is a 916<literal>start</literal> element that has a <literal>combine</literal> 917attribute with the value <literal>choice</literal>, there must not 918also 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 928element 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 932element 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 936grammars are the same. A <literal>parentRef</literal> element 937<firstterm>refers to</firstterm> a <literal>define</literal> element 938if the value of their <literal>name</literal> attributes is the same 939and the in-scope grammar of the in-scope grammar of the 940<literal>parentRef</literal> element is the same as the in-scope 941grammar of the <literal>define</literal> element. Every 942<literal>ref</literal> or <literal>parentRef</literal> element must 943refer to a <literal>define</literal> element. A 944<literal>grammar</literal> must have a <literal>start</literal> child 945element.</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>. 950Next, rename <literal>define</literal> elements so that no two 951<literal>define</literal> elements anywhere in the schema have the 952same name. To rename a <literal>define</literal> element, change the 953value of its <literal>name</literal> attribute and change the value of 954the <literal>name</literal> attribute of all <literal>ref</literal> 955and <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> 973element.</para> 974 975<para>First, remove any <literal>define</literal> element that is not 976<firstterm>reachable</firstterm>. A <literal>define</literal> element 977is reachable if there is reachable <literal>ref</literal> element 978referring to it. A <literal>ref</literal> element is reachable if it 979is the descendant of the <literal>start</literal> element or of a 980reachable <literal>define</literal> element. Now, for 981each <literal>element</literal> element that is not the child of a 982<literal>define</literal> element, add a <literal>define</literal> 983element to the <literal>grammar</literal> element, and replace the 984<literal>element</literal> element by a <literal>ref</literal> element 985referring to the added <literal>define</literal> element. The value of 986the <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> 991element.</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> 997element that is expandable and is a descendant of a 998<literal>start</literal> element or an <literal>element</literal> 999element, expand it by replacing the <literal>ref</literal> element by 1000the child of the <literal>define</literal> element to which it refers and 1001then recursively expanding any expandable <literal>ref</literal> 1002elements in this replacement. This must not result in a loop. 1003In other words expanding the replacement of a 1004<literal>ref</literal> element having a <literal>name</literal> with 1005value <replaceable>n</replaceable> must not require the expansion of 1006<literal>ref</literal> element also having a <literal>name</literal> 1007with 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 1018a <literal>start</literal> or <literal>element</literal> element. An 1019<literal>attribute</literal>, <literal>list</literal>, 1020<literal>group</literal>, <literal>interleave</literal>, 1021or <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> 1024element that has two <literal>notAllowed</literal> child elements is 1025transformed 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 1028other child element. An <literal>except</literal> element that has a 1029<literal>notAllowed</literal> child element is removed. 1030The preceding transformations are applied 1031repeatedly until none of them is applicable any more. 1032Any <literal>define</literal> element that is no longer reachable 1033is 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 1044a <literal>choice</literal> element. A <literal>group</literal>, 1045<literal>interleave</literal> or <literal>choice</literal> element 1046that has two <literal>empty</literal> child elements is transformed 1047into an <literal>empty</literal> element. A <literal>group</literal> 1048or <literal>interleave</literal> element that has one 1049<literal>empty</literal> child element is transformed into its other 1050child element. A <literal>choice</literal> element whose 1051second child element is an <literal>empty</literal> element is 1052transformed 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 1056repeatedly 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 1066linkend="simplification"/>, the schema will match the following 1067grammar:</para> 1068 1069<grammarref src="simple.rng"/> 1070 1071<para>With this grammar, no elements or attributes are allowed other 1072than 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 1078linkend="full-syntax-example"/> can be transformed into the simple 1079syntax:</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 1113instance of the data model rather than an XML document. For 1114convenience, we use an XML document to represent an instance of the 1115data 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 1125schema that has been transformed into the simple syntax. The 1126semantics of a RELAX NG schema consist of a specification of what XML 1127documents are valid with respect to that schema. The semantics are 1128described formally. The formalism uses axioms and inference rules. 1129Axioms are propositions that are provable unconditionally. An 1130inference rule consists of one or more antecedents and exactly one 1131consequent. An antecedent is either positive or negative. If all the 1132positive antecedents of an inference rule are provable and none of the 1133negative antecedents are provable, then the consequent of the 1134inference rule is provable. An XML document is valid with respect to a 1135RELAX NG schema if and only if the proposition that it is valid is 1136provable in the formalism specified in this section.</para> 1137 1138<note><para>This kind of formalism is similar to a proof system. 1139However, a traditional proof system only has positive 1140antecedents.</para></note> 1141 1142<para>The notation for inference rules separates the antecedents from 1143the consequent by a horizontal line: the antecedents are above the 1144line; the consequent is below the line. If an antecedent is of the 1145form not(<replaceable>p</replaceable>), then it is a negative 1146antecedent; otherwise, it is a positive antecedent. Both axioms and 1147inferences 1148rules may use variables. A variable has a name and optionally a 1149subscript. The name of a variable is italicized. Each variable has a 1150range that is determined by its name. Axioms and inference rules are 1151implicitly universally quantified over the variables they contain. We 1152explain this further below.</para> 1153 1154<para>The possibility that an inference rule or axiom may contain more 1155than one occurrence of a particular variable requires that an identity 1156relation be defined on each kind of object over which a variable can 1157range. The identity relation for all kinds of object is value-based. 1158Two objects of a particular kind are identical if the constituents of 1159the objects are identical. For example, two attributes are considered 1160the same if they have the same name and the same value. Two characters 1161are 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 1167belonging to a name class. A name class is an element that matches the 1168production nameClass. A name is as defined in <xref 1169linkend="data-model"/>: it consists of a namespace URI and a local 1170name.</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 1177that 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 1186asserts 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 11931":</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 1205range="name"/> belongs to the name class <p:element name="anyName"/>, 1206in other words <p:element name="anyName"/> matches any name. Note the 1207effect of the implicit universal quantification over the variables in 1208the axiom: this is what makes the axiom apply for any name <p:var 1209range="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"/> 1234and for any name class <p:var range="nameClass"/>, 1235if <p:var range="name"/> does not belong to <p:var range="nameClass"/>, 1236then <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 1254matches the NCName production of <xref linkend="xml-names"/>, that is, 1255a 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 1268name <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 1274follows:</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 1370notation:</para> 1371 1372<variablelist> 1373 1374<varlistentry><term><p:var range="context"/></term><listitem><para>ranges 1375over contexts (as defined in <xref 1376linkend="data-model"/>)</para></listitem></varlistentry> 1377 1378<varlistentry><term><p:var range="att"/></term><listitem><para>ranges over 1379sets of attributes; a set with a single member 1380is considered the same as that member</para></listitem></varlistentry> 1381 1382<varlistentry><term><p:var 1383range="mixed"/></term><listitem><para>ranges over sequences of 1384elements and strings; a sequence with a single member is considered 1385the same as that member; the sequences ranged over by <p:var 1386range="mixed"/> may contain consecutive strings and may contain strings 1387that are empty; thus, there are sequences ranged over by <p:var 1388range="mixed"/> that cannot occur as the children of an 1389element</para></listitem></varlistentry> 1390 1391<varlistentry><term><p:var range="pattern"/></term><listitem><para>ranges 1392over patterns (elements matching the pattern 1393production)</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 1402asserts that with respect to context <p:var range="context"/>, the 1403attributes <p:var range="att"/> and the sequence of elements and 1404strings <p:var range="mixed"/> matches the pattern <p:var 1405range="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"/> 1482and <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"/> 1528ensures that the set of attributes constructed in the consequent will 1529not 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 1571over 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> 1613element 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> 1628asserts that there is no name that is 1629the name of both an attribute in <p:var range="att" sub="1"/> 1630and 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 1710asserts that <p:var range="mixed" sub="1"/> 1711is an interleaving of <p:var range="mixed" sub="2"/> 1712and <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 1785as 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"/> 1829ensures that the set of attributes constructed in the consequent will 1830not 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 1838be empty. Thus, the empty sequence is not a possible attribute value. 1839On the hand, the children of an element can be an empty sequence and 1840cannot consist of an empty string. In order to ensure that validation 1841handles attributes and elements consistently, we introduce a variant 1842of matching called <firstterm>weak matching</firstterm>. Weak 1843matching is used when matching the pattern for the value of an 1844attribute or for the attributes and children of an element. We use 1845the following notation to define weak matching.</para> 1846 1847<variablelist> 1848 1849<varlistentry><term><p:function 1850name="emptyString"/></term><listitem><para>represents an empty 1851string</para></listitem></varlistentry> 1852 1853<varlistentry><term><p:var 1854range="whiteSpace"/></term><listitem><para>ranges over the empty 1855sequence and strings that consist entirely of 1856whitespace</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 1865asserts that with respect to context <p:var range="context"/>, the 1866attributes <p:var range="att"/> and the sequence of elements and 1867strings <p:var range="mixed"/> weakly matches the pattern <p:var 1868range="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 1928constructs an attribute with name <p:var range="name"/> 1929and 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 1939constructs an element with name <p:var range="name"/>, 1940context <p:var range="context"/>, 1941attributes <p:var range="att"/> 1942and 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 1949asserts that the mixed sequence <p:var range="mixed"/> can occur as 1950the children of an element: it does not contain any member that is an 1951empty string, nor does it contain two consecutive members that are 1952both 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 1960asserts 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. 2066A datatype library is identified by a URI. A datatype within a 2067datatype library is identified by an NCName. A datatype library 2068provides two services.</para> 2069 2070<itemizedlist> 2071 2072<listitem><para>It can determine whether a string is a legal 2073representation of a datatype. This service accepts a list of zero or 2074more parameters. For example, a string datatype might have a parameter 2075specifying the length of a string. The datatype library determines 2076what parameters are applicable for each datatype.</para></listitem> 2077 2078<listitem><para>It can determine whether two strings represent the 2079same value of a datatype. This service does not have any 2080parameters.</para></listitem> 2081 2082</itemizedlist> 2083 2084<para>Both services may make use of the context of a string. For 2085example, a datatype representing a QName would use the namespace 2086map.</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 2099asserts that in the datatype library identified by URI <p:var range="uri"/>, the string <p:var range="string"/> interpreted with 2100context <p:var range="context"/> is a legal 2101value 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 2112asserts that in the datatype library identified by URI <p:var range="uri"/>, string <p:var range="string" sub="1"/> interpreted with 2113context <p:var range="context" sub="1"/> represents the same value of 2114the 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 2123within the start-tag of a pattern refers to the context 2124of 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"/> 2135except that the default namespace is <p:var range="uri"/>; if <p:var 2136range="uri"/> is the empty string, then there is no default namespace 2137in the constructed context</para></listitem></varlistentry> 2138 2139</variablelist> 2140 2141<para>The datatypeEqual function must be reflexive, transitive 2142and 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. 2319This provides two datatypes, <literal>string</literal> and 2320<literal>token</literal>. No parameters are allowed for either of 2321these 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"/> 2330and <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"/>, 2339with leading and trailing whitespace characters removed, 2340and with each other maximal sequence of whitespace characters 2341replaced by a single space character </para></listitem> 2342</varlistentry> 2343</variablelist> 2344 2345<para>The semantics of the two built-in datatypes are as 2346follows:</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 2414returns a sequence of strings one for each whitespace delimited token 2415of <p:var range="string"/>; each string in the returned sequence will 2416be non-empty and will not contain any 2417whitespace</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 2448sequence that is matched against a pattern can contain consecutive 2449strings.</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 2459schema. 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 2469asserts that the element <p:var range="element"/> is valid with 2470respect 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> 2475asserts 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 2481it 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" 2561sub="0"/>, <p:var range="context" sub="1"/> and <p:var range="context" 2562sub="2"/>, this represents the document in <xref 2563linkend="data-model-example"/>.</para> 2564 2565<para>We now show how <p:var range="element" sub="0"/> can be shown to 2566be valid with respect to the schema in <xref 2567linkend="simple-syntax-example"/>. The schema is equivalent to the 2568following 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 2650linkend="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"/>, 2676we 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 2699linkend="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 2715range="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 2733linkend="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 2759linkend="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 2783context.</para> 2784 2785<para>Thus we can apply the inference rule (valid) in <xref 2786linkend="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 2802been transformed to the simple form described in <xref 2803linkend="simple-syntax"/>. The purpose of these restrictions is to 2804catch 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 2810allowed in the schema based on the names of the ancestor elements. We 2811use the concept of a <firstterm>prohibited path</firstterm> to 2812describe these restrictions. A path is a sequence of NCNames separated 2813by <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 2819NCName, 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>, 2824where <replaceable>x</replaceable> is an NCName and 2825<replaceable>p</replaceable> is a path, if and only if the local name 2826of the element is <replaceable>x</replaceable> and the element has a 2827child 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>, 2831where <replaceable>x</replaceable> is an NCName and 2832<replaceable>p</replaceable> is a path, if and only if the local name 2833of the element is <replaceable>x</replaceable> and the element has a 2834descendant 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>, 2850but not <literal>foo/baz</literal> or 2851<literal>foobar</literal>.</para> 2852 2853<para>A correct RELAX NG schema must be such that, after 2854transformation to the simple form, it does not contain any element 2855that 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 2912with 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 2962attribute 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 2983pattern that is allowable as the content of an element has one of 2984three content-types: empty, complex and simple. We use the following 2985notation.</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 3015range="contentType" sub="1"/> and <p:var range="contentType" sub="2"/> 3016are groupable</para></listitem> 3017</varlistentry> 3018 3019</variablelist> 3020 3021<para>The empty content-type is groupable with anything. In addition, 3022the complex content-type is groupable with the complex content-type. The 3023following 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 3047additional 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 3058content-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" 3068sub="1"/> and <p:var range="contentType" sub="2"/> where the 3069content-types in increasing order are <p:function name="empty"/>, 3070<p:function name="complex"/>, <p:function 3071name="simple"/></para></listitem> 3072</varlistentry> 3073 3074</variablelist> 3075 3076<para>The following rules define when a pattern has a content-type and, 3077if 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 3274redundant because of the prohibited paths in <xref 3275linkend="context-data-except"/>.</para></note> 3276 3277<para>Now we can describe the restriction. We use the following 3278notation.</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 3291have 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 3318pattern <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 3322not 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> 3327is 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 3344precisely, an <literal>attribute</literal> element that has an 3345<literal>anyName</literal> or <literal>nsName</literal> descendant 3346element must have a <literal>oneOrMore</literal> ancestor 3347element.</para> 3348 3349<note><para>This restriction is necessary for closure under 3350negation.</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 3364class 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 3372both <replaceable>p1</replaceable> and 3373<replaceable>p2</replaceable>.</para></listitem> 3374 3375</itemizedlist> 3376 3377<para><xref linkend="attribute-restrictions"/> defines when one 3378pattern 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 3388any XML document whether it is a correct RELAX NG schema. A 3389conforming RELAX NG validator must be able to determine for any XML 3390document and for any correct RELAX NG schema whether the document is 3391valid with respect to the schema.</para> 3392 3393<para>However, the requirements in the preceding paragraph do not 3394apply if the schema uses a datatype library that the validator does 3395not support. A conforming RELAX NG validator is only required to 3396support the built-in datatype library described in <xref 3397linkend="built-in-datatype"/>. A validator that claims conformance to 3398RELAX NG should document which datatype libraries it supports. The 3399requirements in the preceding paragraph also do not apply if the 3400schema includes <literal>externalRef</literal> or 3401<literal>include</literal> elements and the validator is unable to 3402retrieve the resource identified by the URI or is unable to construct 3403an element from the retrieved resource. A validator that claims 3404conformance to RELAX NG should document its capabilities for handling 3405URI 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 3420are as follows:</para> 3421 3422<itemizedlist> 3423 3424<listitem><para>in the namespace URI, <literal>0.9</literal> has been 3425changed to <literal>1.0</literal></para></listitem> 3426 3427<listitem><para><literal>data/except//empty</literal> has been added 3428as a prohibited path (see <xref 3429linkend="context-data-except"/>)</para></listitem> 3430 3431<listitem><para><literal>start//empty</literal> has been added 3432as a prohibited path (see <xref 3433linkend="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 3437transformed</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 3444the <literal>ns</literal> and <literal>datatypeLibrary</literal> 3445attributes, an empty string is allowed (see <xref 3446linkend="full-syntax"/>)</para></listitem> 3447 3448<listitem><para>the removal of unreachable definitions in <xref 3449linkend="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 3453removed</para></listitem> 3454 3455<listitem><para><xref linkend="constraints"/> has been added; the 3456restrictions on the contents of <literal>except</literal> in name 3457classes that are now specified in the newly added section were 3458previously specified in a subsection of <xref 3459linkend="contextual-restriction"/>, which has been 3460removed</para></listitem> 3461 3462<listitem><para>the treatment of element and attribute values that 3463consist only of whitespace has been refined (see <xref 3464linkend="element-pattern"/> and <xref 3465linkend="data-pattern"/>)</para></listitem> 3466 3467<listitem><para>attributes with infinite name classes are now required 3468to be repeated (see <xref 3469linkend="attribute-restrictions"/>)</para></listitem> 3470 3471<listitem><para>restrictions have been imposed on 3472<literal>interleave</literal> (see <xref 3473linkend="interleave-restrictions"/>); <literal>list//interleave</literal> 3474has been added as a prohibited path (see <xref 3475linkend="list-restrictions"/>)</para></listitem> 3476 3477<listitem><para>some of the prohibited paths in <xref 3478linkend="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 3483linkend="text-pattern"/> has been corrected</para></listitem> 3484 3485<listitem><para>the value of the <literal>ns</literal> attribute is 3486now unconstrained (see <xref 3487linkend="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 3497the 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, 3517Jean Paoli, and 3518C. M. Sperberg-McQueen, Eve Maler, editors. 3519<citetitle><ulink url="http://www.w3.org/TR/REC-xml">Extensible Markup 3520Language (XML) 1.0 Second Edition</ulink></citetitle>. 3521W3C (World Wide Web Consortium), 2000.</bibliomixed> 3522 3523<bibliomixed id="xml-names"><abbrev>XML Namespaces</abbrev>Tim Bray, 3524Dave Hollander, 3525and Andrew Layman, editors. 3526<citetitle><ulink url="http://www.w3.org/TR/REC-xml-names/">Namespaces in 3527XML</ulink></citetitle>. 3528W3C (World Wide Web Consortium), 1999.</bibliomixed> 3529 3530<bibliomixed id="xlink"><abbrev>XLink</abbrev>Steve DeRose, Eve Maler 3531and David Orchard, editors. 3532<citetitle><ulink url="http://www.w3.org/TR/xlink/">XML Linking 3533Language (XLink) Version 1.0</ulink></citetitle>. 3534W3C (World Wide Web Consortium), 2001.</bibliomixed> 3535 3536<bibliomixed id="infoset"><abbrev>XML Infoset</abbrev>John Cowan, Richard Tobin, 3537editors. 3538<citetitle><ulink url="http://www.w3.org/TR/xml-infoset/">XML 3539Information Set</ulink></citetitle>. 3540W3C (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: 3544Uniform Resource Identifiers (URI): Generic 3545Syntax</ulink></citetitle>. 3546IETF (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>. 3550IETF (Internet Engineering Task Force), 1999.</bibliomixed> 3551 3552<bibliomixed id="rfc3023"><abbrev>RFC 3023</abbrev> M. Murata, 3553S. St.Laurent, D. Kohn. <citetitle><ulink 3554url="http://www.ietf.org/rfc/rfc3023.txt">RFC 3023: XML Media 3555Types</ulink></citetitle>. IETF (Internet Engineering Task Force), 35562001.</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>. 3564W3C (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>. 3568Thai 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 3572Language 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, 3576Matthew Fuchs, Jonathan Robie, Philip Wadler, editors. 3577<citetitle><ulink url="http://www.w3.org/TR/xmlschema-formal/">XML Schema: Formal Description</ulink></citetitle>. 3578W3C (World Wide Web Consortium), 2001.</bibliomixed> 3579 3580<bibliomixed id="tutorial"><abbrev>Tutorial</abbrev>James Clark, 3581Makoto MURATA, editors. <citetitle><ulink 3582url="http://www.oasis-open.org/committees/relax-ng/tutorial.html">RELAX 3583NG Tutorial</ulink></citetitle>. OASIS, 2001.</bibliomixed> 3584 3585</bibliodiv> 3586 3587</bibliography> 3588 3589</article> 3590