XML -- TP 6 : XQuery


Méthodologie

Au cours de ce TP, nous utiliserons la librairie Saxonica pour exécuter les requêtes XQuery. Téléchargez le fichier saxon8.jar. Vous pouvez ensuite exécuter la commande suivante :

 java -cp saxon8.jar net.sf.saxon.Query monPrograme.xqy 

Dans les exercices 1, 2 et 3, nous utiliserons les fichiers suivants : biblio.xml, bookmarks.xml, collection.xml, collection2.xml database.xml, pieces.xml

Exercice 1 : Requêtes XQuery

Fichiers: - biblio.xml

Pour chacune des requêtes XQuery suivantes, expliquez ce qu'elle fait et anticipez le résultat de son exécution. Vérifiez à l'aide de la librairie saxon.

Exercice 2 : Expressions FLOWR

Donner une expression FLWOR correspondant à chacune des requêtes suivantes:

  1. Fichiers: - collection.xml - collection2.xml

    Pour chaque série, créez un élément serie avec un attribut titre contenant le nom de la série et un attribut editeur contenant le nom de son éditeur (la valeur de l'attribut editeur est "" s'il n'y a pas d'éditeur pour la série).
  2. Fichiers: - collection.xml - collection2.xml

    Pour chaque tome de la collection donner son numero, le nom de sa serie et son titre sous forme d'attributs.
  3. Même question mais en ordonnant les résultats par titre.

  4. Fichiers: - database.xml

    Pour chaque fichier, créez un élément a contenant un attribut href indiquant l'url du document et ayant pour fils le texte qui indique le nom du document. On pourra utiliser la fonction string(.) pour récupérer la valeur d'un attribut sous forme de texte.
  5. Transformez la requête précédente de manière à obtenir une liste html contenant les liens vers les fichiers.
    Rappel : une liste html est constituée par un élément ol ou ul contenant un ensemble d'éléments li dont le contenu correspond aux différents éléments de la liste.

  6. Transformez à nouveau la requête précédente de façon à ce que:

    • Les urls des liens soient absolues (i.e. commencent bien par http://www.lif.univ-mrs.fr/~preynier/XML/tp6/). On pourra utiliser la fonction concat(.,.).
    • Le résultat forme un document HTML. On pourra utiliser le modèle ci-dessous :
      <html>
        <head>
          <title>Titre du document</title>
        </head>
        <body> 
          Contenu du document
        </body>
      </html>
      
    Copiez collez le résultat dans un bloc note et enregistrez-le avec l'extension .html. Ouvrez le fichier avec un navigateur et vérifiez que les liens fonctionnent (si le navigateur a du mal, essayer sans la première ligne du résultat).

  7. Fichiers: - bookmarks.xml

    Donnez pour chaque catégorie son nom et ses bookmarks (y compris ceux des sous-catégories). Le resultat devra être trié par nom pour les catégories. Pour les bookmarks, on triera par nom (s'il a un nom) et sinon on considérera la description (s'il y en a une).
    Remarque : On pourra utiliser la construction if ( test ) then expr1 else expr2 pour réaliser un test. L'utilisation de () permet de renvoyer un ensemble d'éléments vide.
    Rappel : En XPath, si une expression de chemin est utilisée à la place d'un booléen, elle est évaluée à vrai ssi son résultat n'est pas vide.

Exercice 3 : Fonctions XQuery

  1. Fichiers: - bookmarks.xml

    Ecrivez une fonction de présentation simple des bookmarks: elle prend en argument un noeud bookmark et donne un paragraphe correspondant au titre qui sera un lien (si le titre est absent, mettre l'url à la place du titre) et un paragraphe contenant sa description (ou rien s'il n'y a pas de description). On regroupera ces deux paragraphes dans un élément div.
    Utilisez la fonction pour générer une page web contenant une liste des bookmarks que vous testerez comme précédement.
  2. On reprend la question précédente, mais en affichant à l'aide d'une fonction récursive les catégories avec leur bookmarks. Une catégorie sera représentée par un élément div dans lequel on mettra un paragraphe donnant le nom de la catégorie, un paragraphe contenant sa (ou ses) description(s) et enfin une liste html qui correspondra à l'ensemble des bookmarks et des catégories qui sont des enfants de la catégorie considérée. On utilisera la fonction précédente pour le formatage des bookmarks. Dans un premier temps on pourra éventuellement mettre en premier les sous-catégories, suivies des bookmarks. Dans un deuxième temps, on conservera l'ordre donné dans le document Bookmarks.
    Indications : On peut parcourir tous les fils éléments d'un noeud référencé par la variable $toto à l'aide de l'expression XPath : $toto/element()
    On peut tester si un element $node est de type toto à l'aide de l'instruction : if ($node instance of element(toto))

  3. Fichiers: - pieces.xml

    Dans ce document, chaque pièce a un identifiant id, un nom et optionnellement l'identifiant d'une pièce dont elle constitue une partie. Écrivez une fonction récursive permettant d'obtenir une hiérachie de pièces représentant la composition d'une pièce. Attention, on ne peut pas utiliser un chemin XPath commençant par / dans une fonction. Utilisez cette fonction pour représenter de manière hiérachique le document pieces.xml.

Exercice 4 : IMDB (optionnel)

Nous nous intéressons à la base de donnée de films construite par le site internet IMDB. Plus particulièrement, considérons le classement des 250 meilleurs films proposé par ce site sur cette page. Cette page présente un tableau rassemblant dans l'ordre de leur classement les 250 films préférés des visiteurs du site (ayant le droit de voter...).

  1. On souhaite exploiter les données contenues dans ce tableau. En récupérant le code source html de cette page, construisez un fichier XML contenant exactement les informations présentées dans ce tableau, ainsi qu'une DTD associée. Vérifiez la validité du document par rapport à votre DTD.

  2. A l'aide d'une requête XQuery, construisez un nouveau document XML donnant pour chaque année apparaissant dans le document le nombre de films ayant cette année. Le document XML produit devra être valide vis-à-vis de la DTD suivante :

    <!ELEMENT results  (year* )>
    <!ELEMENT year>
    <!ATTLIST year 
                 value        CDATA  #REQUIRED 
                 number_films CDATA  #REQUIRED 
    >
    

  3. A l'aide d'une requête XQuery, construisez un nouveau document XML donnant pour chaque année apparaissant dans le document le score moyen des films parus cette année et apparaissant dans le classement. La DTD du document XML produit sera la même que précédemment, number_films étant remplacé par rating.

  4. A l'aide d'une requête XQuery, construisez un nouveau document XML donnant pour chaque année apparaissant dans le document le nombre de votes pour un des films parus cette année. La DTD du document XML produit sera la même que précédemment, rating étant remplacé par number_votes.

  5. A l'aide d'une requête XQuery, construisez un nouveau document XML donnant pour chaque année apparaissant dans le document les trois résultats construits précédemments, respectivement dans les attributs number_films, rating, et number_votes. La DTD du document XML produit sera la même que précédemment, mais l'élément year aura les 4 attributs.