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

Un article de DocuWiki.

<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" 
         xmlns="http://relaxng.org/ns/structure/1.0" 
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <!-- default namespace = "http://revendeurs.immateriel.fr/metadata" -->
  <start>
    <a:documentation/>
    <!-- Metadata for resellers of digital offers from publishers -->
    <a:documentation/>
    <ref name="response"/>
  </start>
  <define name="response">
    <element name="response">
      <oneOrMore>
        <ref name="result"/>
      </oneOrMore>
    </element>
  </define>
  <define name="result">
    <element name="result">
      <ref name="result_type"/>
      <oneOrMore>
        <ref name="result_content"/>
      </oneOrMore>
    </element>
  </define>
  <define name="result_type">
    <attribute name="type">
      <ref name="result_type.datatype"/>
    </attribute>
  </define>
  <define name="result_content">
    <element name="book">
      <ref name="product_id"/>
      <ref name="book_content"/>
    </element>
  </define>
  <define name="product_id">
    <attribute name="isbn">
      <ref name="ean.datatype"/>
    </attribute>
  </define>
  <define name="book_content">
    <interleave>
      <ref name="title"/>
      <ref name="edition"/>
      <ref name="publisher"/>
      <ref name="avail"/>
      <ref name="pubdate"/>
      <optional>
        <ref name="lang"/>
      </optional>
      <optional>
        <ref name="collection"/>
      </optional>
      <optional>
        <ref name="summary"/>
      </optional>
      <optional>
        <ref name="description"/>
      </optional>
      <optional>
        <ref name="categories"/>
      </optional>
      <optional>
        <ref name="previews"/>
      </optional>
      <ref name="contributors"/>
      <ref name="offres"/>
    </interleave>
  </define>
  <define name="avail">
    <choice>
      <element name="available">
        <ref name="boolean.datatype"/>
      </element>
      <attribute name="available">
        <ref name="boolean.datatype"/>
      </attribute>
    </choice>
  </define>
  <define name="title">
    <element name="title">
      <text/>
    </element>
  </define>
  <define name="edition">
    <element name="edition">
      <optional>
        <data type="positiveInteger"/>
      </optional>
    </element>
  </define>
  <define name="publisher">
    <element name="publisher">
      <ref name="publisher_id"/>
      <text/>
    </element>
  </define>
  <define name="publisher_id">
    <attribute name="id">
      <ref name="publisher_id.datatype"/>
    </attribute>
  </define>
  <define name="pubdate">
    <element name="published_at">
      <data type="date"/>
    </element>
  </define>
  <define name="lang">
    <element name="language">
      <ref name="lang.datatype"/>
    </element>
  </define>
  <define name="collection">
    <element name="collection">
      <text/>
    </element>
  </define>
  <define name="summary">
    <element name="summary">
      <text/>
    </element>
  </define>
  <define name="description">
    <element name="description">
      <text/>
    </element>
  </define>
  <define name="categories">
    <interleave>
      <optional>
        <ref name="keywords"/>
      </optional>
      <optional>
        <ref name="subjects"/>
      </optional>
    </interleave>
  </define>
  <define name="keywords">
    <element name="keywords">
      <oneOrMore>
        <ref name="keyword"/>
      </oneOrMore>
    </element>
  </define>
  <define name="keyword">
    <element name="keyword">
      <text/>
    </element>
  </define>
  <define name="subjects">
    <ref name="bisac_code"/>
  </define>
  <define name="bisac_code">
    <element name="bisac_subject">
      <ref name="bisac_code.datatype"/>
    </element>
  </define>
  <define name="previews">
    <element name="previews">
      <oneOrMore>
        <ref name="preview"/>
      </oneOrMore>
    </element>
  </define>
  <define name="preview">
    <element name="preview">
      <interleave>
        <ref name="start"/>
        <ref name="end"/>
      </interleave>
      <ref name="link"/>
    </element>
  </define>
  <define name="start">
    <attribute name="start_page">
      <data type="positiveInteger"/>
    </attribute>
  </define>
  <define name="end">
    <attribute name="end_page">
      <data type="positiveInteger"/>
    </attribute>
  </define>
  <define name="link">
    <data type="anyURI"/>
  </define>
  <define name="contributors">
    <interleave>
      <ref name="authors"/>
      <oneOrMore>
        <ref name="author_obsolete"/>
      </oneOrMore>
    </interleave>
  </define>
  <define name="authors">
    <element name="authors">
      <oneOrMore>
        <ref name="author"/>
      </oneOrMore>
    </element>
  </define>
  <define name="author">
    <element name="author">
      <ref name="author_id"/>
      <interleave>
        <ref name="author_name"/>
        <optional>
          <ref name="author_bio"/>
        </optional>
      </interleave>
    </element>
  </define>
  <define name="author_id">
    <attribute name="id">
      <ref name="author_id.datatype"/>
    </attribute>
  </define>
  <define name="author_name">
    <element name="name">
      <text/>
    </element>
  </define>
  <define name="author_bio">
    <element name="biography">
      <text/>
    </element>
  </define>
  <!-- simple variant provided for early adopters -->
  <define name="author_obsolete">
    <element name="author">
      <text/>
    </element>
  </define>
  <define name="offres">
    <interleave>
      <ref name="products"/>
      <ref name="obsolete_product"/>
    </interleave>
  </define>
  <define name="products">
    <element name="products">
      <oneOrMore>
        <ref name="product"/>
      </oneOrMore>
    </element>
  </define>
  <define name="product">
    <element name="product">
      <interleave>
        <ref name="price"/>
        <ref name="avail"/>
        <ref name="product_id"/>
        <ref name="label"/>
      </interleave>
      <ref name="resources"/>
    </element>
  </define>
  <!-- monoproduct variant provided for early adopters -->
  <define name="obsolete_product">
    <interleave>
      <ref name="label"/>
      <ref name="price"/>
      <ref name="resources"/>
    </interleave>
  </define>
  <define name="label">
    <choice>
      <element name="label">
        <text/>
      </element>
      <attribute name="label"/>
    </choice>
  </define>
  <define name="price">
    <choice>
      <element name="price">
        <ref name="price.datatype"/>
      </element>
      <attribute name="price">
        <ref name="price.datatype"/>
      </attribute>
    </choice>
  </define>
  <define name="resources">
    <element name="resources">
      <oneOrMore>
        <ref name="resource"/>
      </oneOrMore>
    </element>
  </define>
  <define name="resource">
    <element name="resource">
      <interleave>
        <ref name="mime"/>
        <ref name="support"/>
        <optional>
          <ref name="protection"/>
        </optional>
        <ref name="name"/>
        <ref name="format"/>
        <optional>
          <ref name="dim"/>
        </optional>
        <empty/>
      </interleave>
    </element>
  </define>
  <define name="mime">
    <attribute name="mimetype">
      <ref name="mime.datatype"/>
    </attribute>
  </define>
  <define name="support">
    <attribute name="support">
      <ref name="support.datatype"/>
    </attribute>
  </define>
  <define name="protection">
    <attribute name="protection">
      <ref name="protection.datatype"/>
    </attribute>
  </define>
  <define name="name">
    <attribute name="name"/>
  </define>
  <define name="format">
    <attribute name="format_key">
      <ref name="format.datatype"/>
    </attribute>
  </define>
  <define name="dim">
    <interleave>
      <optional>
        <ref name="height"/>
      </optional>
      <optional>
        <ref name="width"/>
      </optional>
    </interleave>
  </define>
  <define name="height">
    <attribute name="height">
      <ref name="dim.datatype"/>
    </attribute>
  </define>
  <define name="width">
    <attribute name="width">
      <ref name="dim.datatype"/>
    </attribute>
  </define>
  <!-- Data types -->
  <define name="boolean.datatype">
    <a:documentation/>
    <choice>
      <value>true</value>
      <value>false</value>
    </choice>
  </define>
  <define name="ean.datatype">
    <choice>
      <data type="token">
        <param name="length">17</param>
        <param name="pattern">978-[\-0-9]{13}</param>
      </data>
      <data type="token">
        <param name="length">13</param>
        <param name="pattern">978[0-9]{10}</param>
      </data>
    </choice>
  </define>
  <define name="lang.datatype">
    <data type="token">
      <param name="length">2</param>
      <param name="pattern">[a-zA-Z]{2}</param>
    </data>
  </define>
  <define name="price.datatype">
    <data type="decimal">
      <param name="minInclusive">0</param>
      <param name="fractionDigits">2</param>
    </data>
  </define>
  <define name="bisac_code.datatype">
    <data type="token">
      <param name="length">9</param>
      <param name="pattern">[a-zA-Z]{3}[0-9]{6}</param>
    </data>
  </define>
  <define name="mime.datatype">
    <choice>
      <value>audio/mpeg3</value>
      <value>application/pdf</value>
      <value>text/html</value>
      <value>application/x-mobipocket</value>
      <value>application/epub+zip</value>
      <value>application/x-rar-compressed</value>
      <value>application/zip</value>
    </choice>
  </define>
  <define name="support.datatype">
    <choice>
      <value>immateriel</value>
      <value>physical</value>
    </choice>
  </define>
  <define name="result_type.datatype">
    <value>Books</value>
  </define>
  <define name="format.datatype">
    <choice>
      <value>mp3</value>
      <value>pdf</value>
      <value>imr</value>
      <value>prc</value>
      <value>epub</value>
      <value>html</value>
      <value>zip</value>
      <value>rar</value>
    </choice>
  </define>
  <!-- format.datatype = text -->
  <define name="protection.datatype">
    <choice>
      <value>none</value>
      <value>watermark</value>
      <value>streaming</value>
      <value>drm</value>
    </choice>
  </define>
  <define name="publisher_id.datatype">
    <text/>
  </define>
  <define name="author_id.datatype">
    <text/>
  </define>
  <define name="dim.datatype">
    <data type="positiveInteger"/>
  </define>
</grammar>
Outils personnels