TP interrogation XML native
Extractions avec XQuery
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 le répertoire
[MY_TP]/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 à l'aide d'Active Tags et RefleX.
On vous donne ces quelques fichiers de base à dézipper dans [MY_TP]/ (squelettes et lanceur).
Pour lancer un script Active Tags, utiliser ./run.sh script-to-run.xcl
- Chargement de la base : lancez ./run.sh load.xcl
Pour lancer une requête XQuery avec Active Tags, utiliser ./run.sh query.xcl the-query.xqy
- Consultez count-projects.xqy
- Vérifiez que la base est chargée : lancez ./run.sh query.xcl count-projects.xqy ;
vous pouvez ignorer les stupides erreurs retournées par le driver XML:DB du style "[Fatal Error] :1:1: Content is not allowed in prolog."
puisqu'effectivement la ressource retournée n'est pas valide au sens XML ; vous devriez obtenir "7" : c'est le nombre
de projets qui ont été chargés dans la base.
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 é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 SANS l'espace de nommage. Que constatez-vous ?
Pourquoi ?
- query2.xcl :
Modifiez le script XCL pour forcer à produire une sortie XML encodé en iso-8859-1.
Voir dans la doc de RefleX comment positionner les propriétés de sortie du sérialiseur XSLT.
- 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 ? Pourquoi ? Quelle différence avec XPath1 remarquez-vous ?
- projects-html3.xqy :
Trouvez un moyen pour construire l'attribut et faire en sorte que la requête fonctionne.
- 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.
ATTENTION : eXist ne sait pas résoudre les chemins relatifs (le chemin est relatif au serveur, au lieu de l'URI de la requête) ;
et donc, un chemin comme ça devrait aller : ../ra/raweb-module.xq (si l'arborescence indiquée a été respectée)
- projects-html6.xqy :
Faire une requête qui importe le module et lance le comptage avec un paramètre externe (le nom du projet).
Faites un script shell pararun.sh qui prend un paramètre : ./pararun.sh query-param.xcl the-query.xqy theParam=theValue ;
inspirez-vous de la façon dont la requête XQuery est placée dans une variable système de la JVM pour passer le paramètre.
Adaptez le script XCL (query3.xcl) pour passer le paramètre à la requête XQuery.
- projects-html7.xqy et raweb-module2.xq :
lancer ./pararun.sh query3.xcl projects-html7.xqy proj=aces : on doit afficher le projet et la liste de ses membres en HTML ;
la liste des membres est donnée par une fonction implémentée dans le module externe.
Pour vous aider, consultez la documentation en ligne :
- Documentation pratique sur RefleX :
- Documentation générale sur Active Tags :