TP XQuery
Extractions avec XQuery
![Note](../../../img/note.gif) |
Réponses
Les réponses sont affichées dans ce style là.
|
L'INRIA publie annuellement son RApport d'activité sur le WEB (RAWEB) à partir de données sources
transformées en XML puis dynamiquement en HTML. Vous allez manipuler quelques uns de ces
documents : téléchargez les puis dézippez les dans un répertoire
que par la suite on référencera par "[RAWEB]".
- Ouvrez l'un des fichiers XML dans un navigateur pour en étudier la structure.
Au lieu de traiter les fichiers individuellement, on les stocke dans une base de données XML (eXist),
ce qui permet d'interroger la base avec une grande souplesse grâce à XQuery.
On lancera les requêtes XQuery depuis l'interface cliente d'eXist.
- Téléchargez eXist
et installez comme indiqué dans un répertoire que par la suite on référencera par "[EXIST]";
spécifiez un mot de passe pour l'utilisateur "admin".
- Lancez le serveur :
cd [EXIST]
./bin/server.sh &
et ne touchez plus à rien !
On devrait vous indiquer les services installés:
Server launched ...
Installed services:
-----------------------------------------------
webdav: localhost:8088/webdav/*
xmlrpc: localhost:8088/xmlrpc/*
rest: localhost:8088/*
- Lancez le client:
[EXIST]/bin/client.sh &
indiquez le mot de passe entré précédemment, et assurez-vous que l'URL de connection
correspond bien à ci-dessus: xmldb:exist://localhost:8088/xmlrpc
- Dans l'interface, créez une collection "raweb", et importez les documents XML du répertoire
[RAWEB]
Faites les requêtes XQuery suivantes :
- count-projects2.xqy :
modifiez la requête pour que le résultat soit dans un élément :
<projets>7</projets>
- count-projects3.xqy :
la même chose, mais dans un attribut :
<projets nbre="7"/>
- count-projects4.xqy :
le même, mais en créant l'attribut en dehors de son littéral élément hôte à l'aide du constructeur d'attributs.
- projects-name.xqy :
liste des <shortname> des projets, l'ensemble étant entouré du littéral <projets> (utiliser let... return)
- projects-name2.xqy :
liste des <shortname> des projets, chacun étant entouré du littéral <projet> (utiliser for... return)
- projects-name3.xqy :
liste des <shortname> des projets, chacun étant entouré du littéral <projet>
et l'ensemble étant entouré du littéral <projets>
- projects-name4.xqy :
débrouillez vous pour faire disparaître le <span class="..."> et de ne garder que le nom du projet ;
faites ensuite disparaître <shortname> pour ne garder que le nom du projet.
On va essayer de reproduire ce résultat XHTML,
bien que la meilleure méthode serait de construire une extraction XML intermédiaire
qu'on transformerait avec XSLT. Consultez le code source de ce fichier XHTML.
- projects-html.xqy :
Produisez le résultat XHTML attendu d'abord SANS l'espace de nommage de XHTML.
- projects-html2.xqy :
Ajoutez l'attribut littéral xmlns="http://www.w3.org/1999/xhtml" à l'élément racine <html> dans votre
requête. Que constatez-vous ? On ne voit plus les projets ! Pourquoi ? Le préfixe par défaut est celui associé à l'espace de nom de XHTML ;
or, les expressions XPath2 utilisées dans la requête XQuery n'ont pas de préfixe ; ce sont donc des éléments de l'espace de nom de XHTML
qui sont donc interrogés ; les éléments des rapports de projet ne sont pas concernés ce qui donne des résultats intermédiaires vides. Quelle différence avec XPath1 remarquez-vous ? L'espace de nommage par défaut s'applique aux
éléments sans préfixe dans les expressions XPath2, alors que les éléments sans préfixes d'une expression XPath1 ne sont dans aucun
espace de nommage.
- projects-html3.xqy :
Utilisez le constructeur d'élément pour construire son nom avec l'espace de nommage, et faites en sorte que la requête fonctionne.
Attention à la syntaxe: element {QName(nsURI,localName)} {contentExpr} : le contenu est une expression,
ce peut être une séquence d'éléments séparés par une virgule.
- projects-html4.xqy :
Isolez la partie comptage dans une fonction séparée.
- projects-html5.xqy et raweb-module.xq :
Isolez la fonction dans un module externe dans le namespace http://raweb.inria.fr/ et appelez le dans votre fichier de requête principal.
Déposez votre module dans le répertoire "[EXIST]".
On va stocker les requêtes et les modules XQuery dans eXist, et les adresser directement par HTTP,
ce qui va provoquer leur exécution.
- Quittez l'outil d'interrogation de la base, et chargez dans la base (dans la même collection que les documents)
le module et la requête précédente. Vérifiez dans les propriétés de ces ressources que le type MIME est
application/xquery.
Vous pouvez éditer directement ces fichiers pour les modifier.
- projects-html6.xqy :
Faire une requête qui importe le module et lance le comptage avec un paramètre HTTP (le nom du projet).
Pour cela, importez la librairie http://exist-db.org/xquery/request
et utilisez la fonction get-parameter() pour récupérer le paramètre HTTP.
Pour exécutez votre requête, adressez la directement depuis un navigateur en passant le paramètre :
http://localhost:8088/raweb/projects-html6.xqy?proj=aces
- projects-html7.xqy et raweb-module2.xq :
Affichez le projet et la liste de ses membres en HTML, comme ceci;
la liste des membres devra être donnée par une fonction implémentée dans le module externe.