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>