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