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