Service Web revendeur/Schéma pour les métadonnées à destination des revendeurs (format W3C)

Un article de DocuWiki.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <!-- default namespace = "http://revendeurs.immateriel.fr/metadata" -->
  <xs:element name="response">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="result"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="result">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="book"/>
      </xs:sequence>
      <xs:attributeGroup ref="result_type"/>
    </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="result_type">
    <xs:attribute name="type" use="required" type="result_type.datatype"/>
  </xs:attributeGroup>
  <xs:element name="book">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="book_content">
          <xs:attributeGroup ref="product_id"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="product_id">
    <xs:attribute name="isbn" use="required" type="ean.datatype"/>
  </xs:attributeGroup>
  <xs:complexType name="book_content">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="title"/>
      <xs:element ref="edition"/>
      <xs:element ref="publisher"/>
      <xs:group ref="avail"/>
      <xs:element ref="published_at"/>
      <xs:element ref="language"/>
      <xs:element ref="collection"/>
      <xs:element ref="summary"/>
      <xs:element ref="description"/>
      <xs:group ref="categories"/>
      <xs:element ref="previews"/>
      <xs:group ref="contributors"/>
      <xs:group ref="offres"/>
    </xs:choice>
    <xs:attributeGroup ref="avail"/>
    <xs:attributeGroup ref="offres"/>
  </xs:complexType>
  <xs:group name="avail">
    <xs:sequence>
      <xs:element minOccurs="0" ref="available"/>
    </xs:sequence>
  </xs:group>
  <xs:element name="available" type="boolean.datatype"/>
  <xs:attributeGroup name="avail">
    <xs:attribute name="available" type="boolean.datatype"/>
  </xs:attributeGroup>
  <xs:element name="title" type="xs:string"/>
  <xs:element name="edition">
    <xs:simpleType>
      <xs:union memberTypes="xs:positiveInteger">
        <xs:simpleType>
          <xs:restriction base="xs:token">
            <xs:length value="0"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:union>
    </xs:simpleType>
  </xs:element>
  <xs:element name="publisher">
    <xs:complexType mixed="true">
      <xs:attributeGroup ref="publisher_id"/>
    </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="publisher_id">
    <xs:attribute name="id" use="required"/>
  </xs:attributeGroup>
  <xs:element name="published_at" type="xs:date"/>
  <xs:element name="language" type="lang.datatype"/>
  <xs:element name="collection" type="xs:string"/>
  <xs:element name="summary" type="xs:string"/>
  <xs:element name="description" type="xs:string"/>
  <xs:group name="categories">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="keywords"/>
        <xs:element ref="subjects"/>
      </xs:choice>
    </xs:sequence>
  </xs:group>
  <xs:element name="keywords">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="keyword"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="keyword" type="xs:string"/>
  <xs:element name="subjects" abstract="true" type="bisac_code.datatype"/>
  <xs:element name="bisac_subject" substitutionGroup="subjects"/>
  <xs:element name="previews">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="preview"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="preview">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="link">
          <xs:attributeGroup ref="start"/>
          <xs:attributeGroup ref="end"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="start">
    <xs:attribute name="start_page" use="required" type="xs:positiveInteger"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="end">
    <xs:attribute name="end_page" use="required" type="xs:positiveInteger"/>
  </xs:attributeGroup>
  <xs:simpleType name="link">
    <xs:restriction base="xs:anyURI"/>
  </xs:simpleType>
  <xs:group name="contributors">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="authors"/>
        <xs:group ref="author_obsolete"/>
      </xs:choice>
    </xs:sequence>
  </xs:group>
  <xs:element name="authors">
    <xs:complexType>
      <xs:group maxOccurs="unbounded" ref="author"/>
    </xs:complexType>
  </xs:element>
  <xs:group name="author">
    <xs:sequence>
      <xs:element name="author">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element ref="name"/>
            <xs:element ref="biography"/>
          </xs:choice>
          <xs:attributeGroup ref="author_id"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:group>
  <xs:attributeGroup name="author_id">
    <xs:attribute name="id" use="required"/>
  </xs:attributeGroup>
  <xs:element name="name" type="xs:string"/>
  <xs:element name="biography" type="xs:string"/>
  <!-- simple variant provided for early adopters -->
  <xs:group name="author_obsolete">
    <xs:sequence>
      <xs:element name="author" type="xs:string"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="offres">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="products"/>
        <xs:group ref="obsolete_product"/>
      </xs:choice>
    </xs:sequence>
  </xs:group>
  <xs:attributeGroup name="offres">
    <xs:attributeGroup ref="obsolete_product"/>
  </xs:attributeGroup>
  <xs:element name="products">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="product"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="product">
    <xs:complexType>
      <xs:sequence>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:group ref="price"/>
          <xs:group ref="avail"/>
          <xs:group ref="label"/>
        </xs:choice>
        <xs:element ref="resources"/>
      </xs:sequence>
      <xs:attributeGroup ref="price"/>
      <xs:attributeGroup ref="avail"/>
      <xs:attributeGroup ref="product_id"/>
      <xs:attributeGroup ref="label"/>
    </xs:complexType>
  </xs:element>
  <!-- monoproduct variant provided for early adopters -->
  <xs:group name="obsolete_product">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="label"/>
        <xs:group ref="price"/>
        <xs:element ref="resources"/>
      </xs:choice>
    </xs:sequence>
  </xs:group>
  <xs:attributeGroup name="obsolete_product">
    <xs:attributeGroup ref="label"/>
    <xs:attributeGroup ref="price"/>
  </xs:attributeGroup>
  <xs:group name="label">
    <xs:sequence>
      <xs:element minOccurs="0" ref="label"/>
    </xs:sequence>
  </xs:group>
  <xs:element name="label" type="xs:string"/>
  <xs:attributeGroup name="label">
    <xs:attribute name="label"/>
  </xs:attributeGroup>
  <xs:group name="price">
    <xs:sequence>
      <xs:element minOccurs="0" ref="price"/>
    </xs:sequence>
  </xs:group>
  <xs:element name="price" type="price.datatype"/>
  <xs:attributeGroup name="price">
    <xs:attribute name="price" type="price.datatype"/>
  </xs:attributeGroup>
  <xs:element name="resources">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="resource"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="resource">
    <xs:complexType>
      <xs:attributeGroup ref="mime"/>
      <xs:attributeGroup ref="support"/>
      <xs:attribute name="protection" type="protection.datatype"/>
      <xs:attributeGroup ref="name"/>
      <xs:attributeGroup ref="format"/>
      <xs:attributeGroup ref="dim"/>
    </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="mime">
    <xs:attribute name="mimetype" use="required" type="mime.datatype"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="support">
    <xs:attribute name="support" use="required" type="support.datatype"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="protection">
    <xs:attribute name="protection" use="required" type="protection.datatype"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="name">
    <xs:attribute name="name" use="required"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="format">
    <xs:attribute name="format_key" use="required" type="format.datatype"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="dim">
    <xs:attribute name="height" type="dim.datatype"/>
    <xs:attribute name="width" type="dim.datatype"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="height">
    <xs:attribute name="height" use="required" type="dim.datatype"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="width">
    <xs:attribute name="width" use="required" type="dim.datatype"/>
  </xs:attributeGroup>
  <!-- Data types -->
  <xs:simpleType name="boolean.datatype">
    <xs:annotation>
      <xs:documentation/>
    </xs:annotation>
    <xs:restriction base="xs:token">
      <xs:enumeration value="true"/>
      <xs:enumeration value="false"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ean.datatype">
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:length value="17"/>
          <xs:pattern value="978-[\-0-9]{13}"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:length value="13"/>
          <xs:pattern value="978[0-9]{10}"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>
  <xs:simpleType name="lang.datatype">
    <xs:restriction base="xs:token">
      <xs:length value="2"/>
      <xs:pattern value="[a-zA-Z]{2}"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="price.datatype">
    <xs:restriction base="xs:decimal">
      <xs:minInclusive value="0"/>
      <xs:fractionDigits value="2"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="bisac_code.datatype">
    <xs:restriction base="xs:token">
      <xs:length value="9"/>
      <xs:pattern value="[a-zA-Z]{3}[0-9]{6}"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="mime.datatype">
    <xs:restriction base="xs:token">
      <xs:enumeration value="audio/mpeg3"/>
      <xs:enumeration value="application/pdf"/>
      <xs:enumeration value="text/html"/>
      <xs:enumeration value="application/x-mobipocket"/>
      <xs:enumeration value="application/epub+zip"/>
      <xs:enumeration value="application/x-rar-compressed"/>
      <xs:enumeration value="application/zip"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="support.datatype">
    <xs:restriction base="xs:token">
      <xs:enumeration value="immateriel"/>
      <xs:enumeration value="physical"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="result_type.datatype">
    <xs:restriction base="xs:token">
      <xs:enumeration value="Books"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="format.datatype">
    <xs:restriction base="xs:token">
      <xs:enumeration value="mp3"/>
      <xs:enumeration value="pdf"/>
      <xs:enumeration value="imr"/>
      <xs:enumeration value="prc"/>
      <xs:enumeration value="epub"/>
      <xs:enumeration value="html"/>
      <xs:enumeration value="rar"/>
      <xs:enumeration value="zip"/>
    </xs:restriction>
  </xs:simpleType>
  <!-- format.datatype = text -->
  <xs:simpleType name="protection.datatype">
    <xs:restriction base="xs:token">
      <xs:enumeration value="none"/>
      <xs:enumeration value="watermark"/>
      <xs:enumeration value="streaming"/>
      <xs:enumeration value="drm"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="dim.datatype">
    <xs:restriction base="xs:positiveInteger"/>
  </xs:simpleType>
</xs:schema>
Outils personnels