TP 6
XML — Licence Pro BDISE — 10 janvier 2017
XQuery
Rappel de la commande pour effectuer la requête
Machines de l'IUT
saxon-xquery \!indent=yes -o:fichierProduit.xml requete.xqLinux standard
saxonb-xquery -o:fichierProduit.xml requete.xqLes recettes
On utilise le fichier recipe.xml comme base de donnée. Écrire la requête XQuery qui permette d'obtenir la liste des recettes qui ont une indication de quantité (indice: makes).
On présentera le résultat sous la forme:
Le hockey
On utilise le fichier hockey.xml comme base de donnée. Écrire les requêtes XQuery qui permette d'obtenir:
- la liste de tous les joueurs (indice: aller voir du coté des éléments
lineup). On la présentera sous la forme:John Smith ... - la liste de tous les buts (indice:
incident_code="goal") classés par date (indice:ut). De même, on les présentera sous la forme:John Smith ...
Les trains pour Fontainebleau
On utilise le fichier trains.xml comme base de donnée. Écrire la requête XQuery qui permette d'obtenir la liste des trains qui s'arrêtent dans la forêt. On gardera la structure du document original.
Le Petit Prince
On utilise le fichier petit_prince.xml comme base de donnée. Écrire la requête XQuery qui permette d'obtenir la liste des phrases en français.
On présentera les phrases en gardant la structure des paragraphes (on formate les dialogues comme des paragraphes):
XQuery et XSLT: les autoroutes d'OpenStreetMap
On veut créer une page HTML qui répertorie les autoroutes françaises. Les données à notre disposition sont contenue dans un fichier XML qui cartographie les autoroutes, provenant de l'initiative OpenStreetMap.
Ce fichier est très volumineux (37,5Mo) [ne le téléchargez pas 12 fois, et pensez qu'il mettra du temps à s'ouvrir, ce que vous n'êtes pas obligés de faire!].
Pour récupérer le fichier:
- depuis les salles de l'IUT:
cp /export/documents/bdise/XML2013_2014/OpenStreetMap.xml cheminRelatif/ - en cas de problème ou depuis l'extérieur: URL alternative (plus lointaine en terme de réseau).
Extraction des données
On va commencer par extraire du fichier OpenStreetMap.xml les données qui nous intéressent, via une requête XQuery.
- Pour éviter d'avoir à ouvrir le fichier, on peut se reporter à la DTD fournie. On y remarque plusieurs choses:
- Tout d'abord il y des
relations, puis desnodes, et enfin deways. - Chaque
relationreprésente une autoroute. Chaquememberreprésente une portion de route (unewayréférencée). - Ensuite, les
nodes sont des points visités par les contributeurs à OSM, sur ces autoroutes. - Dans les
relations, lesnodes ou dans lesways, destagpeuvent contenir des métadonnées: les informations sur l'autoroute, si le point concerné est point d'intérêt...
- Tout d'abord il y des
- Les données qui nous intéressent, finalement, ne sont que les méta-données des autoroutes complètes et des points d'intérêt, contenues dans des éléments
tag. On ne va donc garder que les métadonnées des routes et seulement les points qui disposent de telles métadonnées. - On pourra procéder par deux requêtes à la suite: l'une pour les
relations et une pour lesnodes. - Le format de sortie devra être le même que celui du fichier donné en exemple.
Affinage de la requête 1/2
- Un coup d'œil au fichier produit montre qu'il y a un certain nombre de points dont le seul intérêt est qu'on dispose d'information sur leur origine:
"created_by","converted_by"ou"source". - Gardez votre première requête dans un commentaire et copiez la.
- Gardez également le résultat de la première requête, en vue de compraison (
cpou autre nom lors du nouvel appel àsaxonb-xquery). - Modifier cette requête pour qu'elle ne garde plus les
nodedont les seulstagauraient pour clef"created_by","converted_by"ou"source". - Notez qu'on garde ces même
tags'ils sont présent au coté d'autres métadonnées.
Affinage de la requête 2/2 (facultatif)
- Un autre coup d'œil au fichier produit montre que toutees les autoroutes disposent d'un
tagde clef"ref"qui donne le nom de code de l'autoroute (A1, A2...). - Modifier la requête pour qu'elle les ordonne par numéro.
- Notez qu'il faut penser à retirer le 'A' avant de trier comme des nombre pour que l'A3 soit bien avant l'A26...
- Notez également qu'il y a parfois des versions 'a' et 'b' des autoroutes (A6a, A6b par exemple).
- Astuce: pour ne récupérer que les chiffres d'une chaîne de caractères, on peut utiliser cet enchaînement de fonctions
translate:translate($chaine, translate($chaine,'0123456789',''), ''). (Essayez de comprendre pourquoi ça fonctionne!)
Affichage en HTML
On va maintenant transformer ce XML expurgé en une page HTML, à l'aide d'une feuille de style XSLT.
- La page, comme le XML, se divisera en deux parties principales: la liste des autoroutes et la listes des points d'intérêt.
- La liste des autoroutes est une simple liste de description (
dl), avec — pour chaque autoroute — comme titre (dt) le nom abrégé (A1, A2, ...) et come contenu (dd) le nom complet ("Autoroute du Nord"), l'opérateur ("ASF"), et les remarques, si ces données sont présentes. - Les points d'intérêts seront présentés dans un tableau, avec une ligne par POI, rangés par latitude (du nord au sud) puis longitude (d'ouest en est).
- Les deux premières colonnes donneront respectivement la latitude et la longitude.
- La troisième colonne donnera si elle existe le numéro de sortie contenu dans un
tagde clef (k)"ref". - Enfin, la quatrième colonne donnera les autres informations. Pour cela, on appliquera une
templatepar type d'information pertinente, en filtrant selon la clef.- Écrire une template qui sélectionne tous les tags. Elle produira un commentaire dans le HTML produit pour signifier que la clef du
tagn'a pas été utilisée. Cela permet en outre de tester des versions incomplètes de la feuille XSLT. - Écrire une template vide pour les champs "inutiles" qui resteraient:
"created_by","converted_by"ou"source". - Écrire une template vide pour les champs traités ailleurs (
refpar exemple). On pourrait mettre ce cas avec la template précédente, mais cela est moins propre puisqu'on ne les exclue pas pour les mêmes raisons. - Pour chaque clef intéressante, écrire une template qui met en forme les informations. Ainsi, elles ne seront appliquées qu'en présence du tag idoine. Quelques exemples de telles clefs:
namedonne le nom complet.pk,kpetPKdonnent toutes trois des valeurs de point kilométrique.highwaydonne le type de point d'intérêt dans le cadre d'une autoroute. Les valeurs possibles sont les suivantes:Valeur (" v")Signification Remarque speed_cameraradar milestoneborne kilométrique emergency_bayband d'arrêt d'urgence crossingpassage d'animaux motorway_junctionéchangeur Ne pas afficher (souvent couplé à un vrai nom). servicesouservice_junctionourest_areaaire de repos Ne pas afficher (souvent couplé à un vrai nom). give_waycéder le passage Afficher comme 'panneau'. stopstop Afficher comme 'panneau'. overhead_signpanneau Afficher comme 'panneau'. traffic_signalsfeu Afficher comme 'panneau'. barrierest en général une barrière de péage (toll_booth). Si aucun nom n'est présent, afficher "Péage" ainsi que l'éventuel opérateur (operator).eledonne l'altitude en mètres.exit_todonne la direction de la sortie.
- Écrire une template qui sélectionne tous les tags. Elle produira un commentaire dans le HTML produit pour signifier que la clef du
- Bonus: ajouter pour chaque point d'intérêt une "colonne 0" qui permette d'aller voir le point sur OpenStreetMap.
Syntaxe de l'URL:http://www.openstreetmap.org/#map=<zoom>/<latitude>/<longitude>
Un zoom de 15 semble adapté.
CSS
- Ajoutez au XSLT une ligne qui ajoute une référence à une feuille de style CSS
- Faites en sorte que le HTML produit contienne sufffisament d'attributs
classetidpour pouvoir y appliquer une CSS. Vous pouvez ajouter desdivs etspans au besoin. - Amusez-vous à décorer le HTML avec une CSS à votre goût.