XML -- TP 6 : XQuery -- Correction


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.

Corrigé.

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).

    Corrigé.

  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.

    Corrigé.

  3. Même question mais en ordonnant les résultats par titre.

    Corrigé.

  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.

    Corrigé.

  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.

    Corrigé.

  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>
      

    Corrigé

    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).

    Corrigé

  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 descrition (s'il y en a une).

    Corrigé.


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.
    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.

    Corrigé et résultat.

  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.
    Indication : On peut tester si un element $node est de type toto à l'aide de l'instruction : if ($node instance of element(toto))
    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()

    Corrigé et résultat.

  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.

    Corrigé