Académique Documents
Professionnel Documents
Culture Documents
XSLT avancé
L3Pro BDISE – XML
Mathieu Sassolas
Année 2016-2017
Cours 4
Plan de la séance
XPath &
XSLT avancé
M. Sassolas
L3Pro
1 La spécification des chemins avec XPath
Cours 4 Principe général
XPath
Les axes
XSLT avancé Les filtres
Les expressions pour les tests et prédicats
Mise en application
2 / 26
But de XPath
XPath &
XSLT avancé
M. Sassolas
L3Pro
Cours 4
XSLT avancé
I Langage pour les conditions des test (xsl:when,
xsl:if. . .).
3 / 26
But de XPath
XPath &
XSLT avancé
M. Sassolas
L3Pro
Cours 4
XSLT avancé
I Langage pour les conditions des test (xsl:when,
xsl:if. . .).
,→ Parcours dans l’arbre avec des tests sur le chemin.
3 / 26
Principe de base
XPath &
XSLT avancé
M. Sassolas
L3Pro
I Un chemin est une suite d’étapes :
Cours 4
XPath
Syntaxe d’un chemin
Principe
Axes
[/]etape1/etape2/.../etapeN
Filtres
Expressions I Dans chaque étape, on navigue dans l’arbre selon des
Mise en application
axes : père, fils, frère. . .
XSLT avancé
I On peut également filtrer selon le type de nœud.
I On peut enfin demander que des prédicats soient vérifiés.
4 / 26
Les axes
Partie I
XPath &
XSLT avancé
M. Sassolas
L3Pro
C’est juste de l’anglais !
Cours 4
self Le nœud courant.
XPath
Principe
attribute Les attributs du nœud courant.
Axes
Filtres child Les fils.
Expressions
Mise en application descendant Les descendants (fils, petit-fils,. . .).
XSLT avancé
descendant-or-self Les descendants ou le nœud courant.
parent Le père.
ancestor Les ancêtres (père, grand-père,. . .) ; en particulier
la racine est toujours un tel nœud.
ancestor-or-self Les ancêtres ou le nœud courant.
5 / 26
Les axes
Partie II
XPath &
XSLT avancé
M. Sassolas
L3Pro
Cours 4
following-sibling Les frères suivants.
XPath
Principe
preceding-sibling Les frères précédents.
Axes
Filtres following Les nœuds suivants, frères ou non (suivant dans
Expressions
Mise en application la lecture XML).
XSLT avancé
preceding Les nœuds précédents, frères ou non (précédant
dans la lecture XML).
namespace Les nœuds ayant le même espace de nom que le
nœud courant.
6 / 26
Les types de nœuds
XPath &
XSLT avancé
M. Sassolas
L3Pro
Pour XPath, tout est un nœud (node), mais il y en a plusieurs
Cours 4 types : attributs, éléments, texte, commentaire
XPath (principalement).
Principe
Axes I Tous les nœuds : node().
Filtres
Expressions
Mise en application
I Tous les types d’attributs : * (lorsque l’on navigue dans
XSLT avancé l’axe attribut)
I Tous les types d’éléments : * (sinon)
I Un type d’élément particulier : MonElement.
I Les nœuds de type texte : text().
I Les nœuds de type commentaire : comment().
7 / 26
Exemples
XPath &
XSLT avancé
M. Sassolas
L3Pro
child::monElement Tous les fils de type monElement
Cours 4
(équivalent abrégé : monElement).
XPath
Principe parent::node()/attribute::* Tous les attributs du nœud
Axes
Filtres père (équivalent abrégé : ../@*).
Expressions
Mise en application descendant-or-self::comment() Tous les commentaires se
XSLT avancé
trouvant dans les descendants au sens large
(équivalent abrégé : //comment()).
descendant::text() Tous le texte (càd #PCDATA) dans les
descendants stricts (équivalent abrégé :
*//text()).
8 / 26
Les expressions
Partie I
XPath &
XSLT avancé
,→ Servent dans les test="... " et dans les prédicats :
M. Sassolas
axe::filtre[prédicat].
L3Pro
elt Présence d’un élément fils de type elt (peut être
Cours 4
un chemin XPath plus complexe. . .).
XPath
Principe
@attribut Présence d’un attribut de type attribut.
Axes
Filtres @attribut = ’texte’ Teste si la valeur de l’attribut
Expressions
Mise en application
attribut est égale à au texte texte.
XSLT avancé @attribut != ’texte’ Teste si la valeur de l’attribut
attribut est différente du texte texte.
@attribut <op> valeur où <op> ∈ {<, <=, >,
>=, =, !=} et valeur est un entier.
Remarque
On peut tester également la valeur d’un élément, mais ça ne
9 / 26 prend pas que la partie texte : il faut utiliser element/texte().
Les expressions
Partie II
XPath &
XSLT avancé On peut manipuler un peu plus les valeurs d’attribut (et
M. Sassolas d’éléments) via des fonctions.
L3Pro
XSLT avancé
I Opérations de traduction : translate(texte,
caractère_à_remplacer,remplacer_par)
,→ Le remplacement fonctionne caractère par caractère et
est sensible à la casse !
Exemple
translate(’Abracadabra’,’ba’,’zo’) Azrocodozro
translate(’Abracadabra’,’ba’,’z’) Azrcdzr
10 / 26
Les expressions
Partie III
XPath &
XSLT avancé
I Le nœud courant : current().
M. Sassolas Attention !
L3Pro
XSLT avancé
11 / 26
Les expressions
Partie III
XPath &
XSLT avancé
I Le nœud courant : current().
M. Sassolas Attention
<xsl:templat !
e match= "pere">
L3Pro
Current:N’est
Cours 4
<xsl:v
pasalue-o
relatif au
f chemin Xpath en cours d’évaluation !
select
XPath
="fils [curre nt()/@ prefere = @code]/@nom"/>
Self ou équivalents:
Principe
Axes
self::node() <xsl:value-of
Filtres
Expressions
select="fils[self::node()/@prefere = @code]/@nom"/>
Mise en application
.avancé
XSLT <xsl:value-of select="fils[./@prefere = @code]/@nom"/>
'rien'
<xsl:value-of select="fils[@prefere = @code]/@nom"/>
</xsl:template>
11 / 26
<pere prefere="GG" code="PP">
Les expressions
code="DD" nom="Dédé" prefere="PP"/>
<fils
Partie III
<fils code="GG" nom="Gégé" prefere="DD"/>
<fils code="TT" nom="Toto" prefere="TT"/>
XPath &
XSLT avancé
I Le >nœud courant : current().
</pere
M. Sassolas Attention
<xsl:templat !
e match= "pere">
L3Pro
Current:N’est
Cours 4
<xsl:v
pasalue-o
relatif au
f chemin Xpath en cours d’évaluation !
select
XPath
="fils [curre nt()/@ prefere = @code]/@nom"/>
Self ou équivalents:
Principe
Axes
self::node() <xsl:value-of
Filtres
Expressions
select="fils[self::node()/@prefere = @code]/@nom"/>
Mise en application
.avancé
XSLT <xsl:value-of select="fils[./@prefere = @code]/@nom"/>
'rien'
<xsl:value-of select="fils[@prefere = @code]/@nom"/>
</xsl:template>
11 / 26
<pere prefere="GG" code="PP">
Les expressions
code="DD" nom="Dédé" prefere="PP"/>
<fils
Partie III
<fils code="GG" nom="Gégé" prefere="DD"/>
<fils code="TT" nom="Toto" prefere="TT"/>
XPath &
XSLT avancé
I Le >nœud courant : current().
</pere
M. Sassolas Attention
<xsl:templat !
e match= "pere">
L3Pro
Current:N’est
Cours 4
<xsl:v
pasalue-o
relatif au
f chemin Xpath en cours d’évaluation !
select
XPath
="fils [curre nt()/@ prefere = @code]/@nom"/>
Self ou équivalents:
Principe
Axes
self::node() <xsl:value-of
Filtres
Expressions
select="fils[self::node()/@prefere = @code]/@nom"/>
Mise en application
.avancé
XSLT <xsl:value-of select="fils[./@prefere = @code]/@nom"/>
'rien'
<xsl:value-of select="fils[@prefere = @code]/@nom"/>
</xsl:template>
Current: Gégé
Self ou équivalents:
self::node() Toto
. Toto
11 / 26
’rien’ Toto
Les expressions
Partie III
XPath &
XSLT avancé
I Le nœud courant : current().
M. Sassolas Attention !
L3Pro
XSLT avancé
11 / 26
Les expressions
Partie III
XPath &
XSLT avancé
I Le nœud courant : current().
M. Sassolas Attention !
L3Pro
XPath &
XSLT avancé I Sur les chaı̂nes de caractères :
M. Sassolas
L3Pro contains(contenant,contenu) Si le contenant
Cours 4 contient le contenu. Sensible à la casse !
XPath concat(chaine1,chaine2,...) Concaténation de
Principe
Axes chaı̂nes.
Filtres
Expressions
substring(chaine,pos,longueur) Sous-chaı̂ne de
Mise en application
longueur long à partir de la position pos.
XSLT avancé
I Fonctions numériques :
count(chemin/Xpath) Compte le nombre de nœuds
désignés par le chemin XPath.
sum(chemin/Xpath) Fait la somme des valeurs des
nœuds désignés par le chemin XPath (n’a du
sens que si le contenu du chemin sont des
12 / 26
nombres).
Remarques
XPath &
XSLT avancé
M. Sassolas
I Il existe d’autres fonctions que celles présentées.
L3Pro
Cours 4 Attention
XPath On utilise XSLT 1.0, des fonctions trouvées dans des docs
Principe
Axes pourraient ne fonctionner que dans XSLT 2.0.
Filtres
Expressions
Mise en application
XSLT avancé
13 / 26
Remarques
XPath &
XSLT avancé
M. Sassolas
I Il existe d’autres fonctions que celles présentées.
L3Pro
Cours 4 Attention
XPath On utilise XSLT 1.0, des fonctions trouvées dans des docs
Principe
Axes pourraient ne fonctionner que dans XSLT 2.0.
Filtres
Expressions
Mise en application I Les prédicats s’évaluent dans le contexte local :
XSLT avancé pere/fils[@attr="42"] teste la valeur de l’attribut
attr du fils.
I Les enchaı̂nement de prédicats ne fonctionnent pas
exactement comme des conjonction : elt[pred1][pred2]
teste pred2 sur les nœuds désignés par elt[pred1]
Attention en particulier lors de tests avec position().
13 / 26
Remarques
XPath &
XSLT avancé
M. Sassolas
I Il existe d’autres fonctions que celles présentées.
Encha^ ınement:
L3Pro
Cours 4Attention
<xsl:value-o f
XPath select On utilise XSLT 1.0, des fonctions trouvées dans des docs
Principe
="viande[@gras = ’no’][position() = 1]/@id"/>
Axes [end] pourraient ne fonctionner que dans XSLT 2.0.
Filtres
Conjonction:
Expressions
I Les prédicats s’évaluent dans le contexte local :
Mise en application
<xsl:value-of
XSLT avancé pere/fils[@attr="42"] teste la valeur de l’attribut
select="viande[@gras = ’no’ and position() = 1]/@id"/>
attr du fils.
[end]
I Les enchaı̂nement de prédicats ne fonctionnent pas
exactement comme des conjonction : elt[pred1][pred2]
teste pred2 sur les nœuds désignés par elt[pred1]
Attention en particulier lors de tests avec position().
13 / 26
Remarques gras="yes" id="1"/>
<viande
<viande gras="no" id="2"/>
<viande gras="no" id="3"/>
XPath &
XSLT avancé <viande gras="yes" id="4"/>
M. Sassolas
I Il existe d’autres fonctions que celles présentées.
Encha^ ınement:
L3Pro
Cours 4Attention
<xsl:value-o f
XPath select On utilise XSLT 1.0, des fonctions trouvées dans des docs
Principe
="viande[@gras = ’no’][position() = 1]/@id"/>
Axes [end] pourraient ne fonctionner que dans XSLT 2.0.
Filtres
Conjonction:
Expressions
I Les prédicats s’évaluent dans le contexte local :
Mise en application
<xsl:value-of
XSLT avancé pere/fils[@attr="42"] teste la valeur de l’attribut
select="viande[@gras = ’no’ and position() = 1]/@id"/>
attr du fils.
[end]
I Les enchaı̂nement de prédicats ne fonctionnent pas
exactement Enchaînement:
comme des conjonction : elt[pred1][pred2]
2 [end]
teste pred2 sur les nœuds désignés par elt[pred1]
Conjonction:
Attention en particulier lors de tests avec position().
[end]
13 / 26
Fin du cours sur XPath
XPath &
XSLT avancé
M. Sassolas
L3Pro
Cours 4
XPath
XSLT avancé
14 / 26
XPath &
XSLT avancé
M. Sassolas
L3Pro
Cours 4
XPath
Principe
Axes
Filtres
Expressions
Mise en application
XSLT avancé
15 / 26
Tri des éléments
XPath &
XSLT avancé
M. Sassolas
Syntaxe (abrégée)
L3Pro
<xsl:sort select="champ_pour_trier"
Cours 4
[order="ascending|descending"]
XPath
[data-type="text|number"]/>
XSLT avancé
Tri
Variables et
paramètres
Petites astuces
I Au sein d’une boucle for-each ou d’un
Mise en application apply-templates.
I Le champ pour trier est un chemin XPath relatif aux
nœuds sélectionnés par le for-each ou
l’apply-templates.
I On peut les enchaı̂ner : on trie d’abord selon le premier
critère puis selon le second en cas d’égalité, etc.
16 / 26
Tri des éléments
XPath &
XSLT avancé
M. Sassolas
Syntaxe (abrégée)
L3Pro
<xsl:a pply-tselect="champ_pour_trier"
<xsl:sort emplates>
Cours 4
<xsl:sort select="@gra [order="ascending|descending"]
s"/>
XPath
<xsl:sort select="@note"[data-type="text|number"]/>
data-type="number"/>
XSLT avancé
Tri
</xsl:apply-templates>
Variables et
paramètres . . . I Au sein d’une boucle for-each ou d’un
Petites astuces
Mise en application
<xsl:tapply-templates.
emplate match="viande">
<xsl:value-of select="@id"/>;
I Le champ pour trier est un chemin XPath relatif aux
</xsl:template>
nœuds sélectionnés par le for-each ou
l’apply-templates.
I On peut les enchaı̂ner : on trie d’abord selon le premier
critère puis selon le second en cas d’égalité, etc.
16 / 26
e gras="yes" id="1" note="C"/>
Tri<viand
des éléments
<viande gras="no" id="2" note="B"/>
<viande gras="no" id="3" note="A"/>
XPath & <viande gras="yes" id="4" note="B"/>
XSLT avancé
M. Sassolas
Syntaxe gras="maybe" id="5" note="A"/>
<viande(abrégée)
L3Pro
<xsl:a pply-tselect="champ_pour_trier"
<xsl:sort emplates>
Cours 4
<xsl:sort select="@gra [order="ascending|descending"]
s"/>
XPath
<xsl:sort select="@note"[data-type="text|number"]/>
data-type="number"/>
XSLT avancé
Tri
</xsl:apply-templates>
Variables et
paramètres . . . I Au sein d’une boucle for-each ou d’un
Petites astuces
Mise en application
<xsl:tapply-templates.
emplate match="viande">
<xsl:value-of select="@id"/>;
I Le champ pour trier est un chemin XPath relatif aux
</xsl:template>
nœuds sélectionnés par le for-each ou
l’apply-templates.
I On peut les enchaı̂ner : on trie d’abord selon le premier
critère puis selon le second en cas d’égalité, etc.
16 / 26
e gras="yes" id="1" note="C"/>
Tri<viand
des éléments
<viande gras="no" id="2" note="B"/>
<viande gras="no" id="3" note="A"/>
XPath & <viande gras="yes" id="4" note="B"/>
XSLT avancé
M. Sassolas
Syntaxe gras="maybe" id="5" note="A"/>
<viande(abrégée)
L3Pro
<xsl:a pply-tselect="champ_pour_trier"
<xsl:sort emplates>
Cours 4
<xsl:sort select="@gra [order="ascending|descending"]
s"/>
XPath
<xsl:sort select="@note"[data-type="text|number"]/>
data-type="number"/>
XSLT avancé
Tri
</xsl:apply-templates>
Variables et
paramètres . . . I Au sein d’une boucle for-each ou d’un
Petites astuces
Mise en application
<xsl:tapply-templates.
emplate match="viande">
<xsl:value-of select="@id"/>;
I Le champ pour trier est un chemin XPath relatif aux
</xsl:template>
nœuds sélectionnés5;par le for-each ou
l’apply-templates. 3;
I On peut les enchaı̂ner
2; : on trie d’abord selon le premier
critère puis selon 4;
le second en cas d’égalité, etc.
1;
16 / 26
Utilisation de variables
Version simple
XPath &
XSLT avancé
Syntaxe
M. Sassolas <xsl:variable name="nomVariable">
L3Pro
Cours 4
Du contenu <tag>potentiellement</tag> XML
</xsl:variable>
XPath
XSLT avancé
...
Tri <xsl:value-of select="$nomVariable"/>
Variables et
paramètres
Petites astuces
<xsl:copy-of select="$nomVariable"/>
Mise en application
17 / 26
Utilisation de variables
Version simple
XPath &
XSLT avancé
Syntaxe
M. Sassolas <xsl:variable name="nomVariable">
L3Pro
Cours 4
Du contenu <tag>potentiellement</tag> XML
</xsl:variable>
XPath
XSLT avancé
...
Tri <xsl:value-of select="$nomVariable"/>
Variables et
paramètres
Petites astuces
<xsl:copy-of select="$nomVariable"/>
Mise en application
17 / 26
Utilisation de variables
Version simple
XPath &
XSLT avancé
Syntaxe
M. Sassolas <xsl:variable name="nomVariable">
L3Pro
Cours 4
Du contenu <tag>potentiellement</tag> XML
</xsl:variable>
XPath
XSLT avancé
...
Tri <xsl:value-of select="$nomVariable"/>
Variables et
paramètres
Petites astuces
<xsl:copy-of select="$nomVariable"/>
Mise en application
XPath &
XSLT avancé
,→ Le contenu des variables peut aussi provenir du document
M. Sassolas
L3Pro via XSLT.
Cours 4
Exemple
XPath
XSLT avancé
<xsl:variable name="sexe">
Tri <xsl:choose>
Variables et
paramètres <xsl:when test="@genre = ’M’">
Petites astuces
Mise en application C’est un homme</xsl:when>
<xsl:when test="@genre = ’F’">
C’est une femme</xsl:when>
<xsl:otherwise>On ne sait pas:
"<xsl:value-of select="@genre"/>"</xsl:otherwise>
</xsl:choose>
</xsl:variable>
18 / 26
Utilisation de paramètres
XPath &
XSLT avancé I Les variables sont locales, elles ne peuvent être passées en
M. Sassolas paramètre dans d’autres templates.
L3Pro
Cours 4
I Les paramètres, au contraire, sont faits pour ça.
XPath
XSLT avancé
Syntaxe
Tri
Variables et
<xsl:template name="nomTemplate">
paramètres
Petites astuces
<xsl:param name="nomParametre"
Mise en application
select="’valeurParDefaut’"/>
...
</xsl:template>
...
<xsl:call-template name="nomTemplate">
<xsl:with-param name="nomParametre"
select="valeur/qui[peut/etre]/unchemin/@Xpath"/>
19 / 26 <xsl:call-template/>
Commentaires dans la sortie
XPath &
XSLT avancé
Syntaxe
M. Sassolas
L3Pro <xsl:comment>
Cours 4 Du commentaire
XPath </xsl:comment>
XSLT avancé
Tri
Variables et
paramètres
Exemple
Petites astuces
Mise en application
<xsl:template match="comment()">
<xsl:comment>
Commentaire repris du XML original:
"""
<xsl:value-of select="."/>
"""
</xsl:comment>
</xsl:template>
20 / 26
Copier des éléments du XML source
Idée
XPath &
XSLT avancé
M. Sassolas Syntaxe
L3Pro
Cours 4
<xsl:variable name="nomVariable">
XPath
Du contenu <tag>potentiellement</tag> XML
XSLT avancé
</xsl:variable>
Tri ...
Variables et
paramètres
Petites astuces
<xsl:copy>Nouveau contenu</xsl:copy>
Mise en application <xsl:copy-of select="element/ou/chemin"/>
XPath &
XSLT avancé
M. Sassolas
L3Pro Document XML
Cours 4
<elem attr="intro">Bonjour</elem>
XPath
XSLT avancé
Tri
Variables et
paramètres
Feuille XSLT
Petites astuces
Mise en application
Shallow: <xsl:copy>Au revoir</xsl:copy>
Deep: <xsl:copy-of select="."/>
Résultat
Shallow: <elem>Au revoir</elem>
Deep: <elem attr="intro">Bonjour</elem>
22 / 26
Formater du texte comme tel
XPath &
XSLT avancé
Syntaxe
M. Sassolas <xsl:text>
L3Pro
Cours 4
Du texte sans balises!
</xsl:comment>
XPath
XSLT avancé
Tri Exemple (XSLT)
Variables et
paramètres
Petites astuces
<xsl:text>Avant un truc: </xsl:text>
Mise en application
<xsl:value-of select="@note"/>
<xsl:text>. Après le truc.</xsl:text>
Exemple (Résultat)
Avant un truc: A. Après le truc.
Remarque
23 / 26
Les espaces autour de la valeur sont corrects !
Astuce
XPath &
XSLT avancé
M. Sassolas
L3Pro
Cours 4
Utiliser le navigateur comme processeur XSLT.
XPath
Commande
<?xml-stylesheet type="text/xsl"
href="FeuilleXslt.xsl"?>
24 / 26
Fin du cours
XPath &
XSLT avancé
M. Sassolas
L3Pro
Cours 4
XPath
ë C’est l’heure du TP ê
XSLT avancé
Tri
Variables et
paramètres
Petites astuces
Mise en application
25 / 26
XPath &
XSLT avancé
M. Sassolas
L3Pro
Cours 4
XPath
XSLT avancé
Tri
Variables et
paramètres
Petites astuces
Mise en application
26 / 26