<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.nexml.org/1.0"
    xmlns="http://www.nexml.org/1.0">
    <xs:annotation>
        <xs:documentation>
            This module defines subclasses of the dictionaries
            defined in the <a href="../annotations">annotations</a>
            module. The subclasses are used to attach metadata about
            revision control status of a file (the RCS* types), 
            <a href="http://dublincore.org/">dublin core</a> metadata
            and common web formats (XHTML, RSS).            
        </xs:documentation>
    </xs:annotation>
    <xs:include schemaLocation="annotations.xsd"/>  

    <!-- a simple key/value pair, where key 
    *must* be <key>date</key>, and value
    must be of the pattern 
    <string>$Date: [svn date here]$</string> -->
    <xs:simpleType name="DateKey">
        <xs:restriction base="xs:string">
            <xs:pattern value="date"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="DateVal">
        <xs:restriction base="xs:string">
            <xs:pattern value="$Date: .*$"/>
        </xs:restriction>
    </xs:simpleType> 
    <xs:complexType name="RCSDate">
        <xs:annotation>
            <xs:documentation>
                a simple key/value pair, where key 
                <em>must</em> be /^date$/, and value
                must be of the pattern 
                /^$Date: .*\$$/
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="Dict">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="key" type="DateKey" minOccurs="1" maxOccurs="1"/>
                    <xs:element name="string" type="DateVal" minOccurs="1" maxOccurs="1"/>                  
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>       

    <!-- same thing for svn $Rev: $ -->
    <xs:simpleType name="RevKey">
        <xs:restriction base="xs:string">
            <xs:pattern value="rev"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="RevVal">
        <xs:restriction base="xs:string">
            <xs:pattern value="$Rev: .*$"/>
        </xs:restriction>
    </xs:simpleType>  
    <xs:complexType name="RCSRev">
        <xs:annotation>
            <xs:documentation>
                a simple key/value pair, where key 
                <em>must</em> be /^rev$/, and value
                must be of the pattern 
                /^$Rev: .*\$$/
            </xs:documentation>
        </xs:annotation>        
        <xs:complexContent>
            <xs:restriction base="Dict">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="key" type="RevKey" minOccurs="1" maxOccurs="1"/>
                    <xs:element name="string" type="RevVal" minOccurs="1" maxOccurs="1"/>                  
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType> 

    <!-- same thing for svn $Author: $ -->
    <xs:simpleType name="AuthorKey">
        <xs:restriction base="xs:string">
            <xs:pattern value="author"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="AuthorVal">
        <xs:restriction base="xs:string">
            <xs:pattern value="$Author: .*$"/>
        </xs:restriction>
    </xs:simpleType>    
    <xs:complexType name="RCSAuthor">
        <xs:annotation>
            <xs:documentation>
                a simple key/value pair, where key 
                <em>must</em> be /^author$/, and value
                must be of the pattern 
                /^$Author: .*\$$/
            </xs:documentation>
        </xs:annotation>        
        <xs:complexContent>
            <xs:restriction base="Dict">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="key" type="AuthorKey" minOccurs="1" maxOccurs="1"/>
                    <xs:element name="string" type="AuthorVal" minOccurs="1" maxOccurs="1"/>                  
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>     

    <!-- same thing for svn $URL: $ -->
    <xs:simpleType name="URLKey">
        <xs:restriction base="xs:string">
            <xs:pattern value="url"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="URLVal">
        <xs:restriction base="xs:string">
            <xs:pattern value="$URL: .*$"/>
        </xs:restriction>
    </xs:simpleType> 
    <xs:complexType name="RCSURL">
        <xs:annotation>
            <xs:documentation>
                a simple key/value pair, where key 
                <em>must</em> be /^url$/, and value
                must be of the pattern 
                /^$URL: .*\$$/
            </xs:documentation>
        </xs:annotation>         
        <xs:complexContent>
            <xs:restriction base="Dict">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="key" type="URLKey" minOccurs="1" maxOccurs="1"/>
                    <xs:element name="string" type="URLVal" minOccurs="1" maxOccurs="1"/>                  
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>        

    <!-- same thing for svn $Id: $ -->
    <xs:simpleType name="IdKey">
        <xs:restriction base="xs:string">
            <xs:pattern value="id"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="IdVal">
        <xs:restriction base="xs:string">
            <xs:pattern value="$Id: .*$"/>
        </xs:restriction>
    </xs:simpleType> 
    <xs:complexType name="RCSId">
        <xs:annotation>
            <xs:documentation>
                a simple key/value pair, where key 
                <em>must</em> be /^id$/, and value
                must be of the pattern 
                /^$Id: .*\$$/
            </xs:documentation>
        </xs:annotation>         
        <xs:complexContent>
            <xs:restriction base="Dict">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="key" type="IdKey" minOccurs="1" maxOccurs="1"/>
                    <xs:element name="string" type="IdVal" minOccurs="1" maxOccurs="1"/>                  
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>        

    <!-- same thing for svn $Header: $ -->
    <xs:simpleType name="HeaderKey">
        <xs:restriction base="xs:string">
            <xs:pattern value="header"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="HeaderVal">
        <xs:restriction base="xs:string">
            <xs:pattern value="$Header: .*$"/>
        </xs:restriction>
    </xs:simpleType>  
    <xs:complexType name="RCSHeader">
        <xs:annotation>
            <xs:documentation>
                a simple key/value pair, where key 
                <em>must</em> be /^header$/, and value
                must be of the pattern 
                /^$Header: .*\$$/
            </xs:documentation>
        </xs:annotation>         
        <xs:complexContent>
            <xs:restriction base="Dict">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="key" type="HeaderKey" minOccurs="1" maxOccurs="1"/>
                    <xs:element name="string" type="HeaderVal" minOccurs="1" maxOccurs="1"/>                  
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>

    <!-- this is just syntax sugar to indicate that 
        the elements within the <any> tag are
        Dublin Core metadata -->
    <xs:simpleType name="DCKey">
        <xs:restriction base="xs:string">
            <xs:pattern value="dublincore"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="DCAny">
        <xs:complexContent>
            <xs:extension base="Base">
                <xs:sequence>
                    <xs:any 
                        namespace="http://purl.org/dc/elements/1.1/ http://purl.org/dc/terms/ http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
                        processContents="lax" 
                        minOccurs="0" 
                        maxOccurs="unbounded"/>
                </xs:sequence>                
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="DC">
        <xs:complexContent>
            <xs:restriction base="Dict">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="key" type="DCKey" minOccurs="1" maxOccurs="1"/>
                    <xs:element name="any" type="DCAny" minOccurs="1" maxOccurs="1"/>                                     
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <!-- this is a wrapper around XHTML -->
    <xs:simpleType name="XHTMLKey">
        <xs:restriction base="xs:string">
            <xs:pattern value="xhtml"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="XHTMLAny">
        <xs:complexContent>
            <xs:extension base="Base">
                <xs:sequence>
                    <xs:any 
                        namespace="http://www.w3.org/1999/xhtml" 
                        processContents="lax" 
                        minOccurs="0" 
                        maxOccurs="unbounded"/>
                </xs:sequence>                
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="XHTML">
        <xs:complexContent>
            <xs:restriction base="Dict">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="key" type="XHTMLKey" minOccurs="1" maxOccurs="1"/>
                    <xs:element name="any" type="XHTMLAny"/>                                      
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>    

    <!-- this is a wrapper around RSS -->
    <xs:simpleType name="RSSKey">
        <xs:restriction base="xs:string">
            <xs:pattern value="rss"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="RSSAny">
        <xs:complexContent>
            <xs:extension base="Base">
                <xs:sequence>
                    <xs:any 
                        namespace="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
                        processContents="lax" 
                        minOccurs="0" 
                        maxOccurs="unbounded"/>
                </xs:sequence>                  
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="RSS">
        <xs:complexContent>
            <xs:restriction base="Dict">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="key" type="RSSKey" minOccurs="1" maxOccurs="1"/>
                    <xs:element name="any" type="RSSAny" form="unqualified"/>                 
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType> 

</xs:schema>
