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.xq
Linux standard
saxonb-xquery -o:fichierProduit.xml requete.xq
Les 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
relation
s, puis desnode
s, et enfin deway
s. - Chaque
relation
représente une autoroute. Chaquemember
représente une portion de route (uneway
référencée). - Ensuite, les
node
s sont des points visités par les contributeurs à OSM, sur ces autoroutes. - Dans les
relation
s, lesnode
s ou dans lesway
s, destag
peuvent 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
relation
s et une pour lesnode
s. - 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 (
cp
ou autre nom lors du nouvel appel àsaxonb-xquery
). - Modifier cette requête pour qu'elle ne garde plus les
node
dont les seulstag
auraient pour clef"created_by"
,"converted_by"
ou"source"
. - Notez qu'on garde ces même
tag
s'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
tag
de 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
tag
de clef (k
)"ref"
. - Enfin, la quatrième colonne donnera les autres informations. Pour cela, on appliquera une
template
par 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
tag
n'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 (
ref
par 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:
name
donne le nom complet.pk
,kp
etPK
donnent toutes trois des valeurs de point kilométrique.highway
donne 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_camera
radar milestone
borne kilométrique emergency_bay
band d'arrêt d'urgence crossing
passage d'animaux motorway_junction
échangeur Ne pas afficher (souvent couplé à un vrai nom). services
ouservice_junction
ourest_area
aire de repos Ne pas afficher (souvent couplé à un vrai nom). give_way
céder le passage Afficher comme 'panneau'. stop
stop Afficher comme 'panneau'. overhead_sign
panneau Afficher comme 'panneau'. traffic_signals
feu Afficher comme 'panneau'. barrier
est 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
).ele
donne l'altitude en mètres.exit_to
donne 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
class
etid
pour pouvoir y appliquer une CSS. Vous pouvez ajouter desdiv
s etspan
s au besoin. - Amusez-vous à décorer le HTML avec une CSS à votre goût.