[Playlist] portability, application page, schema files

Matthias Friedrich matt at mafr.de
Sun Jan 7 12:18:28 UTC 2007


On Saturday, 2007-01-06, Sebastian Pipping wrote:
> I wrote a Bash script for Cygwin to test both new schema files
> against the libSpiff test suite using xmlstarlet.

> This way I found out that the RNG schema says "valid" much
> too often. What irritates me is that this is also the case
> where version is set to "0" although the RNG file
> reads <param name="pattern">1</param> for version.
> Is this a problem in the RNG file or in xmlstarlet?

There was in fact one bug in the RNG schema: The "info" elements were
declared as "text", while they should have been "anyURI". This has
been fixed in the appended schema files.

I checked your test suite against the schemas and I can't reproduce
your problems:

$ xmlstarlet --version
1.0.1
$ cd libspiff-0.5.2/test/fail
$ xmlstarlet val --list-good -r /tmp/xspf-1_0.3.rng *.xspf
$ cd ../pass
$ xmlstarlet val --list-bad -r /tmp/xspf-1.rng *.xspf
$

Your script looks good, so probably there's a problem with your setup,
either with xmlstarlet itself or one of the libraries it uses.

Cheers,
	Matthias
-------------- next part --------------
<?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 at mafr.de>

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

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


     ChangeLog:
	  * 2007-01-07: The info element's content has been changed from
                        type "text" to "anyURI", as per spec.
          * 2006-09-25: Fixed an error: the "attribution" element now allows
			"identifier" child element elements, too.
     ================================================================== -->


<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">1</param>
                </data>
            </attribute>

            <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>
            <zeroOrMore>
                <ref name="def_extension-element"/>
            </zeroOrMore>

            <element name="trackList">
                <zeroOrMore>
                    <ref name="def_track-element"/>
                </zeroOrMore>
            </element>
        </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_extension-element">
        <element name="extension">
            <attribute name="application">
                <data type="anyURI"/>
            </attribute>

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


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


    <define name="def_track-element">
        <element name="track">
            <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>
            <zeroOrMore>
                <ref name="def_extension-element"/>
            </zeroOrMore>
        </element>
    </define>

</grammar>
-------------- next part --------------
<?xml version="1.0" encoding="UTF-8"?>

<!-- ==================================================================
     XML 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 at mafr.de>

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

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


     ChangeLog:
          * 2005-10-12: Fixed an error: the "extension" element now
			has an "application" attribute, like in the spec.
          * 2006-09-25: Fixed an error: the "attribution" element now allows
			"identifier" child element elements, too.
     ================================================================== -->

<xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
            xmlns:xspf = "http://xspf.org/ns/0/"
            targetNamespace="http://xspf.org/ns/0/"
	    elementFormDefault="qualified"
	    attributeFormDefault="unqualified">

<xsd:element name="playlist" type="xspf:PlaylistType"/>

<xsd:complexType name="PlaylistType">
  <xsd:sequence>
    <xsd:element name="title" type="xsd:string" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="creator" type="xsd:string" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="annotation" type="xsd:string" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="info" type="xsd:anyURI" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="location" type="xsd:anyURI" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="identifier" type="xsd:anyURI" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="image" type="xsd:anyURI" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="date" type="xsd:dateTime" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="license" type="xsd:anyURI" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="attribution" type="xspf:AttributionType" minOccurs="0" maxOccurs="1"/>

    <xsd:element name="link" type="xspf:LinkType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="meta" type="xspf:MetaType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="extension" type="xspf:ExtensionType" minOccurs="0" maxOccurs="unbounded"/>

    <xsd:element name="trackList" type="xspf:TrackListType" minOccurs="1" maxOccurs="1"/>
  </xsd:sequence>
  <xsd:attribute name="version" type="xspf:VersionType" use="required"/>
</xsd:complexType>

<xsd:simpleType name="VersionType">
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="1"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="AttributionType">
  <xsd:choice minOccurs="0" maxOccurs="unbounded">
    <xsd:element name="identifier" type="xsd:anyURI"/>
    <xsd:element name="location" type="xsd:anyURI"/>
  </xsd:choice>
</xsd:complexType>

<xsd:complexType name="LinkType">
  <xsd:simpleContent>
    <xsd:extension base="xsd:anyURI">
      <xsd:attribute name="rel" type="xsd:anyURI" use="required"/>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="MetaType">
  <xsd:simpleContent>
    <xsd:extension base="xsd:string">
      <xsd:attribute name="rel" type="xsd:anyURI" use="required"/>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="ExtensionType">
  <xsd:complexContent mixed="true">
    <xsd:restriction base="xsd:anyType">
      <xsd:sequence>
        <xsd:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="application" type="xsd:anyURI" use="required"/>
    </xsd:restriction>
  </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="TrackListType">
  <xsd:sequence>
    <xsd:element name="track" type="xspf:TrackType" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="TrackType">
  <xsd:sequence>
    <xsd:element name="location" type="xsd:anyURI" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="identifier" type="xsd:anyURI" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="title" type="xsd:string" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="creator" type="xsd:string" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="annotation" type="xsd:string" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="info" type="xsd:anyURI" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="image" type="xsd:anyURI" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="album" type="xsd:string" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="trackNum" type="xsd:nonNegativeInteger" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="duration" type="xsd:nonNegativeInteger" minOccurs="0" maxOccurs="1"/>

    <xsd:element name="link" type="xspf:LinkType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="meta" type="xspf:MetaType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="extension" type="xspf:ExtensionType" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>

</xsd:schema>


More information about the Playlist mailing list