Introduction au Langage de feuilles de styles extensible XSL
Transformations
XML : XPath et
XSL-XSLT
Ingénierie Documentaire
Stéphane Crozat
14 septembre 2016
Table des matières
I - Introduction à XSL-XSLT 4
1. Un langage pour publier les documents XML .. 4
2. Définition de XSL-XSLT . 4 3. Principe de XSL-XSLT . 5
II - Programmation XSL-XSLT 6
1. L'arbre du document XML . 6
2. Introduction à XPath . 7
3. Syntaxe XPath . 8
4. Syntaxe générale XSL-XSLT .. 10
5. Principales instructions XSLT . 11
6. Fonctionnement des programmes XSL-XSLT .. 12
7. Exemple : Un programme XSLT pour générer du HTML . 13
8. XSLT et namespaces . 15
9. Transformation identité 16
10. Transformation substitution de namespace .. 17 11. Approfondissement . 18
III - Exercices 20
1. Exercices XSLT . 21
1.1. Exercice : CV . 21
1.2. Exercice : Poème .. 22
1.3. Exercice : Glossaire II . 24
1.4. Exercice : Namespaces et FO . 25 1.5. Exercice : Bulletins météo .. 26 2. Quiz XSLT et XPath .. 29
2.1. Exercice .. 29 2.2. Exercice .. 30
2.3. Exercice .. 31
Solutions des exercices 33 Bibliographie 42
Introduction à XSL-XSLT
Introduction à XSLXSLT
1. Un langage pour publier les documents XML
XML lorsqu'il est utilisé pour définir des formats documentaire métier est un format de représentation de l'information, et non un format de publication (de présentation) de cette information : donc un tel fichier XML n'est pas utilisable tel que par un lecteur.
XML ne peut donc être utilisé pour des langages abstrait que si l'on est capable de transformer les documents sources en document publiés lisibles grâce à un format de présentation : HTML par exemple dans le cas de publication Web, ou PDF pour l'impression.
2. Définition de XSL-XSLT
Définition : XSL-XSLT
XSL-XSLT est une partie du standard W3C XSL qui a trait à la transformation des documents XML (l'autre partie étant XSL-FO).
XSL-XSLT est un langage de programmation déclaratif écrit en XML (un programme XSL-XSLT est un document XML).
- XSL-XSLT est langage de manipulation de document XML (fondé sur XPath et sur le modèle arborescent de représentation des documents XML)
- XSl-XSLT est utilisé pour transformer un document XML source dans un autre format, typiquement HTML, mais aussi tout autre format codé sur des caractères dont la syntaxe est connue.
- XSL-XSLT est aussi utilisé pour faire des changements de schéma XML (export d'un XML vers un autre XML structuré différemment) par exemple pour échanger des données selon un standard.
Remarque : XSL-XSLT, XSL-FO, XSLT, XSL, FO
On parle souvent (par simplification) de XSL ou de XSLT pour désigner XSL-XSLT et de FO pour désigner XSL-FO.
XSL utilisé seul désigne donc par convention XSL-XST (et non XSL-FO).
Principe de XSL-XSLT
3. Principe de XSL-XSLT
XSL-XSLT fonctionne selon le principe suivant :
1. Il prend en entrée un fichier XML bien formé
2. Il livre en sortie un fichier texte (XML, HTML ou texte sans balise)
Algorithme
L'algorithme général de XSL-XSLT est :
1. Il sélectionne (match) les éléments XML du fichier source.
2. Pour chaque élément reconnu il génère une sortie sur le fichier cible.
Notion de règle
Un programme XSL-XSLT est composé d'une succession de règles.
Chaque règle est indépendante des autres et à en charge de sélectionner un élément dans la source et d'effectuer une écriture dans la cible.
Exemple : Application d'une règle XSL-XSLT
Sources :
Règle XSL-XSLT :
1 2 3 |
??BONJOUR
|
Résultat :
1 | BONJOUR BONJOUR |
Programmation XSL-XSLT
Programmation XSL-
XSLT
1. L'arbre du document XML
Il est possible de représenter un document XML sous forme d'arbre, tel que :
- L'arbre possède une racine / qui a comme fils l'élément racine
- l'élément racine est l'élément du document XML qui contient tous les autres
- chaque nœud a comme fils les éléments et le texte qu'il contient, ainsi que ses attributs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
? ?? ???L'assurance de la responsabilité de voisinage ???21/02/01 ???AEA ???1.00 ?? ? ? ?? ???Cette garantie est appelée : recours des voisins et des tiers. ??? ????L'image suivante montre la garantie. ??? ?? ?
|
16 17 18 19 |
1 2 3 4 5 6 7 8 | / ?|document ???|@modele = "ULCoursGeneral" ???|@code = "BP-Incendie3_S1_E2_UL1" ???|entete ?????|identification ???????|titre ?????????|text() = "L'assurance de " |
Introduction à XPath
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ???????|date ?????????|text() = "21/02/01" ???????|auteur ?????????|text() = "AEA" ???????|version ?????????|text() = "1.00" ?????|corps ???????|contenu ?????????|paragraphe ???????????|text() = "Cette garantie " ?????????|remarque ?????????|paragraphe ???????????|text() = "L'image suivante" ???????????|ressource ?????????????|@URIsrc = "" ?????????????|@titre = "Recours des voisins " ?????????????|@type = "image" ???????????|text() = "montre la garantie." |
L'ensemble des nœuds de l'arbre d'un document est muni d'un ordre, qui est celui de l'ordre dans le document XML sérialisé.
2. Introduction à XPath
Définition : Expression XPath
XPath est un langage d'expressions permettant de pointer sur n'importe quel élément d'un arbre XML depuis n'importe quel autre élément de l'arbre.
- Une expression XPath peut-être absolue (sa résolution est indépendante d'un contexte ou nœud courant : elle commence dans ce cas par /.
- Une expression XPath peut-être relative (sa résolution est dépendante d'un contexte ou nœud courant : elle ne commence dans ce cas pas par /, elle peut commencer par ./ (syntaxe développée).
1 2 3 4 | /document/entete/identification/titre /document/@modele corps//contenu contenu/* |
Syntaxe XPath
5 6 7 | contenu/remarque[1] ../paragraphe @type |
Complément : Types de nœuds XPath
- root nodes
- element nodes
- text nodes
- attribute nodes
- namespace nodes
- processing instruction nodes
- comment nodes
Pour une introduction à XPath : Brillant07 ** pp.123-129
L'arbre du document XML (cf. p.6) Syntaxe XPath (cf. p.8)
3. Syntaxe XPath
Définition : Pas de localisation
Une expression XPath est composée de plusieurs pas de localisation successifs séparés par des /.
Un pas de localisation est caractérisé par :
- un axe,
- un test de nœud,
- un prédicat (éventuellement aucun ou plusieurs).
1 | pas-de-localisation-1/ /pas-de-localisation-N |
1 | axe::test-de-nœud[prédicat] |
- / : sélectionne la racine (expression absolue)
- . : sélectionne le nœud courant (expression relative)
- child::x ou x ou ./x : sélectionne les éléments fils "x"
Syntaxe XPath
- child::x/child::y ou ./x/y ou x/y : sélectionne les éléments y fils de l'élément fils x
(petits fils)
- attribute::a ou ./@a ou @a : sélectionne l'attribut "a" du nœud courant
- child::* ou ./* ou * : sélectionne tous les éléments fils
- attribute::* ou ./*@ ou *@: sélectionne tous les attributs
- child::text() ou ./text() ou text() : sélectionne les nœuds de type texte
- parent::x ou ../x : sélectionne le père "x" (ancestor::x sélectionne les ancêtres "x")
- descendant::x ou .//x : sélectionne tous les descendants "x" (enfants, petits enfants, etc.)
- preceding::x, following::x : sélectionne les nœuds précédents ou suivants dans le document (ordre), à l'exclusion des ancêtres (et des attributs)
- preceding-sibling::x, following-sibling::x : similaire à preceding et following, mais pour les nœuds de même niveau uniquement ("fratrie")
Pour bien visualiser le fonctionnement des axes, voir XML : Cours et exercices ** , p.124 (Figures 51 et 5-2).
- Carré rouge : Le point de départ
- Carré gris numéroté : Nœud sélectionné (avec son ordre de sélection)
- Carré gris non numéroté ; Nœud non sélectionné
Illustration des axes XPath (Brillant 07)
Syntaxe générale XSL-XSLT
- x[1], x[2], etc. : sélectionne le premier x, le second x, etc.
- x[last()] : sélectionne le dernier x
- x[@a='valeur'] : sélectionne les x tels que leur attribut a est égal à "valeur"
- x[y=1] : sélectionne les x tels qu'ils ont un élément fils y égal à 1
- x[@a='v1' and @b='v2'] : sélectionne tous les x tels que leurs attributs a et b sont respectivement égaux à v1 et v2
- x[y or z] : sélectionne tous les x tels qu'ils possède un élément fils y ou z
Il est possible d'unifier deux expressions XPath en utilisant | :
- x | y : sélectionne les éléments x et les éléments y
- x[y] | x[z] : sélectionne les éléments x tels qu'ils contiennent un y ou un z (équivalent ici à x[y or z])
La fonction current() permet de renvoyer le nœud courant dans le contexte d'une exécution XSLT.
Cela permet de différencier :
- elem1[@att1=@att2] : Les elem1 qui ont deux attributs att1 et att2 égaux
- et elem1[@att1=current()/@att2] : Les elem1 qui ont un attribut att1 égal à l'attribut att2 du nœud courant
Complément : Liste des fonctions XPath
4. Syntaxe générale XSL-XSLT
Syntaxe : Structure générale d'un programme XSl-XSLT
1 2 3 4 5 6 7 8 9 10 11 |
?? ?? ???? ?? ?? ???? ?? ??
|
Principales instructions XSLT
1 2 3 |
??Instruction XSLT et/ou génération de texte sur la sortie |
5. Principales instructions XSLT
Fondamental : Les deux instructions de base
- : Relance les règles du programme sur le sous-arbre pointé par le select (fondement de la récursivité)
- : Génère le texte contenu dans le nœud ou attribut pointé par le select
{XPATH} : Génère le texte contenu dans le nœud ou attribut pointé par le XPath entre accolades (alternative à xsl:value-of à utiliser dans la génération d'attributs exclusivement, par exemple :
Autres instructions courantes
- : Génère le sous-arbre pointé par le select
- : Ne s'exécute que si test est vrai
- : Exécute pour chaque sousarbre renvoyé par le select
Complément : Extension XPath "document()"
document(chemin-accès) où chemin d'accès permet d'accéder à un fichier sur le disque.
Par exemple :
- document("c:\")//x : Tous les éléments x présents dans le fichier .
- document(child::source)/* : La racine du document XML pointé par l'expression XPath child::source.
Complément : Déclaration explicite sur la cible
- contenu
- valeur
- chaîne de caractère
Complément : Références synthétiques Fonctionnement des programmes XSL-XSLT
6. Fonctionnement des programmes XSL-XSLT
La récursivité
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ?? ?? ??
?? ?? ??
?? ?? ??
|
Règles par défaut
XSLT comporte trois règles par défaut qui sont appliquées quand aucune règle du programme n'est sélectionnée.
1. La première règle s'applique à la racine et à tous les éléments et déclenche un appel récursif sur tous les fils du nœud courant :
2. La deuxième règle s'applique aux nœuds texte et aux attributs et insère le résultat textuel de ces nœuds dans le document résultat :
template>
3. La troisième règle s'applique aux commentaires et aux instructions de traitement et les ignore
:
Exemple : Le programme XSLT minimal
1 2 |
|
Exemple : Un programme XSLT pour générer du HTML
Veiller à bien traiter tous les cas.
Court-circuiter les règles par défaut, en générant des messages d'erreurs sur la sortie.
Complément : Mode, priorité, règles nommées
- priority : permet de surcharger les règles de priorité par défaut
- mode : permet de définir plusieurs règles pour une même prémisse et de choisir explicitement celle que l'on veut au moment de l'appel
- name : permet de définir des templates nommés, qui sont appelés explicitement (comme des fonctions) par l'instruction et non plus seulement par le moteur de récursivité.
Complément : Priorité entre les règles
- Si un attribut priority est défini sur la règle, la règle est prioritaire, l'attribut le plus élevé est prioritaire sur le moins élevé.
- Sinon, c'est celle dont le XPath est le plus spécifique d'abord (expression d'un axe, d'un prédicat)
Exemple :
7. Exemple : Un programme XSLT pour générer du HTML
1 2 3 4 5 6 7 |
XML est un format de représentation de l'information.
XML n'est pas un format de présentation.
XSLT est un langage de manipulation de documents XML.
XSLT est utilisé pour exporter une source XML sous un autre format, par exemple HTML.
|
8 9 10 11 12 13 14 | |
15 | |
16 17 |
Exemple : Un programme XSLT pour générer du HTML
Exemple : Fichier HTML cible souhaité
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
XSLT
XSLT : Un besoin
XML est un format de représentation de l'information.
XML n'est pas un format de présentation.
XSLT : Un langage
XSLT est un langage de manipulation de documents XML.
XSLT est utilisé pour exporter une source XML sous un autre format, par exemple HTML
|
Exemple : Programme XSLT permettant la transformation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
? ? ?? ??? ???? ???? ??? ??? ???? ??? ?? ?
? ?? ?? ?
? ?? ? |
XSLT et namespaces
32 33 34 35 36 37 |
? ?? ?
|
8. XSLT et namespaces
Exemple : Le problème
Soit le fichier XML et un programme XSLT associé. La transformation ne fonctionne pas comme prévue, car la règle essaye de matcher document, alors que le nom développé est : document.
1 2 3 4 |
Mon texte
|
1 2 3 4 5 6 7 8 9 |
xmlns:xsl="; version="1.0">
|
En XSLT 1.0, il faut matcher le nom des éléments en utilisant explicitement les namespaces : 1. Il faut déclarer l'espace de nom dans la feuille XSLT
Exemple :
2. Il faut que les noms d'éléments soient préfixés
Exemple :
1 2 3 4 5 6 7 8 9 10 11 |
xmlns:xsl="; version="1.0" xmlns:d="">
|
Transformation identité
Exemple : Solution en XSLT 1.0 avec namespace cible
1 2 3 4 5 6 7 8 9 10 11 |
xmlns:xsl="; version="1.0" xmlns:d="">
|