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

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

     $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>
     Copyright (c) 2007-2008 Sebastian Pipping <webmaster@hartwork.org>

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

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


     ChangeLog:
      * 2008-09-03: Allow xml:base attribute everywhere
                    Extract common elements
                    Sebastian Pipping <webmaster@hartwork.org>

      * 2008-07-26: Support for xml:base attribute
                    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="xml_base-attribute">
        <optional>
            <attribute name="xml:base">
                <data type="anyURI"/>
            </attribute>
        </optional>
    </define>


    <define name="def_title-element">
        <element name="title">
            <ref name="xml_base-attribute"/>
            <text/>
        </element>
    </define>


    <define name="def_creator-element">
        <element name="creator">
            <ref name="xml_base-attribute"/>
            <text/>
        </element>
    </define>


    <define name="def_annotation-element">
        <element name="annotation">
            <ref name="xml_base-attribute"/>
            <text/>
        </element>
    </define>


    <define name="def_info-element">
        <element name="info">
            <ref name="xml_base-attribute"/>
            <data type="anyURI"/>
        </element>
    </define>


    <define name="def_location-element">
        <element name="location">
            <ref name="xml_base-attribute"/>
            <data type="anyURI"/>
        </element>
    </define>


    <define name="def_identifier-element">
        <element name="identifier">
            <ref name="xml_base-attribute"/>
            <data type="anyURI"/>
        </element>
    </define>


    <define name="def_image-element">
        <element name="image">
            <ref name="xml_base-attribute"/>
            <data type="anyURI"/>
        </element>
    </define>


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

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


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

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


    <define name="def_extension-element">
        <element name="extension">
            <attribute name="application">
                <data type="anyURI"/>
            </attribute>
            <ref name="xml_base-attribute"/>

            <zeroOrMore>
                <choice>
                    <element>
                        <anyName/>
                        <ref name="def_anything"/>
                    </element>
                    <text/>
                </choice>
            </zeroOrMore>
        </element>
    </define>


    <define name="def_playlist-element">
        <element name="playlist">
            <attribute name="version">
                <data type="string">
                    <param name="pattern">1</param>
                </data>
            </attribute>
            <ref name="xml_base-attribute"/>

            <interleave>
                <optional>
                    <ref name="def_title-element"/>
                </optional>
                <optional>
                    <ref name="def_creator-element"/>
                </optional>
                <optional>
                    <ref name="def_annotation-element"/>
                </optional>
                <optional>
                    <ref name="def_info-element"/>
                </optional>
                <optional>
                    <ref name="def_location-element"/>
                </optional>
                <optional>
                    <ref name="def_identifier-element"/>
                </optional>
                <optional>
                    <ref name="def_image-element"/>
                </optional>
                <optional>
                    <element name="date">
                        <ref name="xml_base-attribute"/>
                        <data type="dateTime"/>
                    </element>
                </optional>
                <optional>
                    <element name="license">
                        <ref name="xml_base-attribute"/>
                        <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>
                <zeroOrMore>
                    <ref name="def_extension-element"/>
                </zeroOrMore>

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


    <define name="def_attribution-element">
        <element name="attribution">
            <ref name="xml_base-attribute"/>

            <zeroOrMore>
                <choice>
                    <ref name="def_identifier-element"/>
                    <ref name="def_location-element"/>
                </choice>
            </zeroOrMore>
        </element>
    </define>


    <define name="def_anything">
        <interleave>
            <zeroOrMore>
                <element>
                    <anyName/>
                    <ref name="def_anything"/>
                </element>
            </zeroOrMore>

            <zeroOrMore>
                <attribute>
                    <anyName/>
                </attribute>
            </zeroOrMore>

            <zeroOrMore>
                <text/>
            </zeroOrMore>
        </interleave>
    </define>


    <define name="def_track-element">
        <element name="track">
            <ref name="xml_base-attribute"/>

            <interleave>
                <zeroOrMore>
                    <ref name="def_location-element"/>
                </zeroOrMore>
                <zeroOrMore>
                    <ref name="def_identifier-element"/>
                </zeroOrMore>

                <optional>
                    <ref name="def_title-element"/>
                </optional>
                <optional>
                    <ref name="def_creator-element"/>
                </optional>
                <optional>
                    <ref name="def_annotation-element"/>
                </optional>
                <optional>
                    <ref name="def_info-element"/>
                </optional>
                <optional>
                    <ref name="def_image-element"/>
                </optional>
                <optional>
                    <element name="album">
                        <ref name="xml_base-attribute"/>
                        <text/>
                    </element>
                </optional>
                <optional>
                    <element name="trackNum">
                        <ref name="xml_base-attribute"/>
                        <data type="nonNegativeInteger"/>
                    </element>
                </optional>
                <optional>
                    <element name="duration">
                        <ref name="xml_base-attribute"/>
                        <data type="nonNegativeInteger"/>
                    </element>
                </optional>

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

</grammar>