XPath et XSLT Exemple - Cedric

Transcription

XPath et XSLT Exemple - Cedric
1
3
Exemple: Document XML
Document XML:
XPath et XSLT
/
Valeur C - Module Données et Services sur le Web
Bernd Amann
FILM
2003/04
TITRE
AUTEUR
ANNEE
RESUME
Vertigo
Hitchcock
1958
Scotty...
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
2
4
Sélectionner des fragments XML
Il faut souvent pouvoir sélectionner/extraire des fragments (nœuds)
XPath.
d’un document XML
Exemple: Transformation en HTML
Fragment HTML qu’on veut obtenir :
p
XPath est utilisé par
h1
i
p
i
1958
Hitchcock
h3
XSLT pour sélectionner des règles de transformation
XQuery pour l’interrogation de documents XML
Résumé:
Scotty...
XML Schéma pour définir des clés/références
XLink pour créer des liens entre noeuds XML
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Vertigo
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
5
7
Exemple : l’arbre DOM...
Exemple : Règle de transformation XSLT
/
Document
FILM
TITRE
AUTEUR
ANNEE
RESUME
Vertigo
Hitchcock
1958
Scotty...
Element
EXEMPLE
*
i
*
i
p
Résumé:
*
Text
Section littérale avec
h3
SectionCDATA
des ’&’, des ’ ’ des ’
h1
*
’
Text
et un text
p
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
6
8
Puis l’arbre XPath...
XPath: Le modèle
Document
-
Le langage XPath permet de désigner un ou plusieurs nœuds dans
un document XML, à l’aide d’expressions de chemins/d’arbres.
XPath est fondé sur une représentation arborescente (DOM)
du document XML
Objectif : référencer nœuds (éléments, attributs,
commentaires, ...) dans un document XML
pas
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Text
Section littérale avec des ’&’, des ’
’ des ’
Un typage simplifié par rapport à celui de DOM
d’entités, pas de sections littérales
Element
EXEMPLE
’ et un texte
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
9
11
Expressions XPath : Sémantique
Étapes XPath
Une expression XPath :
Une étape a trois types de composants :
...
s’évalue en fonction d’un nœud contexte
!
#$
"
désigne un ou plusieurs chemins dans l’arbre à partir du
nœud contexte
]
,
%'
%& [
+*()
::
a pour résultat
Exemple :
L’axe (optionnel) recouvre les deux notions suivantes :
– un ensemble de nœuds
– un sous-ensemble des nœuds de l’arbre relatif au nœud
contexte ;
– ou une valeur, numérique, booléenne ou alphanumérique
– l’ordre de parcours de ces nœuds
Le filtre (obligatoire) définit le type des nœuds/noms des
éléments qui seront retenus
Le(s) prédicat(s) (optionnels) doivent être satisfaites par les
nœuds retenus.
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
10
12
Expressions XPath : Syntaxe
Document XML avec un nœud contexte
Document
-
Un chemin XPath est une suite d’étapes :
-
[/]étape /étape /.../étape
Instruction
Java
ins1
Deux variantes : Un chemin peut être
3
0$
1
$ $1
2
0$
.
1
# $
67
/
/
Element
B
5
54
absolu :
Comment
CommFin
Element
A
Element
B
Element
C
Le nœud contexte est la racine du document.
0$
3
1
1
$ $1
2
0$
5
67
54
relatif :
()
/
Le nœud contexte est un nœud dans le document (pas
forcément la racine).
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Attr
att1
a1
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Attr
att2
a3
Attr
att3
15
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
13
15
parent::A
child::D ou D
Document
-
Instruction
Java
ins1
Nœud contexte
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Instruction
Java
ins1
Comment
CommFin
Element
A
Element
B
Attr
att1
a1
Document
-
Element
D
Element
C
Attr
att2
a3
Element
B
Attr
att3
15
Attr
att1
a1
Text
Texte3
Nœud contexte
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Element
C
Attr
att2
a3
Attr
att3
15
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
14
16
attribute::att1 ou @att1
descendant::node()
Document
-
Instruction
Java
ins1
Document
-
Comment
CommFin
Element
A
Element
B
Attr
att1
a1
Comment
CommFin
Element
A
Nœud contexte
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Instruction
Java
ins1
Element
C
Attr
att2
a3
Attr
att3
15
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Element
B
Attr
att1
a1
Comment
CommFin
Element
A
Nœud contexte
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Element
C
Attr
att2
a3
Attr
att3
15
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
17
19
ancestor::node()
following::node()
Document
-
Instruction
Java
ins1
Comment
CommFin
Element
A
Element
B
Attr
att1
a1
Document
-
Element
C
Nœud contexte
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Instruction
Java
ins1
Attr
att2
a3
Element
B
Attr
att3
15
Attr
att1
a1
Text
Texte3
Comment
CommFin
Element
A
Element
C
Nœud contexte
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Attr
att2
a3
Attr
att3
15
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
18
20
preceding-sibling::node()
Autres axes et axe/étape par défaut
Document
Autres axes:
– preceding : les précédents (dans l’ordre du document)
Instruction
Java
ins1
Comment
CommFin
Element
A
Element
B
Nœud contexte
– descendant-or-self : les descendants, plus le nœud
contexte
– ancestor-or-self : les ancêtres, plus le nœud contexte
Element
C
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Attr
att2
a3
Attr
att3
15
Attr
att1
a1
L’axe par défaut est child : /A correspond à /child::A
L’étape par défaut est descendant-or-self::node() :
A//B exprime
child::A/descendant-or-self::node()/child::B
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
21
23
Filtres
//@att2
Deux manières de filtrer les nœuds :
Document
-
par leur nom : possible pour les types de nœuds : Element,
ProcessingInstruction et Attr (qui ont un nom)
Instruction
Java
ins1
par leur type DOM :
Comment
CommFin
Element
A
– * : nœuds de type Element ou Attribute
Element
B
– text() : nœuds de type Text
Element
C
Element
B
– comment() : nœuds de type Comment
– processing-instruction() : nœuds de type
ProcessingInstruction
Attr
att1
a1
Exemple : /processing-instruction(), ou
/processing-instruction(’java’)
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Attr
att2
a3
Attr
att3
15
Text
Texte3
– node() recouvre tous les types de nœud
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
22
24
/A/B/D
Nom générique : /A/*
Document
-
Instruction
Java
ins1
Comment
CommFin
Element
A
Element
B
Attr
att1
a1
Document
-
Element
B
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Instruction
Java
ins1
Element
C
Attr
att2
a3
Attr
att3
15
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Element
B
Attr
att1
a1
Comment
CommFin
Element
A
Element
B
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Element
C
Attr
att2
a3
Attr
att3
15
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
25
27
/descendant::text()
Notation abrégée de parent::node()
Document
-
Instruction
Java
ins1
Comment
CommFin
Element
A
Element
B
Element
B
Element
C
Attr
att1
a1
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Attr
att2
a3
La notation abrégée “..” désigne le père du nœud contexte,
quel que soit son type.
L’expression “..” est équivalent à parent::node() (le filtre
node() désigne tous les types de nœuds sauf les attributs).
L’expression “.” désigne le nœud contexte lui-même (surtout
utile dans les prédicats).
Attr
att3
15
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
26
28
/comment()
Prédicats
Document
-
Instruction
Java
ins1
Comment
CommFin
Element
A
Element
B
Attr
att1
a1
Element
D
Element
B
Element
D
Attr
att1
a2
Element
D
Element
C
Attr
att2
a3
Attr
att3
15
Prédicat : expression booléenne constituée d’un ou plusieurs
tests, composés avec les connecteurs logiques habituels and
et or
Test :
– toute expression XPath, dont le résultat est convertie en
booléen;
– une comparaison, un appel de fonction.
il faut connaître les règles de conversion
Text
Texte1
Text
Texte2
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
29
31
Pour bien comprendre
Contexte d’évaluation
Une étape s’évalue en tenant compte d’un contexte constitué de
Dans l’expression /A/B[@att1] :
On s’intéresse aux nœuds de type B fils de l’élément racine A.
Parmi ces nœuds on ne prend que ceux pour lesquels le
prédicat [@att1] s’évalue à true
un nœud contexte, position initiale du chemin ;
ce nœud fait lui-même partie d’un ensemble obtenu par
évaluation de l’étape précédente
– on connaît la taille de cet ensemble (fonction last())
Cette expression s’évalue avec pour nœud contexte un
élément B
– on connaît la position du nœud contexte dans cet
ensemble (fonction position())
[@att1] vaut true ssi @att1 renvoie un ensemble de
nœuds non vide
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
30
32
Quelques exemples
/A/B/descendant::text()[1]
Document
-
/A/B[@att1] : les nœuds /A/B qui ont un attribut @att1
/A/B[@att1=’a1’] : les nœuds /A/B qui ont un attribut @att1
valant ’a1’
Instruction
Java
ins1
/A/B/descendant::text()[position()=1] : le premier
nœud de type Text descendant d’un /A/B.
/A/B/descendant::text()[1] : idem
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Element
B
Attr
att1
a1
Comment
CommFin
Element
A
Element
B
Element
D
Element
D
Text
Texte1
Text
Texte2
Attr
att1
a2
Element
D
Element
C
Attr
att2
a3
Attr
att3
15
Text
Texte3
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
33
35
Les types XPath
Conversions de types
On peut effectuer des comparaisons, des opérations. Cela
implique un typage et des conversions de type.
Deux conversions sont toujours possibles.
Les types XPath sont :
Vers une chaîne de caractères.
– utile pour la production de texte en XSLT (balise
xsl:value-of)
les numériques
les chaînes de caractères
Vers un booléen
– utile pour les tests effectués dans XSLT (xsl:if,
xsl:when)
les booléens (true et false)
enfin les ensembles de nœuds
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
34
36
Numériques
Conversions booléennes
Notation décimale habituelle
Comparaisons habituelles (<, >, !=)
Opérations : +, -, *, div, mod
La fonction number () permet de tenter une conversion
Si la conversion échoue on obtient NaN (Not a Number ). À
éviter...
Pour les numériques : 0 ou NaN sont false, tout le reste est
true
Pour les chaînes : une chaîne vide est false, tout le reste
est true
Pour les ensembles de nœuds : un ensemble vide est
false, tout le reste est true
Ex : //node()[number(@att1) mod 2=1]
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
37
39
Quelques fonctions utiles :
Les fonctions XPath
et sélection par valeur
Test du nombre d’occurrences :
CINEMA[count(SEANCE) > 1]: cinémas avec au moins 2
séances
concat(chaîne1, chaîne2, ...) pour concaténer des chaînes
contains(chaîne1, chaîne2) teste si chaîne1 contient chaîne2
FILM[count(ACTEUR) = 0]: films sans acteur
count (expression) renvoie le nombre de nœuds désignés par
expression
FILM[not(ACTEUR)]: films sans acteur
name() renvoie le nom du nœud contexte
Sélection par valeur:
FILM[not(ACTEUR[NOM=’Willis’])]: films sans Bruce
Willis
not(expression) : négation
FILM[ACTEUR/NOM=’Willis’]: films avec Bruce Willis
FILM[ACTEUR[NOM=’Willis’]]: idem
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
38
40
Prédicats: Axes d’avancements et inverses
La position d’un nœud dépend de l’axe choisi:
Axes « d’avancement » :
Test sur la structure : chemins imbriqués avec connecteurs logiques
(qualifiers)
child::*[3]: le 3e enfant
Prédicats plus complexes
child::*[position()=3]: idem
child::*[last()]: le dernier enfant
descendant::*[last()]: le dernier descendant
Axes « inverses » :
ACTEUR[NOM and DATENAISSANCE] ou
ACTEUR[NOM][DATENAISSANCE]: les acteurs avec un nom et une
date de naissance
FILM[@TITRE = ’Brazil’ and ACTEUR/NOM = ’De Niro’]:
le film Brazil avec l’acteur De Niro
FILM[@TITRE = ’Brazil’][ACTEUR/NOM = ’De Niro’]:
idem
ancestor::*[1]: le premier ancêtre du nœud contexte
(dernier dans l’ordre du document).
preceding-sibling::*[last()]: le dernier frère qui
précède le nœud contexte (premier dans l’ordre du document).
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
41
43
Sommaire
XPath : Résumé
Une introduction à XSLT, destinée à comprendre les mécanismes
du langage.
XPath est un langage pour extraire des noeuds dans un arbre
XML :
On navigue dans l’arbre grâce à des axes de navigation.
Un chemin de navigation est une séquence d’étapes.
Dans chaque étape on choisi un axe, un filtre et
éventuellement des prédicats.
Le résultat d’une étape (d’une séquence d’étapes) est un
séquence de noeuds.
Règles XSLT
Désignation de fragments XML
Appels de règles
Application : XML -
HTML et XML -
WML
Passage de paramètres
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
42
44
XSLT, où, quand, comment
»>Logbook error: File ’FIGURES/ArchiXSLT’ does not exist!
Introduction à XSLT
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
45
47
Exemple : La fiche du film Gladiator
Fonctions d’un programme XSLT
Transformation d’arbres XML:
La fiche du film peut être publiée
en HTML pour Netscape/IE
en WML pour le portables WAP
en SMIL pour Realplayer
dans un moteur de recherche SallesEnLigne.com
L’information ?
extraction de données
génération de texte
suppression de contenu (noeuds)
déplacer contenu (noeuds)
dupliquer contenu (noeuds)
trier
c’est la même, sous des formes différentes
elle est échangée entre plusieurs acteurs
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
46
48
Qu’est-ce qu’on peut faire avec XSLT?
Exemple: Règle de transformation
XSLT utilise XPath pour sélectionner la règle à appliquer et les
fragments à afficher ou transformer :
Transformer un document XML en
un ou plusieurs documents XML, HTML, WML, SMIL
document papier: PDF (XSL-FO), LaTeX
texte simple
arbre
DOM
Processeur
XSLT
Sérialisation
Analyse
Document XML
arbre
résultat
Document XSLT
Document résultat
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
<xsl:template match="FILM">
<p>
<h1>
<i>
<xsl:value-of select="TITRE"/>
</i>
</p>
<i>
<xsl:value-of select="ANNEE"/>
</i>
<p>
<xsl:value-of select="AUTEUR"/>
</p>
<h3>Résumé:
<xsl:value-of select="RESUME"/>
</h3>
</p>
</xsl:template>
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
49
51
XSLT et XPath
Fonctionnalités XSLT
Génération d’un arbre XML:
/
<xsl:template match="FILM">
<body>
<p>Un paragraphe</p>
</body
</xsl:template>
FILM
TITRE
AUTEUR
ANNEE
RESUME
Vertigo
Hitchcock
1958
Scotty...
Génération d’arbre avec extraction :
<xsl:template match="FILM">
<body>
<p>Titre:
<xsl:value-of select="TITRE"/>
</p>
</body>
</xsl:template>
*
i
*
*
h1
i
p
Résumé:
*
h3
p
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
50
52
Fonctionnalités XSLT
Structure de base : les règles
Extraction de données:
Génération de texte:
Règle = template : élément de base pour produire le résultat
<xsl:template match="FILM">
<xsl:value-of select="TITRE"/>
</xsl:template>
<xsl:template match="FILM">
Ceci est le texte produit par
application de cette règle.
</xsl:template>
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
une règle s’applique dans le contexte d’un nœud de l’arbre
l’application de la règle produit un fragment du résultat.
Programme XSLT = ensemble de règles pour construire un résultat
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
53
Chemins complexes
55
Exemple de boucle: Traduction de Salle
Dans une règle, on peut :
<xsl:template match="SALLE">
<h2>Salle No
<xsl:value-of select="@NO"/></h2>
Film: <xsl:value-of select="FILM/TITRE"/>
de
<xsl:value-of select="FILM/AUTEUR"/>
<ol>
<xsl:for-each select="SEANCES/SEANCE">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ol>
</xsl:template>
accéder aux fils, aux descendants, au parent, aux frères, aux
neveux, aux attributs, ... du noeud à transformer (XPath).
effectuer des tests et des boucles, etc...
“appeler” d’autres règles (récursion)
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
54
56
Exemple: Document XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="Salle.xsl" type="text/xsl"?>
<?cocoon-process type="xslt"?>
<SALLE NO=’1’ PLACES=’320’>
<FILM>
<TITRE>Alien</TITRE>
<AUTEUR>Ridley Scott</AUTEUR>
<ANNEE>1979</ANNEE>
<GENRE>Science-fiction</GENRE>
<PAYS>Etats Unis</PAYS>
<RESUME>Près d’un vaisseau spatial échoué sur une lointaine
planète, des Terriens en mission découvrent de bien étranges
"oeufs". Ils en ramènent un à bord, ignorant qu’ils viennent
d’introduire parmi eux un huitième passager particulièrement
féroce et meurtrier.
</RESUME>
</FILM>
<REMARQUE>Réservation conseillée</REMARQUE>
<SEANCES>
<SEANCE>15:00</SEANCE>
<SEANCE>18:00</SEANCE>
<SEANCE>21:00</SEANCE>
</SEANCES>
</SALLE>
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Le résultat
Appliqué à Salle1.xml :
<h2>Salle No 1 </h2>
Film: Alien
de
Ridley Scott
<ol>
<li> 15:00</li>
<li> 18:00</li>
<li> 21:00</li>
</ol>
NB : c’est un fragment HTML, à intégrer dans un document
complet.
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
57
Salles et séances
59
Exemple : L’Épée de bois
chemin "@NO"
Contexte d’application de la règle
SALLE
chemin "FILM/TITRE"
« Cadre » HTML, puis appel de la règle CINEMA
NO=2
PLACES=320
chemin
SEANCES/SEANCE
<xsl:template match="/">
<html>
<head><title>Programme de
<xsl:value-of select="CINEMA/NOM"/>
</title>
</head>
<body bgcolor="white">
<xsl:apply-templates select="CINEMA"/>
</body>
</html>
</xsl:template>
FILM
chemin
"REMARQUE"
TITRE
Alien
AUTEUR
ANNEE
GENRE
Scott Science−Fiction 1979
PAYS
USA
RESUME
REMARQUE
SEANCES
Réservation
Près d’un
vaisseau spatial... conseillée
boucle
for−each
SEANCE
SEANCE
15:00
18:00
SEANCE
21:00
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
58
60
Appels de règles
En général on produit un résultat en combinant plusieurs règles :
La règle initiale s’applique à la racine du document traité (’/’)
On produit alors le cadre du document HTML
On appelle d’autres règles pour compléter la création du
résultat
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Règle CINEMA
Exploitation de l’élément CINEMA, puis appel à la règle SALLE
<xsl:template match="CINEMA">
<h1><i>
<xsl:value-of select="NOM"/>
</i></h1><hr/>
<xsl:value-of select="ADRESSE"/>,
<i>Métro: </i>
<xsl:value-of select="METRO"/>
<hr/>
<xsl:apply-templates select="SALLE"/>
</xsl:template>
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
61
Vue d’ensemble
63
Le document XML
html
head
title
Règle "/"
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE MOTEUR [
<!ENTITY EpeeDeBois
SYSTEM "http://epee-de-bois.fr/EDB.xml">
<!ENTITY CineMarseille
SYSTEM "http://cine-marseille.fr/CM.xml">
]>
<MOTEUR>
<CINEMA>
&EpeeDeBois;
</CINEMA>
<CINEMA>
&CineMarseille;
</CINEMA>
</MOTEUR>
body
h1
hr
adresse
p
p
i
h2
h3
h2
h3
Epée de bois
Salle No 1
Film: Alien
Salle No 2
Film : Vertigo
Règle "CINEMA"
Règle "SALLE"
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
62
64
XSLT avec paramètres
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<title>Formulaire de Recherche</title>
</head>
<body bgcolor="white">
<h1>Formulaire de Recherche</h1>
<form method=’get’ action=’Moteur.xml’
name=’Form’>
Film: <input type=’text’ name=’titre’> <br>
Séance: <input type=’text’ NAME=’seance’ >
(hh:mm)<br>
Ville: <input type=’text’ name=’ville’><br>
<input type=’submit’ name=’chercher’
value="Chercher"/>
</form>
</body>
</html>
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Traitement des paramètres
<xsl:param name="titre"/>
<xsl:param name="seance"/>
<xsl:param name="ville"/>
<xsl:template match="MOTEUR">
<xsl:for-each select="CINEMA">
<xsl:if test="
CINEMA//TITRE = $titre) and
CINEMA//HEURE &gt;= $seance) and
CINEMA/VILLE = $ville)">
<xsl:apply-templates select="." /><p/>
</xsl:if>
</xsl:for-each>
</xsl:template>
Démo : SallesEnLigne.com
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
65
67
Principaux éléments de premier niveau
Programmation XSLT
Type d’élément
Description
xsl:import
Import d’un programme XSLT
xsl:include
Inclusion d’un programme XSLT
xsl:output
Indique le format de sortie
xsl:param
Définit un paramètre
xsl:template
Définit une règle XSLT
xsl:variable
Définit une variable XSLT
Table 1:
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
66
68
Règles : définition et déclenchement
Éléments XSLT (espace de noms XSLT)
Une règle est définie par l’élément xsl:template.
Deux possibilités de définition (et de déclenchement) :
On distingue :
L’élement racine d’un programme : <xsl:stylesheet>.
Les éléments de premier niveau, fils de <xsl:stylesheet>.
L’attribut match est un pattern XPath définissant les « cibles »
de la règle
Ex : xsl:template match=’FILM’
– Il s’agit essentiellement des règles (template)
- déclenchement par xsl:apply-templates
select=’...’
Les instructions : on les trouve dans le corps des règles.
L’attribut name donne un nom à la règle
Ex : xsl:template name=’TDM’
- déclenchement par xsl:call-template name=’...’
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
69
71
Sélection des règles par leur pattern
Patterns : Axes autorisés
Seulement les axes suivants sont autorisés comme pattern de
sélection :
Soit
le pattern de la règle
le nœud
Soit
Problème : étant donné un nœud, comment trouver la règle qui
s’applique ?
4
S’il existe quelque part un nœud tel que l’évaluation de
partir de contient : la règle s’applique
à
L’abréviation // de /descendant-or-self::node()/
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
70
72
Exemples de patterns
Au départ du processus de transformation :
est la racine du document
4
dont le pattern est « / »
,
Il est donc bon (mais pas indispensable) d’avoir une règle avec
pattern « / ».
en prenant n’importe quel nœud, l’évaluation de « / » est
donc la règle s’applique.
Il existe une règle
Les attributs d’un élément : attribute
Cette restriction garantit qu’on peut savoir si une règle doit être
déclenchée pour un noeud uniquement en regardant les
ancêtres de , ce qui diminue considérablement la compléxité du
l’algorithme de séléction.
Exemple : la règle pour la racine
Le nœud-contexte
Les fils d’un élément : child
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
/COURS/ENSEIGNANTS : la règle s’applique à tous les nœuds
ENSEIGNANTS fils d’un élément racine COURS
//SEANCE[@ID=2] ; ... à tous les nœuds de type SEANCE
ayant un attribut ID valant 2
/descendant::FILM[1] : ... au premier élément de type
FILM dans le document
FILM[1] : ... aux premiers fils de type FILM (il peut y en avoir
plusieurs!)
/COURS[@CODE="TC234"] : ... aux cours avec le code
TC234
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
73
75
Règles par défaut
Règle par défaut pour les autres types de
nœuds
Quand aucune règle n’est sélectionnée, XSLT applique des règles
par défaut
Pour les instructions de traitement et les commentaires, on ne
produit rien.
Première règle pour les éléments et la racine du document.
<xsl:template match="processing-instruction() |
comment()"/>
<xsl:template match="* | /">
<xsl:apply-templates/>
</xsl:template>
on demande l’application de règles pour les fils du nœud
courant.
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
74
76
Règle par défaut pour les noeuds texte et les
attributs
Conséquence
Si on se contente des règles par défaut, on obtient la
concaténation de nœuds de type Text.
Par défaut, on insère dans le document résultat la valeur du nœud
Text, ou de l’attribut.
<xsl:template match="text() | @*">
<xsl:value-of select="."/>
</xsl:template>
Programme minimal :
1
2
3
4
5
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>
NB : le programme n’affiche pas les attributs (pourquoi ?)
Cela suppose (surtout pour les attributs) d’avoir utilisé un
xsl:apply-templates sélectionnant ces nœuds.
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
77
79
L’instruction xsl:apply-templates
Exemple : filtre de certains nœuds
Attributs : select, mode et priority.
1
2
3
select doit sélectionner un ensemble de nœuds. Ils
constituent le contexte d’évaluation
4
5
6
pour chaque nœud on va chercher la règle à instancier.
7
8
9
10
11
12
13
mode permet de choisir explicitement une des règles parmi
celles qui sont candidates
priority permet de définir une priorité pour que le
processeur choisisse.
14
15
16
17
<?xml version="1.0" encoding="ISO-8859-1"?>
<FILM>
<TITRE>Vertigo</TITRE>
<ANNEE>1958</ANNEE><GENRE>Drame</GENRE>
<MES>Alfred Hitchcock</MES>
<RESUME>Scottie Ferguson, ancien inspecteur de
police, est sujet au vertige depuis qu’il a vu
</RESUME>
</FILM>
<FILM>
<TITRE>Alien</TITRE>
<ANNEE>1979</ANNEE><GENRE>Science-fiction</GENRE>
<MES>Ridley Scott</MES>
<RESUME>Près d’un vaisseau spatial échoué sur
une lointaine planète, des Terriens en mission
</RESUME>
</FILM>
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
78
80
Sélection d’une règle
Que faire quand plusieurs règles sont candidates pour un même
nœud ?
il existe des priorités implicites qui permettent au processeur
de choisir
on peut aussi donner explicitement une priorité
si le choix est impossible : le processeur s’arrête.
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Le programme XSLT
Effacer les noeuds de type RESUME :
<xsl:template match="RESUME"/>
<xsl:template match="@*|node()" priority="-1">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
81
83
Priorités implicites
Exemple : création de liens HTML
Intuition : plus c’est « spécifique », plus c’est prioritaire
Priorité 0 : les patterns constitués d’une seule étape XPath,
avec un nom d’élément ou d’attribut et sans prédicat
On peut créer des ancres « internes » à un document.
Priorité -0.5 les filtres autres qu’un nom d’élément ou d’attribut
ont une priorité égale à -0,5 ( node(), *)
On peut ensuite créer un lien vers cette ancre
<a name=’Alien’/>
<a href=’#Alien’>Lien vers le film Alien</A>
Tous les autres ont une priorité de 0.5 (prédicats, plusieurs
étapes)
Objectif : une règles pour créer les liens, une autre pour créer les
ancres.
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
82
84
Les modes
Raison d’être : un même nœud peut être traité plusieurs fois.
Exemple :
On parcourt tous les chapitres et sections pour produire une
table des matières.
On les parcourt à nouveau pour publier le contenu.
Donc il faut des règles différentes s’appliquant aux même nœuds :
on les distingue par le mode.
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Les deux règles
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<xsl:template match="FILM" mode="Ancres">
<a href="#{TITRE}">
<xsl:value-of select="TITRE"/>
</a>
</xsl:template>
<xsl:template match="FILM">
<a name="{TITRE}"/>
<h1><xsl:value-of select="TITRE"/></h1>
<b><xsl:value-of select="TITRE"/>,</b>
<xsl:value-of select="GENRE"/>
<br/>
<b>Réalisateur</b> :
<xsl:value-of select="MES"/>
</xsl:template>
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
85
87
Jointures intra-document
L’appel des règles
Deux types d’éléments :
1
7
8
9
10
11
12
<xsl:template match="FILMS">
<html>
<head><title>Liste des films</title></head>
<body bgcolor="white">
<xsl:apply-templates select="FILM"
mode ="Ancres"/>
<xsl:apply-templates select="FILM"/>
</body>
</html>
</xsl:template>
2
3
4
5
6
Résultat
FILM avec un attribut @MES (référence vers le metteur en
scène)
ARTISTE avec un attribut @ARTID (identificateur)
<xsl:template match="FILM">
Titre:
<xsl:value-of select="TITRE"/>
Metteur en scène:
<xsl:value-of select="//ARTISTE
[@ARTID=current()/@MES]/NOM"/>
</li>
</xsl:template>
Pourquoi on a besoin de la fonction current()?
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
86
88
Jointures inter-document
Résumé : sélection d’une règle
Deux documents :
un des nœud sélectionnés.
On teste le pattern pour savoir si le nœud satisfait la règle.
On prend celle qui a la plus grande priorité.
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
On ne prend que les règles avec le même mode que
xsl:apply-templates
Soit un xsl:apply-templates, et
Films.xml : FILM avec un attribut @MES (référence vers le
metteur en scène)
Artistes.xml : ARTISTE avec un attribut @ARTID
(identificateur)
<xsl:template match="FILM">
Titre:
<xsl:value-of select="TITRE"/>
Metteur en scène:
<xsl:value-of select="document(’Artistes.xml’)//ARTISTE
[@ARTID=current()/@MES]/NOM"/>
</li>
</xsl:template>
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
89
Conclusion sur XSLT
Un langage totalement adapté au traitement de documents XML
Parcours d’un document, vu comme un arbre
Déclenchement de règles sur certains nœuds
Association de plusieurs programmes à un même document
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann
90
Bibliographie sur XSLT
1. Recommendation XSLT sur le site du W3C
2. B. Amann et P. Rigaux, Comprendre XSLT, O’Reilly
http://cortes.cnam.fr:8080/XSLT
3. P. Wadler, A formal semantics of patterns in XSLT
Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann