ENST - BDA
Option XML - TPs

resp. option: Bernd AMANN

2003-2004



1   Pour démarrer

2   CookTop

Nous utilisons le logiciel cooktop pour les TPs XPath et XSLT. La documentation est disponible sur le site http://www.xmlcooktop.com/.

Exercice

E1 :
Lancer cooktop: Démarrer -> Programmes -> Cooktop2.x -> Cooktop
E2 :
Ouvrir le document cinema.xml
E3 :
Visualiser la structure du document (CTRL-")
E4 :
Valider le document (F7)
E5 :
Modification du document:

3   XPath

Interrogation du document Films.xml ave XPath :

Exercice

E1 :
Ouvrir document Films.xml dans cooktop.
E2 :
Exemple: tous les titres de films:
v://FILM/@titre         
 
E3 :
La requête commence par 'v:' (le résultat est interprété comme un ensemble de valeurs) ? Essayer 'n:' (ensemble de noeuds) et 's:' (valeur simple) à la place de 'n:' et interprétez le résultat.
E4 :
Cherchez le genre du film Alien.
n://FILM[@titre='Alien']/GENRE
 
E5 :
Cherchez les titres de tous les films d'horreur.
v://FILM[GENRE='Horreur']/@titre         
 
E6 :
Cherchez les titres de tous les films du même genre que le film Vertigo.
v://FILM[GENRE=//FILM[@titre='Vertigo']/GENRE]/@titre         
 
E7 :
Titre des films dramatiques (GENRE='Drame')de Hitchcock
v://FILM[GENRE='Drame' and MES='Hitchcock']/@titre
 
E8 :
Films sans acteurs ?
n://FILM[not(.//ROLE]
 
E9 :
Quel est le dernier film du document ?
n://FILM[last()]
 
E10 :
Quel est le film qui précède immédiatement le film Shining (dans l'ordre du document).
n://FILM[@titre='Shining']/preceding::FILM[1]
 
E11 :
Donnez les titres des films qui contiennent un 'V' (utilisez la fonction contains(str1, str2) qui retourne 'true' si str1 contient la chaîne str2)
n://FILM[contains(@titre, 'V')]
 
E12 :
Donner les fils avec trois rôles (utiliser la fonction count).
n://FILM[count(.//ROLE)=3]
 

4   XSLT

Maintenant nous allons transformer des documents XML. Pour se mettre dans le bain : Au travail: Nous allons modifier les programmes XSLT déjà existants en utilisant l'éditeur cooktop (des connaissances minimales de HTML sont nécessaires) :

E1 :
mettre le titre des film en gras (Films.xsl)
E2 :
ajouter l'affichage des rôles (Films.xsl)
E3 :
ajouter des liens vers les artistes dans de document Artistes.xml (Films.xsl et Artistes.xsl). Il faut ajouter des éléments <a href='...'> dans la transformation de Films.xml et des ancres <a id='...'> dans la transformation de Artistes.xml.
E4 :
ajouter le nom de l'acteur à côté du rôle dans la transformation de Films.xml (il faut intégrer des informations de deux documents).

5   XQuery

Pour faire des requêtes XQuery nous utilisons le programme ipsi-XQ. Il faut intérroger les documents Films.xml et Artistes.xml

5.1   Exercice

E1 :
1+3 ?
1+3
E2 :
Qui est le metteur en scène du Reservoir dogs (Films.xml) ?
for $m in doc("c:/home/tps-xml/Films.xml")/FILMS/FILM[@titre='Reservoir dogs']/MES/text()
return $m
ou
for $f in doc("c:/home/tps-xml/Films.xml")/FILMS/FILM
where $f/@titre='Reservoir dogs'
return $f/MES/text()
E3 :
Les films avec Harvey Keitel (Films.xml et Artistes.xml) ?
for $a in doc("c:/home/tps-xml/Artistes.xml")//ARTISTE[NOM='Keitel'],
    $f in doc("c:/home/tps-xml/Films.xml")//FILM[.//ROLE/@acteur=$a/@ID]
return $f
ou
for $a in doc("c:/home/tps-xml/Artistes.xml")//ARTISTE,
    $f in doc("c:/home/tps-xml/Films.xml")//FILM
where $a/NOM='Keitel' and $f//ROLE/@acteur=$a/@ID
return $f
E4 :
Les acteurs avec leurs films. Par exemple, pour l'acteur Travolta on obtient:

<ACTEUR>
    <NOM>Travolta</NOM>
    <FILMS>
        <FILM titre="Volte/Face"/>
        <FILM titre="Pulp fiction"/>
    </FILMS>
</ACTEUR>
for $a in doc("c:/home/tps-xml/Artistes.xml")//ARTISTE
return 
   <ACTEUR>
          {$a/NOM},
          <FILMS> {
            for $f in doc("c:/home/tps-xml/Films.xml")//FILM
            where $f//ROLE/@acteur=$a/@ID
            return <FILM> {$f/@titre} </FILM> }
          </FILMS>
   </ACTEUR>
ou
for $a in doc("c:/home/tps-xml/Artistes.xml")//ARTISTE
return 
   element ACTEUR {
          $a/NOM,
          element FILMS {
            for $f in doc("c:/home/tps-xml/Films.xml")//FILM
            where $f//ROLE/@acteur=$a/@ID
            return element FILM {$f/@titre}
          }
        }
ou
for $a in doc("c:/home/tps-xml/Artistes.xml")//ARTISTE
let $fl := doc("c:/home/tps-xml/Films.xml")//FILM[.//ROLE/@acteur=$a/@ID]
return 
   if ($fl) then 
        element ACTEUR {
          $a/NOM,
          element FILMS {
            for $f in $fl
            return element FILM {$f/@titre}
          }
        }
    else ()
E5 :
Les acteurs qui ont joué dans plus qu'un film.
for $a in doc("c:/home/tps-xml/Artistes.xml")//ARTISTE
let $fl := doc("c:/home/tps-xml/Films.xml")//FILM[.//ROLE/@acteur=$a/@ID]
return 
   if (count($fl) > 1) then 
        element ACTEUR {
          $a/NOM,
          element FILMS {
            for $f in $fl
            return element FILM {$f/@titre}
          }
        }
    else ()
E6 :
Les metteurs en scène avec leurs films.
for $m in distinct-values(doc("c:/home/tps-xml/Films.xml")//FILM/MES)
let $fl := doc("c:/home/tps-xml/Films.xml")//FILM[MES=$m]
return 
        element METTEUR_EN_SCENE {
          element NOM {$m},
          element FILMS {
            for $f in $fl
            return element FILM {$f/@titre}
          }
        }
E7 :
Le nombre de films par genre.
for $g in distinct-values(doc("c:/home/tps-xml/Films.xml")//FILM/GENRE)
let $fl := doc("c:/home/tps-xml/Films.xml")//FILM[GENRE=$g]
return 
        element GENRE {
          element TYPE {$g},
          element NOMBRE { count($fl) }
          }
ou
for $g in distinct-values(doc("c:/home/tps-xml/Films.xml")//FILM/GENRE)
let $fl := doc("c:/home/tps-xml/Films.xml")//FILM[GENRE=$g]
return ($g,':',count($fl))

Ce document a été traduit de LATEX par HEVEA.