1 <?xml version="1.0" encoding="UTF-8"?>
\r
4 RELAX NG Compact Syntax Grammar for the
\r
5 Atom Format Specification Version 11
\r
7 <grammar xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:s="http://www.ascc.net/xml/schematron" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
\r
10 <ref name="atomFeed"/>
\r
11 <ref name="atomEntry"/>
\r
14 <!-- Common attributes -->
\r
15 <define name="atomCommonAttributes">
\r
17 <attribute name="xml:base">
\r
18 <ref name="atomUri"/>
\r
22 <attribute name="xml:lang">
\r
23 <ref name="atomLanguageTag"/>
\r
27 <ref name="undefinedAttribute"/>
\r
30 <!-- Text Constructs -->
\r
31 <define name="atomPlainTextConstruct">
\r
32 <ref name="atomCommonAttributes"/>
\r
34 <attribute name="type">
\r
43 <define name="atomXHTMLTextConstruct">
\r
44 <ref name="atomCommonAttributes"/>
\r
45 <attribute name="type">
\r
46 <value>xhtml</value>
\r
48 <ref name="xhtmlDiv"/>
\r
50 <define name="atomTextConstruct">
\r
52 <ref name="atomPlainTextConstruct"/>
\r
53 <ref name="atomXHTMLTextConstruct"/>
\r
56 <!-- Person Construct -->
\r
57 <define name="atomPersonConstruct">
\r
58 <ref name="atomCommonAttributes"/>
\r
60 <element name="atom:name">
\r
64 <element name="atom:uri">
\r
65 <ref name="atomUri"/>
\r
69 <element name="atom:email">
\r
70 <ref name="atomEmailAddress"/>
\r
74 <ref name="extensionElement"/>
\r
78 <!-- Date Construct -->
\r
79 <define name="atomDateConstruct">
\r
80 <ref name="atomCommonAttributes"/>
\r
81 <data type="dateTime"/>
\r
84 <define name="atomFeed">
\r
85 <element name="atom:feed">
\r
86 <s:rule context="atom:feed">
\r
87 <s:assert test="atom:author or not(atom:entry[not(atom:author)])">An atom:feed must have an atom:author unless all of its atom:entry children have an atom:author.</s:assert>
\r
89 <ref name="atomCommonAttributes"/>
\r
92 <ref name="atomAuthor"/>
\r
95 <ref name="atomCategory"/>
\r
98 <ref name="atomContributor"/>
\r
101 <ref name="atomGenerator"/>
\r
104 <ref name="atomIcon"/>
\r
106 <ref name="atomId"/>
\r
108 <ref name="atomLink"/>
\r
111 <ref name="atomLogo"/>
\r
114 <ref name="atomRights"/>
\r
117 <ref name="atomSubtitle"/>
\r
119 <ref name="atomTitle"/>
\r
120 <ref name="atomUpdated"/>
\r
122 <ref name="extensionElement"/>
\r
126 <ref name="atomEntry"/>
\r
130 <!-- atom:entry -->
\r
131 <define name="atomEntry">
\r
132 <element name="atom:entry">
\r
133 <s:rule context="atom:entry">
\r
134 <s:assert test="atom:link[@rel='alternate'] or atom:link[not(@rel)] or atom:content">An atom:entry must have at least one atom:link element with a rel attribute of 'alternate' or an atom:content.</s:assert>
\r
136 <s:rule context="atom:entry">
\r
137 <s:assert test="atom:author or ../atom:author or atom:source/atom:author">An atom:entry must have an atom:author if its feed does not.</s:assert>
\r
139 <ref name="atomCommonAttributes"/>
\r
142 <ref name="atomAuthor"/>
\r
145 <ref name="atomCategory"/>
\r
148 <ref name="atomContent"/>
\r
151 <ref name="atomContributor"/>
\r
153 <ref name="atomId"/>
\r
155 <ref name="atomLink"/>
\r
158 <ref name="atomPublished"/>
\r
161 <ref name="atomRights"/>
\r
164 <ref name="atomSource"/>
\r
167 <ref name="atomSummary"/>
\r
169 <ref name="atomTitle"/>
\r
170 <ref name="atomUpdated"/>
\r
172 <ref name="extensionElement"/>
\r
177 <!-- atom:content -->
\r
178 <define name="atomInlineTextContent">
\r
179 <element name="atom:content">
\r
180 <ref name="atomCommonAttributes"/>
\r
182 <attribute name="type">
\r
184 <value>text</value>
\r
185 <value>html</value>
\r
194 <define name="atomInlineXHTMLContent">
\r
195 <element name="atom:content">
\r
196 <ref name="atomCommonAttributes"/>
\r
197 <attribute name="type">
\r
198 <value>xhtml</value>
\r
200 <ref name="xhtmlDiv"/>
\r
203 <define name="atomInlineOtherContent">
\r
204 <element name="atom:content">
\r
205 <ref name="atomCommonAttributes"/>
\r
207 <attribute name="type">
\r
208 <ref name="atomMediaType"/>
\r
214 <ref name="anyElement"/>
\r
219 <define name="atomOutOfLineContent">
\r
220 <element name="atom:content">
\r
221 <ref name="atomCommonAttributes"/>
\r
223 <attribute name="type">
\r
224 <ref name="atomMediaType"/>
\r
227 <attribute name="src">
\r
228 <ref name="atomUri"/>
\r
233 <define name="atomContent">
\r
235 <ref name="atomInlineTextContent"/>
\r
236 <ref name="atomInlineXHTMLContent"/>
\r
237 <ref name="atomInlineOtherContent"/>
\r
238 <ref name="atomOutOfLineContent"/>
\r
241 <!-- atom:author -->
\r
242 <define name="atomAuthor">
\r
243 <element name="atom:author">
\r
244 <ref name="atomPersonConstruct"/>
\r
247 <!-- atom:category -->
\r
248 <define name="atomCategory">
\r
249 <element name="atom:category">
\r
250 <ref name="atomCommonAttributes"/>
\r
251 <attribute name="term"/>
\r
253 <attribute name="scheme">
\r
254 <ref name="atomUri"/>
\r
258 <attribute name="label"/>
\r
260 <ref name="undefinedContent"/>
\r
263 <!-- atom:contributor -->
\r
264 <define name="atomContributor">
\r
265 <element name="atom:contributor">
\r
266 <ref name="atomPersonConstruct"/>
\r
269 <!-- atom:generator -->
\r
270 <define name="atomGenerator">
\r
271 <element name="atom:generator">
\r
272 <ref name="atomCommonAttributes"/>
\r
274 <attribute name="uri">
\r
275 <ref name="atomUri"/>
\r
279 <attribute name="version"/>
\r
285 <define name="atomIcon">
\r
286 <element name="atom:icon">
\r
287 <ref name="atomCommonAttributes"/>
\r
288 <ref name="atomUri"/>
\r
292 <define name="atomId">
\r
293 <element name="atom:id">
\r
294 <ref name="atomCommonAttributes"/>
\r
295 <ref name="atomUri"/>
\r
299 <define name="atomLogo">
\r
300 <element name="atom:logo">
\r
301 <ref name="atomCommonAttributes"/>
\r
302 <ref name="atomUri"/>
\r
306 <define name="atomLink">
\r
307 <element name="atom:link">
\r
308 <ref name="atomCommonAttributes"/>
\r
309 <attribute name="href">
\r
310 <ref name="atomUri"/>
\r
313 <attribute name="rel">
\r
315 <ref name="atomNCName"/>
\r
316 <ref name="atomUri"/>
\r
321 <attribute name="type">
\r
322 <ref name="atomMediaType"/>
\r
326 <attribute name="hreflang">
\r
327 <ref name="atomLanguageTag"/>
\r
331 <attribute name="title"/>
\r
334 <attribute name="length"/>
\r
336 <ref name="undefinedContent"/>
\r
339 <!-- atom:published -->
\r
340 <define name="atomPublished">
\r
341 <element name="atom:published">
\r
342 <ref name="atomDateConstruct"/>
\r
345 <!-- atom:rights -->
\r
346 <define name="atomRights">
\r
347 <element name="atom:rights">
\r
348 <ref name="atomTextConstruct"/>
\r
351 <!-- atom:source -->
\r
352 <define name="atomSource">
\r
353 <element name="atom:source">
\r
354 <ref name="atomCommonAttributes"/>
\r
357 <ref name="atomAuthor"/>
\r
360 <ref name="atomCategory"/>
\r
363 <ref name="atomContributor"/>
\r
366 <ref name="atomGenerator"/>
\r
369 <ref name="atomIcon"/>
\r
372 <ref name="atomId"/>
\r
375 <ref name="atomLink"/>
\r
378 <ref name="atomLogo"/>
\r
381 <ref name="atomRights"/>
\r
384 <ref name="atomSubtitle"/>
\r
387 <ref name="atomTitle"/>
\r
390 <ref name="atomUpdated"/>
\r
393 <ref name="extensionElement"/>
\r
398 <!-- atom:subtitle -->
\r
399 <define name="atomSubtitle">
\r
400 <element name="atom:subtitle">
\r
401 <ref name="atomTextConstruct"/>
\r
404 <!-- atom:summary -->
\r
405 <define name="atomSummary">
\r
406 <element name="atom:summary">
\r
407 <ref name="atomTextConstruct"/>
\r
410 <!-- atom:title -->
\r
411 <define name="atomTitle">
\r
412 <element name="atom:title">
\r
413 <ref name="atomTextConstruct"/>
\r
416 <!-- atom:updated -->
\r
417 <define name="atomUpdated">
\r
418 <element name="atom:updated">
\r
419 <ref name="atomDateConstruct"/>
\r
422 <!-- Low-level simple types -->
\r
423 <define name="atomNCName">
\r
424 <data type="string">
\r
425 <param name="minLength">1</param>
\r
426 <param name="pattern">[^:]*</param>
\r
429 <!-- Whatever a media type is, it contains at least one slash -->
\r
430 <define name="atomMediaType">
\r
431 <data type="string">
\r
432 <param name="pattern">.+/.+</param>
\r
435 <!-- As defined in RFC 3066 -->
\r
436 <define name="atomLanguageTag">
\r
437 <data type="string">
\r
438 <param name="pattern">[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*</param>
\r
442 Unconstrained; it's not entirely clear how IRI fit into
\r
443 xsd:anyURI so let's not try to constrain it here
\r
445 <define name="atomUri">
\r
448 <!-- Whatever an email address is, it contains at least one @ -->
\r
449 <define name="atomEmailAddress">
\r
450 <data type="string">
\r
451 <param name="pattern">.+@.+</param>
\r
454 <!-- Simple Extension -->
\r
455 <define name="simpleExtensionElement">
\r
459 <nsName ns="http://www.w3.org/2005/Atom"/>
\r
465 <!-- Structured Extension -->
\r
466 <define name="structuredExtensionElement">
\r
470 <nsName ns="http://www.w3.org/2005/Atom"/>
\r
483 <ref name="anyElement"/>
\r
498 <ref name="anyElement"/>
\r
503 <ref name="anyElement"/>
\r
511 <!-- Other Extensibility -->
\r
512 <define name="extensionElement">
\r
514 <ref name="simpleExtensionElement"/>
\r
515 <ref name="structuredExtensionElement"/>
\r
518 <define name="undefinedAttribute">
\r
522 <name>xml:base</name>
\r
523 <name>xml:lang</name>
\r
529 <define name="undefinedContent">
\r
533 <ref name="anyForeignElement"/>
\r
537 <define name="anyElement">
\r
546 <ref name="anyElement"/>
\r
551 <define name="anyForeignElement">
\r
555 <nsName ns="http://www.w3.org/2005/Atom"/>
\r
564 <ref name="anyElement"/>
\r
570 <define name="anyXHTML">
\r
572 <nsName ns="http://www.w3.org/1999/xhtml"/>
\r
579 <ref name="anyXHTML"/>
\r
584 <define name="xhtmlDiv">
\r
585 <element name="xhtml:div">
\r
592 <ref name="anyXHTML"/>
\r