0e693d6d1b53f75ac035aedd32e1ce9e1263ce99
[hespiff.git] / src / main / rng / xspf-1_0.7.rng
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <!-- ==================================================================
4      Relax NG Schema for XSPF Version 1
5
6      $Id$
7
8      This schema was written as a service for developers who want
9      to validate the playlists generated by their applications.
10      Nobody claims it is perfect, so if you find bugs please report
11      them. In any case, the spec overrides this schema.
12
13      Further information about XSPF is available at http://www.xml.org
14
15
16      Copyright (c) 2005 Matthias Friedrich <matt@mafr.de>
17      Copyright (c) 2007-2008 Sebastian Pipping <webmaster@hartwork.org>
18
19      The schema is released under the Creative Commons 
20      Attribution-ShareAlike 2.5 license.
21
22      http://creativecommons.org/licenses/by-sa/2.5/
23
24
25      ChangeLog:
26       * 2008-09-03: Allow xml:base attribute everywhere
27                     Extract common elements
28                     Sebastian Pipping <webmaster@hartwork.org>
29
30       * 2008-07-26: Support for xml:base attribute
31                     Sebastian Pipping <webmaster@hartwork.org>
32
33       * 2007-02-16: Trang-friendly transformation of def_anything
34                     Sebastian Pipping <webmaster@hartwork.org>
35
36       * 2007-02-16: Interleave wrap for track and playlist
37                     to allow arbitrary element order
38                     Sebastian Pipping <webmaster@hartwork.org>
39
40       * 2007-01-07: The info element's content has been changed from
41                     type "text" to "anyURI", as per spec.
42                     Matthias Friedrich <matt@mafr.de>
43
44       * 2006-09-25: Fixed an error: the "attribution" element now allows
45                     "identifier" child element elements, too.
46                     Matthias Friedrich <matt@mafr.de>
47      ================================================================== -->
48
49
50 <grammar xmlns="http://relaxng.org/ns/structure/1.0"
51          datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
52          ns="http://xspf.org/ns/0/">
53
54
55     <start>
56         <ref name="def_playlist-element"/>
57     </start>
58
59
60     <define name="xml_base-attribute">
61         <optional>
62             <attribute name="xml:base">
63                 <data type="anyURI"/>
64             </attribute>
65         </optional>
66     </define>
67
68
69     <define name="def_title-element">
70         <element name="title">
71             <ref name="xml_base-attribute"/>
72             <text/>
73         </element>
74     </define>
75
76
77     <define name="def_creator-element">
78         <element name="creator">
79             <ref name="xml_base-attribute"/>
80             <text/>
81         </element>
82     </define>
83
84
85     <define name="def_annotation-element">
86         <element name="annotation">
87             <ref name="xml_base-attribute"/>
88             <text/>
89         </element>
90     </define>
91
92
93     <define name="def_info-element">
94         <element name="info">
95             <ref name="xml_base-attribute"/>
96             <data type="anyURI"/>
97         </element>
98     </define>
99
100
101     <define name="def_location-element">
102         <element name="location">
103             <ref name="xml_base-attribute"/>
104             <data type="anyURI"/>
105         </element>
106     </define>
107
108
109     <define name="def_identifier-element">
110         <element name="identifier">
111             <ref name="xml_base-attribute"/>
112             <data type="anyURI"/>
113         </element>
114     </define>
115
116
117     <define name="def_image-element">
118         <element name="image">
119             <ref name="xml_base-attribute"/>
120             <data type="anyURI"/>
121         </element>
122     </define>
123
124
125     <define name="def_link-element">
126         <element name="link">
127             <attribute name="rel">
128                 <data type="anyURI"/>
129             </attribute>
130             <ref name="xml_base-attribute"/>
131
132             <data type="anyURI"/>
133         </element>
134     </define>
135
136
137     <define name="def_meta-element">
138         <element name="meta">
139             <attribute name="rel">
140                 <data type="anyURI"/>
141             </attribute>
142             <ref name="xml_base-attribute"/>
143
144             <text />
145         </element>
146     </define>
147
148
149     <define name="def_extension-element">
150         <element name="extension">
151             <attribute name="application">
152                 <data type="anyURI"/>
153             </attribute>
154             <ref name="xml_base-attribute"/>
155
156             <zeroOrMore>
157                 <choice>
158                     <element>
159                         <anyName/>
160                         <ref name="def_anything"/>
161                     </element>
162                     <text/>
163                 </choice>
164             </zeroOrMore>
165         </element>
166     </define>
167
168
169     <define name="def_playlist-element">
170         <element name="playlist">
171             <attribute name="version">
172                 <data type="string">
173                     <param name="pattern">1</param>
174                 </data>
175             </attribute>
176             <ref name="xml_base-attribute"/>
177
178             <interleave>
179                 <optional>
180                     <ref name="def_title-element"/>
181                 </optional>
182                 <optional>
183                     <ref name="def_creator-element"/>
184                 </optional>
185                 <optional>
186                     <ref name="def_annotation-element"/>
187                 </optional>
188                 <optional>
189                     <ref name="def_info-element"/>
190                 </optional>
191                 <optional>
192                     <ref name="def_location-element"/>
193                 </optional>
194                 <optional>
195                     <ref name="def_identifier-element"/>
196                 </optional>
197                 <optional>
198                     <ref name="def_image-element"/>
199                 </optional>
200                 <optional>
201                     <element name="date">
202                         <ref name="xml_base-attribute"/>
203                         <data type="dateTime"/>
204                     </element>
205                 </optional>
206                 <optional>
207                     <element name="license">
208                         <ref name="xml_base-attribute"/>
209                         <data type="anyURI"/>
210                     </element>
211                 </optional>
212
213                 <optional>
214                     <ref name="def_attribution-element"/>
215                 </optional>
216
217                 <zeroOrMore>
218                     <ref name="def_link-element"/>
219                 </zeroOrMore>
220                 <zeroOrMore>
221                     <ref name="def_meta-element"/>
222                 </zeroOrMore>
223                 <zeroOrMore>
224                     <ref name="def_extension-element"/>
225                 </zeroOrMore>
226
227                 <element name="trackList">
228                     <ref name="xml_base-attribute"/>
229                     <zeroOrMore>
230                         <ref name="def_track-element"/>
231                     </zeroOrMore>
232                 </element>
233             </interleave>
234         </element>
235     </define>
236
237
238     <define name="def_attribution-element">
239         <element name="attribution">
240             <ref name="xml_base-attribute"/>
241
242             <zeroOrMore>
243                 <choice>
244                     <ref name="def_identifier-element"/>
245                     <ref name="def_location-element"/>
246                 </choice>
247             </zeroOrMore>
248         </element>
249     </define>
250
251
252     <define name="def_anything">
253         <interleave>
254             <zeroOrMore>
255                 <element>
256                     <anyName/>
257                     <ref name="def_anything"/>
258                 </element>
259             </zeroOrMore>
260
261             <zeroOrMore>
262                 <attribute>
263                     <anyName/>
264                 </attribute>
265             </zeroOrMore>
266
267             <zeroOrMore>
268                 <text/>
269             </zeroOrMore>
270         </interleave>
271     </define>
272
273
274     <define name="def_track-element">
275         <element name="track">
276             <ref name="xml_base-attribute"/>
277
278             <interleave>
279                 <zeroOrMore>
280                     <ref name="def_location-element"/>
281                 </zeroOrMore>
282                 <zeroOrMore>
283                     <ref name="def_identifier-element"/>
284                 </zeroOrMore>
285
286                 <optional>
287                     <ref name="def_title-element"/>
288                 </optional>
289                 <optional>
290                     <ref name="def_creator-element"/>
291                 </optional>
292                 <optional>
293                     <ref name="def_annotation-element"/>
294                 </optional>
295                 <optional>
296                     <ref name="def_info-element"/>
297                 </optional>
298                 <optional>
299                     <ref name="def_image-element"/>
300                 </optional>
301                 <optional>
302                     <element name="album">
303                         <ref name="xml_base-attribute"/>
304                         <text/>
305                     </element>
306                 </optional>
307                 <optional>
308                     <element name="trackNum">
309                         <ref name="xml_base-attribute"/>
310                         <data type="nonNegativeInteger"/>
311                     </element>
312                 </optional>
313                 <optional>
314                     <element name="duration">
315                         <ref name="xml_base-attribute"/>
316                         <data type="nonNegativeInteger"/>
317                     </element>
318                 </optional>
319
320                 <zeroOrMore>
321                     <ref name="def_link-element"/>
322                 </zeroOrMore>
323                 <zeroOrMore>
324                     <ref name="def_meta-element"/>
325                 </zeroOrMore>
326                 <zeroOrMore>
327                     <ref name="def_extension-element"/>
328                 </zeroOrMore>
329             </interleave>
330         </element>
331     </define>
332
333 </grammar>