Commit | Line | Data |
---|---|---|
8cd39fb3 MH |
1 | # RELAX NG Compact Schema for RDF/XML Syntax |
2 | # | |
14760e95 CY |
3 | # Copyright (C) 2001-2008 World Wide Web Consortium, (Massachusetts |
4 | # Institute of Technology, European Research Consortium for | |
5 | # Informatics and Mathematics, Keio University). All Rights Reserved. | |
6 | # This work is distributed under the W3C(R) Software License in the | |
7 | # hope that it will be useful, but WITHOUT ANY WARRANTY; without even | |
8 | # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
9 | # PURPOSE. | |
10 | # | |
8cd39fb3 MH |
11 | # This schema is for information only and NON-NORMATIVE |
12 | # | |
13 | # It is based on one originally written by James Clark in | |
14 | # http://lists.w3.org/Archives/Public/www-rdf-comments/2001JulSep/0248.html | |
15 | # and updated with later changes. | |
8cd39fb3 MH |
16 | |
17 | namespace local = "" | |
18 | namespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |
19 | datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes" | |
20 | ||
21 | ||
22 | start = doc | |
23 | ||
24 | ||
25 | # I cannot seem to do this in RNGC so they are expanded in-line | |
26 | ||
27 | # coreSyntaxTerms = rdf:RDF | rdf:ID | rdf:about | rdf:parseType | rdf:resource | rdf:nodeID | rdf:datatype | |
28 | # syntaxTerms = coreSyntaxTerms | rdf:Description | rdf:li | |
29 | # oldTerms = rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID | |
30 | # nodeElementURIs = * - ( coreSyntaxTerms | rdf:li | oldTerms ) | |
31 | # propertyElementURIs = * - ( coreSyntaxTerms | rdf:Description | oldTerms ) | |
32 | # propertyAttributeURIs = * - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms ) | |
33 | ||
34 | # Also needed to allow rdf:li on all property element productions | |
35 | # since we can't capture the rdf:li rewriting to rdf_<n> in relaxng | |
36 | ||
37 | # Need to add these explicitly | |
38 | xmllang = attribute xml:lang { text } | |
39 | xmlbase = attribute xml:base { text } | |
40 | # and to forbid every other xml:* attribute, element | |
41 | ||
42 | doc = | |
43 | RDF | |
44 | ||
45 | RDF = | |
46 | element rdf:RDF { | |
47 | xmllang?, xmlbase?, nodeElementList | |
48 | } | |
49 | ||
50 | nodeElementList = | |
51 | nodeElement* | |
52 | ||
53 | # Should be something like: | |
54 | # ws* , ( nodeElement , ws* )* | |
55 | # but RELAXNG does this by default, ignoring whitespace separating tags. | |
56 | ||
57 | nodeElement = | |
58 | element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType | | |
59 | rdf:resource | rdf:nodeID | rdf:datatype | rdf:li | | |
60 | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID ) { | |
61 | (idAttr | nodeIdAttr | aboutAttr )?, xmllang?, xmlbase?, propertyAttr*, propertyEltList | |
62 | } | |
63 | ||
64 | # It is not possible to say "and not things | |
65 | # beginning with _ in the rdf: namespace" in RELAX NG. | |
66 | ||
67 | ws = | |
68 | " " | |
69 | ||
70 | # Not used in this RELAX NG schema; but should be any legal XML | |
71 | # whitespace defined by http://www.w3.org/TR/2000/REC-xml-20001006#NT-S | |
72 | ||
73 | ||
74 | propertyEltList = | |
75 | propertyElt* | |
76 | ||
77 | # Should be something like: | |
78 | # ws* , ( propertyElt , ws* )* | |
79 | # but RELAXNG does this by default, ignoring whitespace separating tags. | |
80 | ||
81 | propertyElt = | |
82 | resourcePropertyElt | | |
83 | literalPropertyElt | | |
84 | parseTypeLiteralPropertyElt | | |
85 | parseTypeResourcePropertyElt | | |
86 | parseTypeCollectionPropertyElt | | |
87 | parseTypeOtherPropertyElt | | |
88 | emptyPropertyElt | |
89 | ||
90 | resourcePropertyElt = | |
91 | element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType | | |
92 | rdf:resource | rdf:nodeID | rdf:datatype | | |
93 | rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID | | |
94 | xml:* ) { | |
95 | idAttr?, xmllang?, xmlbase?, nodeElement | |
96 | } | |
97 | ||
98 | literalPropertyElt = | |
99 | element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType | | |
100 | rdf:resource | rdf:nodeID | rdf:datatype | | |
101 | rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID | | |
102 | xml:* ) { | |
103 | (idAttr | datatypeAttr )?, xmllang?, xmlbase?, text | |
104 | } | |
105 | ||
106 | parseTypeLiteralPropertyElt = | |
107 | element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType | | |
108 | rdf:resource | rdf:nodeID | rdf:datatype | | |
109 | rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID | | |
110 | xml:* ) { | |
111 | idAttr?, parseLiteral, xmllang?, xmlbase?, literal | |
112 | } | |
113 | ||
114 | parseTypeResourcePropertyElt = | |
115 | element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType | | |
116 | rdf:resource | rdf:nodeID | rdf:datatype | | |
117 | rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID | | |
118 | xml:* ) { | |
119 | idAttr?, parseResource, xmllang?, xmlbase?, propertyEltList | |
120 | } | |
121 | ||
122 | parseTypeCollectionPropertyElt = | |
123 | element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType | | |
124 | rdf:resource | rdf:nodeID | rdf:datatype | | |
125 | rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID | | |
126 | xml:* ) { | |
127 | idAttr?, xmllang?, xmlbase?, parseCollection, nodeElementList | |
128 | } | |
129 | ||
130 | parseTypeOtherPropertyElt = | |
131 | element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType | | |
132 | rdf:resource | rdf:nodeID | rdf:datatype | | |
133 | rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID | | |
134 | xml:* ) { | |
135 | idAttr?, xmllang?, xmlbase?, parseOther, any | |
136 | } | |
137 | ||
138 | emptyPropertyElt = | |
139 | element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType | | |
140 | rdf:resource | rdf:nodeID | rdf:datatype | | |
141 | rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID | | |
142 | xml:* ) { | |
143 | idAttr?, (resourceAttr | nodeIdAttr)?, xmllang?, xmlbase?, propertyAttr* | |
144 | } | |
145 | ||
146 | idAttr = | |
147 | attribute rdf:ID { | |
148 | IDsymbol | |
149 | } | |
150 | ||
151 | nodeIdAttr = | |
152 | attribute rdf:nodeID { | |
153 | IDsymbol | |
154 | } | |
155 | ||
156 | aboutAttr = | |
157 | attribute rdf:about { | |
158 | URI-reference | |
159 | } | |
160 | ||
161 | propertyAttr = | |
162 | attribute * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType | | |
163 | rdf:resource | rdf:nodeID | rdf:datatype | rdf:li | | |
164 | rdf:Description | rdf:aboutEach | | |
165 | rdf:aboutEachPrefix | rdf:bagID | | |
166 | xml:* ) { | |
167 | string | |
168 | } | |
169 | ||
170 | resourceAttr = | |
171 | attribute rdf:resource { | |
172 | URI-reference | |
173 | } | |
174 | ||
175 | datatypeAttr = | |
176 | attribute rdf:datatype { | |
177 | URI-reference | |
178 | } | |
179 | ||
180 | parseLiteral = | |
181 | attribute rdf:parseType { | |
182 | "Literal" | |
183 | } | |
184 | ||
185 | parseResource = | |
186 | attribute rdf:parseType { | |
187 | "Resource" | |
188 | } | |
189 | ||
190 | parseCollection = | |
191 | attribute rdf:parseType { | |
192 | "Collection" | |
193 | } | |
194 | ||
195 | parseOther = | |
196 | attribute rdf:parseType { | |
197 | text | |
198 | } | |
199 | ||
200 | URI-reference = | |
201 | string | |
202 | ||
203 | literal = | |
204 | any | |
205 | ||
206 | IDsymbol = | |
207 | xsd:NMTOKEN | |
208 | ||
209 | any = | |
210 | mixed { element * { attribute * { text }*, any }* } | |
211 |