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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">

  <xs:annotation>
    <xs:documentation>
      This is the Canadian Metadata Repository (CMR) intermediate metadata
      format. It is intended to provide a common, normalized container
      format for a variety of metadata, which can be readily transformed
      into a wide variety of application-specific formats, in particular,
      Solr database records.

      Version: 1.0
      Date: 2010-07-19
    </xs:documentation>
  </xs:annotation>

  <xs:element name="recordset">
    <xs:complexType>
      <xs:sequence>

        <!-- Record -->
        <xs:element name="record" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>

              <!-- Required control fields -->
              <xs:element name="type">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="collection"/>
                    <xs:enumeration value="serial"/>
                    <xs:enumeration value="issue"/>
                    <xs:enumeration value="monograph"/>
                    <xs:enumeration value="page"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="contributor" type="lcalpha"/>
              <xs:element name="key" type="key"/>
              <xs:element name="label" type="text"/>

              <!-- Optional control fields -->
              <xs:element name="pkey" type="key" minOccurs="0"/>
              <xs:element name="gkey" type="key" minOccurs="0" maxOccurs="unbounded"/>
              <xs:element name="seq" type="xs:positiveInteger" minOccurs="0"/>
              <xs:element name="pubdate" minOccurs="0">
                <xs:complexType>
                  <xs:attribute name="min" type="iso8601" use="required"/>
                  <xs:attribute name="max" type="iso8601" use="required"/>
                </xs:complexType>
              </xs:element>
              <xs:element name="lang" type="iso639-3" minOccurs="0" maxOccurs="unbounded"/>
              <xs:element name="media" minOccurs="0" maxOccurs="unbounded">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="audio"/>
                    <xs:enumeration value="data"/>
                    <xs:enumeration value="image"/>
                    <xs:enumeration value="plaintext"/>
                    <xs:enumeration value="text"/>
                    <xs:enumeration value="video"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>

              <!-- Description and content: fields may appear in any quantity and order -->
              <xs:element name="description">
                <xs:complexType>
                  <xs:group ref="descriptionFields" minOccurs="0" maxOccurs="unbounded"/>
                </xs:complexType>
              </xs:element>

              <!-- Resource links: some of these are required -->
              <xs:element name="resource">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="canonicalUri" type="xs:anyURI"/>
                    <xs:element name="canonicalPreviewUri" type="xs:anyURI" minOccurs="0"/>
                    <xs:element name="canonicalMaster" type="resource" minOccurs="0"/>
                    <xs:element name="canonicalDownload" type="resource" minOccurs="0"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>

            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="version" type="xs:decimal" use="required" fixed="1.0"/>
    </xs:complexType>
  </xs:element>

  <!-- Description fields -->
  <xs:group name="descriptionFields">
    <xs:choice>
        <xs:element name="title" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="text">
                <xs:attribute name="lang" type="iso639-3" use="optional"/>
                <xs:attribute name="type" use="optional">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <xs:enumeration value="main"/>
                      <xs:enumeration value="uniform"/>
                    </xs:restriction>
                  </xs:simpleType>
                </xs:attribute>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>

        <xs:element name="author" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="text">
                <xs:attribute name="lang" type="iso639-3" use="optional"/>
                <xs:attribute name="type" use="optional">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <xs:enumeration value="editor"/>
                    </xs:restriction>
                  </xs:simpleType>
                </xs:attribute>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>

        <xs:element name="publication" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="text">
                <xs:attribute name="lang" type="iso639-3" use="optional"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>

        <xs:element name="subject" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="text">
                <xs:attribute name="lang" type="iso639-3" use="optional"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>

        <xs:element name="note" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="text">
                <xs:attribute name="lang" type="iso639-3" use="optional"/>
                <xs:attribute name="type" use="optional">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <xs:enumeration value="continued"/>
                      <xs:enumeration value="continues"/>
                      <xs:enumeration value="extent"/>
                      <xs:enumeration value="frequency"/>
                      <xs:enumeration value="missing"/>
                      <xs:enumeration value="rights"/>
                      <xs:enumeration value="source"/>
                    </xs:restriction>
                  </xs:simpleType>
                </xs:attribute>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>

        <xs:element name="descriptor" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="text">
                <xs:attribute name="lang" type="iso639-3" use="optional"/>
                <xs:attribute name="type" use="optional">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <xs:enumeration value="corporate"/>
                      <xs:enumeration value="date"/>
                      <xs:enumeration value="location"/>
                      <xs:enumeration value="person"/>
                    </xs:restriction>
                  </xs:simpleType>
                </xs:attribute>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>

        <xs:element name="text" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="text">
                <xs:attribute name="lang" type="iso639-3" use="optional"/>
                <xs:attribute name="type" use="optional">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <xs:enumeration value="content"/>
                      <xs:enumeration value="description"/>
                    </xs:restriction>
                  </xs:simpleType>
                </xs:attribute>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        
    </xs:choice>
  </xs:group>

  <!-- Types -->

  <xs:complexType name="resource">
    <xs:simpleContent>
      <xs:extension base="text">
        <xs:attribute name="mime" type="mime" use="required"/>
        <xs:attribute name="size" type="xs:positiveInteger" use="optional"/>
        <xs:attribute name="md5" type="md5digest" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:simpleType name="iso639-3">
    <xs:restriction base="xs:string">
      <xs:pattern value="[a-z]{3}"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="iso8601">
    <xs:restriction base="xs:dateTime">
      <xs:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}Z"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="key">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Za-z0-9_.-]{1,127}"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="text">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="lcalpha">
    <xs:restriction base="xs:string">
      <xs:pattern value="[a-z]+"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="md5digest">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9a-f]{32}"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="mime">
    <xs:restriction base="xs:string">
      <xs:enumeration value="application/pdf"/>
      <xs:enumeration value="image/jpeg"/>
      <xs:enumeration value="image/tiff"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>

