<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
  "/usr/share/xml/docbook/schema/dtd/4.4/docbookx.dtd">
<article>
  <articleinfo>
    <title>TD-2 : Espaces de noms</title>
    <subtitle>D'après un TD de Jacques Lemordant.</subtitle>
    <author>
      <firstname>Benoît</firstname>
      <surname>Valiron</surname>
    </author>
  </articleinfo>
  <sect1>
    <title>Déclaration d'un espace de noms</title>
    <para>
      Ce document n'est pas correct car le préfixe <code>fact</code>
      n'est pas défini. Corrigez-le.
      <programlisting><![CDATA[<?xml version="1.0" encoding="ISO-8859-1" ?>
<fact:facture>
<fact:montant>10$</fact:montant>
<fact:nom>Jean</fact:nom>
</fact:facture>]]></programlisting>
    </para>
  </sect1>
  <sect1>
    <title>Appartenance à un espace de noms</title>
    <para>
    <orderedlist>
      <listitem>
        <para>
          Quel est l'espace de noms de
        l'élément <code>fact:montant</code> dans l'exemple suivant
        <programlisting><![CDATA[<?xml version="1.0" encoding="ISO-8859-1" ?>
<fact:facture xmlns:fact="http://www.domaine.com/facture">
<fact:facture xmlns:fact="http://www.domaine.com/facture2">
</fact:facture>
<fact:montant />
</fact:facture>]]></programlisting>
        </para>
      </listitem>
      <listitem>
        <para>On considère le document suivant:
          <programlisting><![CDATA[<?xml version="1.0"?>
<recherche 
     xmlns="http://www.google.com/"
     xmlns:yahoo="http://www.yahoo.com/">
<mots-clefs xmlns="http://www.yahoo.com/"> 
  fraise, orange
</mots-clefs>
<yahoo:mot xmlns:yahoo2="http://www.yahoo.com/">
  <nombre>3</nombre>
</yahoo:mot>
</recherche>]]></programlisting>
        <orderedlist>
          <listitem><para>À quel espace de noms, identifié par son
          URI, est-ce que l'élément <code>mots-clefs</code>
          appartient?</para></listitem>
          <listitem><para>À quel espace de noms, identifié par son
          URI, est-ce que l'élément <code>recherche</code>
          appartient?</para></listitem>
          <listitem><para>À quel espace de noms, identifié par son
          URI, est-ce que l'élément <code>yahoo:mot</code>
          appartient?</para></listitem>
          <listitem><para>À quel espace de noms, identifié par son
          URI, est-ce que l'élément <code>nombre</code>
          appartient?</para></listitem>
          <listitem><para>Combien y a-t-il d'espaces de noms dans ce
          document?</para></listitem>
        </orderedlist>
        </para>
      </listitem>
    </orderedlist>
    </para>
  </sect1>
  <sect1>
    <title>Usage incorrect des espaces de noms</title>
    <para>
    Corriger le document suivant:
    <programlisting><![CDATA[<?xml version="1.0" encoding="ISO-8859-1" ?>
<expedition>
<fact:facture xmlns:fact="http://www.domaine.com/facture">
</fact:facture>
<fact:nom></fact:nom>
</expedition>]]></programlisting>
    </para>
  </sect1>



  <sect1>
    <title>Document composite</title>
    <orderedlist>
    <listitem>
    <para>
      Un flot de donnée peut être encodé en format RSS. Une DTD
      simplifiée pour ce format est la suivante.

      <programlisting><![CDATA[<!ELEMENT rss (channel+)>
<!ELEMENT channel  (title, description, item*)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT item (title|pubDate|description)*>
<!ELEMENT pubDate (#PCDATA)>]]></programlisting>
      
      Chaque <code>channel</code> correspond à une liste de données,
      avec un titre, une description et les données, une
      par <code>item</code>.
    </para>
    <para>
      Ecrivez un flux RSS contenant votre liste de
      cours. Chaque <code>item</code> contiendra un nom de cours.
    </para>
    </listitem>
    <listitem>
      <para>
      Le format Dublin Core peut être utilisé pour encoder des données
      telles qu'un nom, un titre, une description... Le format donne
      le nom d'entités standardisés, l'utilisation du nom de
      domaine <code>http://purl.org/dc/elements/1.1/</code> étant
      suffisante pour donner un sens aux éléments. Une DTD pour
      quelques éléments serait comme suit :
      
      <programlisting><![CDATA[<!ELEMENT title (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT language (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT subject (#PCDATA)>]]></programlisting>
      
      Le site <code>tel.archives-ouvertes.fr</code> propose d'exporter
      des listes de thèses au format RSS, en utilisant le format
      Dublin Core pour encoder les données de la thèse (en particulier
      ceux de la liste du dessus). Dans le format donné, les éléments
      Dublin Core sont fils de <code>item</code>.
      
      <orderedlist>
        <listitem>
          <para>
            Écrire un document RSS qui pourrait être produit, en
            incluant deux thèses.
          </para>
          <para>
            Sans inclure les espaces de noms, quel problème risque
            d'être rencontré ?
          </para>
          <para>
            Utilisez les espaces de
            noms <code>http://inf356.monoidal.net/monRSS</code> (il
            n'y a pas d'espace de nom par défaut pour RSS) et
            <code>http://purl.org/dc/elements/1.1/</code> pour les
            résoudre.
          </para>
        </listitem>
        <listitem>
          <para>Créez une DTD validant le fichier.</para>
          <note><title>Note</title><para>En TP vous allez reprendre
          cet exercice avec un fichier issu du site.</para></note>
        </listitem>
      </orderedlist>
    </para>
    </listitem>
    </orderedlist>
  </sect1>
  <sect1>
    <title>Simplification par héritage</title>
    <para>
      On demande de supprimer tous les préfixes inutiles.
      <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?> 
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
         xmlns:pcv="http://prismstandard.org/namespaces/pcv/1.0/" 
         xmlns:dc="http://purl.org/dc/elements/1.1/">

<rdf:Description 
   rdf:about="http://wanderlust.com/2000/08/Corfu.jpg"> 
  <dc:identifier 
     rdf:resource="http://wanderlust.com/content/2357845" /> 
  <dc:creator> 
    <pcv:Descriptor rdf:about="http://wanderlust.com/emp3845"> 
      <pcv:label>John Peterson </pcv:label> 
    </pcv:Descriptor> 
  </dc:creator> 
  <dc:coverage> 
    <pcv:Descriptor 
    rdf:about="http://prismstandard.org/vocabs/ISO-3166/GR"> 
      <pcv:label xml:lang="en">Greece</pcv:label> 
      <pcv:label xml:lang="fr">Grece</pcv:label> 
    </pcv:Descriptor> 
  </dc:coverage> 
</rdf:Description> 
</rdf:RDF>]]></programlisting>
    </para>
  </sect1>
  <sect1>
    <title>Écriture d'une DTD</title>
    <para>
      On souhaite décrire le contenu d'une bibiothèque et des livres
      empruntés avec un document XML. La racine
      sera <code>bibliothèque</code>, et ses fils seront
      d'abord <code>livre</code> puis <code>utilisateur</code>.
      Chaque <code>livre</code> possèdera un attribut <code>id</code>,
      un attribut <code>lang</code>, un fils <code>titre</code>, un
      fils <code>éditeur</code> et un fils <code>emplacement</code>.
      L'attribut <code>id</code> sera de type <code>ID</code>
      (obligatoire). <code>lang</code> pourra
      être <code>fr</code>, <code>en</code> ou <code>de</code>. Par
      défaut, ce sera <code>fr</code>.
      L'élément <code>utilisateur</code> aura comme
      fils <code>nom</code> (obligatoire),
      <code>prénom</code> (optionel), <code>adresse</code> (optionel),
      et comme attribut <code>emprunts</code> (optionel), de type IDREFS.
    </para>
    <para>
      Écrivez la DTD correspondante, puis produisez un fichier
      contenant 3 livres et deux utilisateurs Alice et Bob. Alice
      aura emprunté les deux premiers livres et Bob le dernier.
    </para>
  </sect1>
</article>


