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