<?xml version="1.0" encoding="UTF-8"?>

<!-- ==================================================================
     Relax NG Schema for XSPF Version 0

     $Id$

     This schema was written as a service for developers who want
     to validate the playlists generated by their applications.
     Nobody claims it is perfect, so if you find bugs please report
     them. In any case, the spec overrides this schema.

     Further information about XSPF is available at http://www.xspf.org


     Copyright (c) 2005 Matthias Friedrich <matt@mafr.de>

     The schema is released under the Creative Commons 
     Attribution-ShareAlike 2.5 license.

     http://creativecommons.org/licenses/by-sa/2.5/


     ChangeLog:
      * 2008-07-26: Support for xml:base attribute
                    Sebastian Pipping <webmaster@hartwork.org>

      * 2007-05-02: XSPF-0 schema extracted from XSPF-1 edition
                    Sebastian Pipping <webmaster@hartwork.org>

      * 2007-02-16: Trang-friendly transformation of def_anything
                    Sebastian Pipping <webmaster@hartwork.org>

      * 2007-02-16: Interleave wrap for track and playlist
                    to allow arbitrary element order
                    Sebastian Pipping <webmaster@hartwork.org>

      * 2007-01-07: The info element's content has been changed from
                    type "text" to "anyURI", as per spec.
                    Matthias Friedrich <matt@mafr.de>

      * 2006-09-25: Fixed an error: the "attribution" element now allows
                    "identifier" child element elements, too.
                    Matthias Friedrich <matt@mafr.de>
     ================================================================== -->


<grammar xmlns="http://relaxng.org/ns/structure/1.0"
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
         ns="http://xspf.org/ns/0/">


    <start>
        <ref name="def_playlist-element"/>
    </start>


    <define name="def_playlist-element">
        <element name="playlist">
            <attribute name="version">
                <data type="string">
                    <param name="pattern">0</param>
                </data>
            </attribute>
            <optional>
                <attribute name="xml:base">
                    <data type="anyURI"/>
                </attribute>
            </optional>

            <interleave>
                <optional>
                    <element name="title">
                        <text/>
                    </element>
                </optional>
                <optional>
                    <element name="creator">
                        <text/>
                    </element>
                </optional>
                <optional>
                    <element name="annotation">
                        <text/>
                    </element>
                </optional>
                <optional>
                    <element name="info">
                        <data type="anyURI"/>
                    </element>
                </optional>
                <optional>
                    <element name="location">
                        <data type="anyURI"/>
                    </element>
                </optional>
                <optional>
                    <element name="identifier">
                        <data type="anyURI"/>
                    </element>
                </optional>
                <optional>
                    <element name="image">
                        <data type="anyURI"/>
                    </element>
                </optional>
                <optional>
                    <element name="date">
                        <data type="dateTime"/>
                    </element>
                </optional>
                <optional>
                    <element name="license">
                        <data type="anyURI"/>
                    </element>
                </optional>

                <optional>
                    <ref name="def_attribution-element"/>
                </optional>

                <zeroOrMore>
                    <ref name="def_link-element"/>
                </zeroOrMore>
                <zeroOrMore>
                    <ref name="def_meta-element"/>
                </zeroOrMore>

                <element name="trackList">
                    <ref name="def_track-element"/>
                    <zeroOrMore>
                        <ref name="def_track-element"/>
                    </zeroOrMore>
                </element>
            </interleave>
        </element>
    </define>


    <define name="def_attribution-element">
        <element name="attribution">
            <zeroOrMore>
                <choice>
                    <element name="identifier">
                        <data type="anyURI"/>
                    </element>
                    <element name="location">
                        <data type="anyURI"/>
                    </element>
                </choice>
            </zeroOrMore>
        </element>
    </define>


    <define name="def_link-element">
        <element name="link">
            <attribute name="rel">
                <data type="anyURI"/>
            </attribute>

            <data type="anyURI"/>
        </element>
    </define>


    <define name="def_meta-element">
        <element name="meta">
            <attribute name="rel">
                <data type="anyURI"/>
            </attribute>

            <text />
        </element>
    </define>


    <define name="def_track-element">
        <element name="track">
            <interleave>
                <zeroOrMore>
                    <element name="location">
                        <data type="anyURI"/>
                    </element>
                </zeroOrMore>
                <zeroOrMore>
                    <element name="identifier">
                        <data type="anyURI"/>
                    </element>
                </zeroOrMore>

                <optional>
                    <element name="title">
                        <text/>
                    </element>
                </optional>
                <optional>
                    <element name="creator">
                        <text/>
                    </element>
                </optional>
                <optional>
                    <element name="annotation">
                        <text/>
                    </element>
                </optional>
                <optional>
                    <element name="info">
                        <data type="anyURI"/>
                    </element>
                </optional>
                <optional>
                    <element name="image">
                        <data type="anyURI"/>
                    </element>
                </optional>
                <optional>
                    <element name="album">
                        <text/>
                    </element>
                </optional>
                <optional>
                    <element name="trackNum">
                        <data type="nonNegativeInteger"/>
                    </element>
                </optional>
                <optional>
                    <element name="duration">
                        <data type="nonNegativeInteger"/>
                    </element>
                </optional>

                <zeroOrMore>
                    <ref name="def_link-element"/>
                </zeroOrMore>
                <zeroOrMore>
                    <ref name="def_meta-element"/>
                </zeroOrMore>
            </interleave>
        </element>
    </define>

</grammar>