0% ont trouvé ce document utile (0 vote)
8 vues114 pages

Introduction à XSLT et transformation XML

Le document présente XSLT, un langage de transformation d'arbre basé sur XML, utilisé pour transformer des documents d'un format à un autre. Il décrit les éléments fondamentaux d'une feuille de style XSLT, les règles de réécriture, et fournit des exemples pratiques de transformation de données. XSLT permet une manipulation avancée des documents XML à travers des modèles et des expressions XPath.

Transféré par

mimaaaa
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPT, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
8 vues114 pages

Introduction à XSLT et transformation XML

Le document présente XSLT, un langage de transformation d'arbre basé sur XML, utilisé pour transformer des documents d'un format à un autre. Il décrit les éléments fondamentaux d'une feuille de style XSLT, les règles de réécriture, et fournit des exemples pratiques de transformation de données. XSLT permet une manipulation avancée des documents XML à travers des modèles et des expressions XPath.

Transféré par

mimaaaa
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPT, PDF, TXT ou lisez en ligne sur Scribd

XSLT

Langage de transformation d’arbre

Yves Bekkers

Mise à jour : 16 avril 2025

XSLT - Yves bekkers - IFSIC 1


Plan
• Introduction
• Prélude d'une feuille de style
• Règles de réécriture : Template,
• Parcours récursifs
• Règles par défaut
• Parcours itératifs
• Modularité
• Variables, Tri, conditionnelle, passage de paramètres
• Définition de fonctions récursives
• Les clés - un mécanisme d'indexation de documents

XSLT - Yves bekkers - IFSIC 2


Transformation de documents
• XSL (eXtensible Stylesheet Language)
• Deux normes indépendantes
– XSLT : langage de transformation
• XPath : langage pour adresser les nœuds d’un arbre
– XSL-FO : langage de formatage
• Permet de spécifier un formatage plus fin que celui
que l'on obtient à l'aide de HTML+CSS

XSLT - Yves bekkers - IFSIC 3


XSLT le langage de transformation
• Un langage déclaratif (Turing complet !)
– avec une syntaxe XML !
• Les programmes XSLT s'appellent des feuilles de
styles
– Mais c'est beaucoup plus puissant que CSS
– Exprime une transformation d'arbre en un autre arbre
• Modèle de calcul
– Utilise une technique de filtrage à base de motifs
(patterns) et de modèles (template) décrits dans des
règles (template rules) pour transformer des arbres

XSLT - Yves bekkers - IFSIC 4


XSLT = Transformation d’arbre
Feuille de style XSLT

Document source Document de sortie

Processeur
XSLT

XSLT - Yves bekkers - IFSIC 5


XSLT premier exemple
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl=
"[Link]
<xsl:output method= "html" version="1.0"
encoding="UTF-8"/>
<xsl:template match="/">
<html>
<HEAD>
<TITLE>Bonjour</TITLE>
</HEAD>
<BODY>
<h1>Bonjour !</h1>
</BODY>
</html>
</xsl:template>
</xsl:stylesheet>XSLT - Yves bekkers - IFSIC 6
XSLT est un langage XML
• Les instructions sont des éléments XML
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl=
"[Link]
<!-- Format de sortie -->
<xsl:output method="xml" version="1.0"
encoding="UTF-8" indent="yes"/>

<!-- ... règles XSLT ... -->

</xsl:stylesheet>

XSLT - Yves bekkers - IFSIC 7


XSLT un espace de noms

• Espace de nom XSLT


– [Link]
– Préfixe recommandé xsl:

XSLT - Yves bekkers - IFSIC 8


Prélude d’une feuille de style

XSLT - Yves bekkers - IFSIC 9


Elément <xsl:stylesheet>
• Élement racine d’un document XSLT

<xsl:stylesheet
version="1.0"
xmlns:xsl=
"[Link]
>
– Attribut version : version de langage XSL
(obligatoire)
– Attribut xmlns:xsl : espace de nom XSL
XSLT - Yves bekkers - IFSIC 10
Elément <xsl:output>
• Format de sortie du document résultat

<xsl:output method="xml" version="1.0"


encoding="UTF-8" indent="yes"/>

– Attribut method : type du document en sortie


– Attribut encoding : codage du document
– Attribut indent : indentation en sortie

XSLT - Yves bekkers - IFSIC 11


Type de document en sortie
• Trois types de document en sortie
– xml : vérifie que la sortie est bien formée
• (sortie par défaut)
– html : accepte les balises manquantes, génère les
entités HTML (&eacute; ...)
• (sortie par défaut si XSL reconnaît l'arbre de sortie
HTML4)
– text : tout autre format textuel :
• du code Java, format Microsoft RTF, LaTex

XSLT - Yves bekkers - IFSIC 12


Parcours/transformation d’arbre
• Règle de réécriture : template rules
– <xsl:template>
• Spécifier un parcours de l’arbre d’entrée
– <xsl:apply-templates>
– <xsl:for-each>
• Obtenir une valeur dans l’arbre source
– <xsl:value-of>
– les crochets dans un attribut
<a href="{@src}">
XSLT - Yves bekkers - IFSIC 13
Règles de réécriture
template rules

pattern template

règle = motif + modèle

filtrage réécriture

Transformer un arbre en un autre

XSLT - Yves bekkers - IFSIC 14


Élément <xsl:template>
• Règle de réécriture motif + modèle
<xsl:template match="motif">
… modèle …
</xsl:template>
– Attribut match : expression XPATH
• Un motif pour filtrer l'arbre d'entrée
– Contenu de l'élément <xsl:template> :
• Un modèle de sous-arbre en sortie
• Un programme XSLT est un ensemble de règles
XSLT - Yves bekkers - IFSIC 15
Premier exemple complet
<xsl:stylesheet version="1.0"
xmlns:xsl="[Link]

<xsl:output method="html"/> motif


« filtre la racine du
<xsl:template match="/">
<HTML>
document d’entrée »
<HEAD>
<TITLE>Welcome</TITLE>
règle </HEAD>
<BODY>
Welcome!
</BODY> modèle
</HTML>
</xsl:template> « Document html»
</xsl:stylesheet>
XSLT - Yves bekkers - IFSIC 16
Contenu de l'élément
<xsl:template>
• Un élément <xsl:template> contient
– Le modèle de texte HTML (ou XML ou texte simple)
• le texte XML doit être bien formé
– Des instructions XSLT (mélangées au modèle de sortie)
• pour générer un texte en relation avec le contenu du document source
• pour extraire des informations du document source
Expressions XPath
<xsl:template match="titre">
<h1><xsl:value-of select="."/></h1>
</xsl:template> Extraction du contenu
de l'arbre en entrée
XSLT - Yves bekkers - IFSIC 17
Second exemple - le carnet d’adresse
En entrée
En sortie
<carnetDAdresse>
<carteDeVisite> <html>
<nom>Bekkers</nom> <body>
... <h1>Liste des Noms</h1>
</carteDeVisite > <p>Nom : Bekkers</p>
<carteDeVisite> <p>Nom : Bartold</p>
<nom> Bartold </nom> <p>Nom : Letertre</p>
... <p>Nom : Apolon</p>
</carteDeVisite > </body>
... </html>
</ carnetDAdresse >
XSLT - Yves bekkers - IFSIC 18
Second exemple (1)
<xsl:stylesheet version="1.0"
xmlns:xsl=
"[Link]
<xsl:output method="html" indent="no"
encoding="iso-8859-1"/>

<xsl:template match="/"> Expression xpath


<html>
<xsl:apply-templates select="child::*"/>
</html>
</xsl:template>
Modèle de sous-arbre
... XSLT - Yves bekkers - IFSIC 19
Second exemple (2)
<xsl:template match="carnetDAdresse">
<body>
<h1>Liste des Noms</h1>
<xsl:apply-templates select="child::*"/>
</body>
</xsl:template>

<xsl:template match="carteDeVisite">
<p>Nom : <xsl:value-of select="nom"/>
</p>
</xsl:template>

</xsl:stylesheet>
XSLT - Yves bekkers - IFSIC 20
Résultat
• Pour un document source contenant 4 cartes
de visite
<html>
<body>
<h1>Liste des Noms</h1>
<p>Nom : Bekkers</p>
<p>Nom : Bartold</p>
<p>Nom : Letertre</p>
<p>Nom : Apolon</p>
</body>
</html>
XSLT - Yves bekkers - IFSIC 21
Changement de contexte - Élément
<xsl:apply-templates>
• Descente dans les fils d’un nœud
<xsl:template match="carnetDAdresse">
<body>
<h1>Liste des Noms</h1>
<xsl:apply-templates
select="child::node()"/>
</body>
</xsl:template>

• Raccourci d’écriture Expression xpath


– descente par défaut aux nœuds fils
<xsl:apply-templates/>
XSLT - Yves bekkers - IFSIC 22
Élément <xsl:value-of>
• Générer le contenu d’un élément
<xsl:template match="carteDeVisite">
<p>Nom : <xsl:value-of select="nom"/>
</p>
</xsl:template>

• Sélection de la valeur :
– attribut select : expression xpath
– ici : le texte contenu dans l’élément nom de
l’élément carteDeVisite
XSLT - Yves bekkers - IFSIC 23
Résultat de <xsl:value-of> et type nœud
• Le nœud selectionné est un élément
– Concaténation de tous les textes qui se trouvent comme
contenu de cet élément et de ses descendants
• Le nœud est un nœud text
– Texte du nœud lui même
• Le nœud est un Attribut
– Valeur de l'attribut normalisée (pas d’espace de début et fin)
• Le nœud est une Instruction de traitement
– Valeur de l'instruction de traitement
(sans les marques <? et ?> et sans le nom)
• Le nœud est un Commentaire
– Le texte du commentaire (sans
XSLT - Yves bekkersles marques <!-- et -->)
- IFSIC 24
Exemple 1
• Arbre en entrée
<carteDeVisite>
<nom>Bekkers</nom>
</carteDeVisite>
• Règle
<xsl:template match="carteDeVisite">
<p>Nom : <xsl:value-of select="nom"/></p>
</xsl:template>
• Arbre en sortie

<p>Nom : Bekkers</p>
XSLT - Yves bekkers - IFSIC 25
Exemple 2
• Arbre en entrée
<note>enseigne <clé>XML</clé> au SEP</note>
• Régle
<xsl:template match="note">
<xsl:value-of select="."/>
</xsl:template>
• En sortie
enseigne XML au SEP

XSLT - Yves bekkers - IFSIC 26


Exemple 3
• Arbre en entrée
<note>enseigne <clé>XML</clé> au SEP</note>
• Règle
<xsl:template match="note">
<xsl:value-of select= "text()"/>
</xsl:template>
• En sortie
enseigne
Seul le premier élément sélectionné est produit
XSLT - Yves bekkers - IFSIC 27
Exemple 4
• Arbre en entrée
<note>enseigne <clé>XML</clé> au SEP</note>
• Règle
<xsl:template match="*">
<xsl:value-of select="name()"/>
</xsl:template>
• En sortie
note

XSLT - Yves bekkers - IFSIC 28


Exemple 5
• Arbre en entrée
4 cartes de visite : Bekkers, Bartold, Letertre, Apolon
• Règle
<xsl:template match="/carnetDAdresse">
<xsl:value-of select="carteDeVisite/nom"/>
</xsl:template>
• En sortie
Bekkers
Seul le premier élément sélectionné est produit
XSLT - Yves bekkers - IFSIC 29
Exemple 6
• Arbre en entrée
4 cartes de visite : Bekkers, Bartold, Letertre, Apolon
• Régle
<xsl:template
match="/carnetDAdresse/carteDeVisite">
<xsl:value-of select="nom"/>
</xsl:template>
• En sortie
BekkersBartoldLetertreApolon
Pour chaque carte de visite le template est appliqué
XSLT - Yves bekkers - IFSIC 30
Règles par défaut

XSLT - Yves bekkers - IFSIC 31


Règles par défaut (1)
Traverser la racine et tous les noeuds « élément »
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>

Sortir les feuilles « texte » et les « attributs »


<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
XSLT - Yves bekkers - IFSIC 32
Règles par défaut (2)
• Commentaires et instructions de traitement
<xsl:template match="processing-
instruction()|comment()"/>
• Ne rien faire

XSLT - Yves bekkers - IFSIC 33


Feuille de style minimum
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl=
"[Link]

<xsl:output method="text"/>

</xsl:stylesheet>
• Traverse tout l’arbre et sort les feuilles
(contenu d’élément texte et valeur d’attribut)

XSLT - Yves bekkers - IFSIC 34


Génération de contenu

Résultat littéral ou non ?

XSLT - Yves bekkers - IFSIC 35


Méthodes de génération de contenu
• Deux méthodes de génération de contenu :
1) Résultat litéral
<xsl:template match="subtitle">
<h2><xsl:apply-templates/></h2>
</xsl:template>
2) Résultat non litéral
(validation possible de la feuille de style)
<xsl:template match="subtitle">
<xsl:element name="h2">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>

XSLT - Yves bekkers - IFSIC 36


Valeur d'attribut par résultat
littéral évalué
Évaluation d’expression xpath en accolades dans les
valeurs d’attribut
• Arbre en entrée
<a href="[Link]"/>
• Template
<xsl:template match="a">
<b id="{@href}"/>
</xsl:template>
• En sortie
<b id="[Link]"/>
XSLT - Yves bekkers - IFSIC 37
Résultat non littéral
<xsl:attribute>
• Arbre en entrée
<a href="[Link]"/>
• Template
<xsl:template match="a">
<b><xsl:attribute name="id">
<xsl:value-of select="@href"/>
</xsl:attribute></b>
</xsl:template>
• En sortie
<b id="[Link]"/> XSLT - Yves bekkers - IFSIC 38
Parcours itératifs

XSLT - Yves bekkers - IFSIC 39


Élement <xsl:for-each>
• Itération sur une ensemble de nœuds
<xsl:template match="/carnetDAdresse">
<xsl:for-each select="carteDeVisite">
<p><xsl:value-of select="nom"/></p>
</xsl:for-each>
</xsl:template>

XSLT - Yves bekkers - IFSIC 40


Deux styles de programmation
• Récursive
<xsl:apply-templates>
• Itérative
<xsl:for-each>
• Attribut select donne l’ensemble de
nœuds vers lequel on se déplace

XSLT - Yves bekkers - IFSIC 41


Élément <xsl:comment>
• Sortir les commentaires à l’identique
<xsl:template match="comment()">
<xsl:comment>
<xsl:value-of select="."/>
</xsl:comment>
</xsl:template>

XSLT - Yves bekkers - IFSIC 42


Élément
<xsl:processing-instruction>
• Sortir les instructions de traîtement à l’identique
<xsl:template match="processing-
instruction()">
<xsl:processing-instruction name="./name()">
<xsl:value-of select="."/>
</xsl:processing-instruction>
</xsl:template>

XSLT - Yves bekkers - IFSIC 43


Conflits de Règles
• Règle implicite de priorité
– La règle la plus sélective gagne
– Parmi 2 templates de même sélectivité, le
dernier dans la feuille de style gagne
• Exemple
– nom est plus sélectif que /|*
– note[clé] est plus sélectif que note
– ville[@codepostal=’35000’] est plus
sélectif que ville[@codepostal]
XSLT - Yves bekkers - IFSIC 44
Les modes
• Permet de déclarer plusieurs règles pour un
même élément
• Chaque règle traite l’élément différemment
<xsl:template match="h1" mode="normal">

<xsl:template match="h1" mode="table-index">

XSLT - Yves bekkers - IFSIC 45


Attributs mode
• Dans un élément apply-templates
<xsl:apply-templates mode="passe1"/>
• Dans un élément template
<xsl:template match="carteDeVisite"
mode="passe1">
...
</xsl:template>
• Attention un apply-templates n’hérite
pas du mode du template englobant
XSLT - Yves bekkers - IFSIC 46
Autres outils

XSLT - Yves bekkers - IFSIC 47


Élément <xsl:if>
• Conditionnelle
<xsl:for-each select="carteDeVisite">
<xsl:value-of select="nom"/>
<xsl:if test="position()!=last()">,
</xsl:if>
</xsl:for-each>
• Génère une virgule après chaque nom sauf
pour le dernier
• En sortie
Bekkers, Bartold, Letertre, Apolon
XSLT - Yves bekkers - IFSIC 48
Élément <xsl:choose>
• Conditionnelle à choix multiple
<xsl:choose>
<xsl:when test="start-with('35',@codep)">
<!-- cas 1 -->
</xsl:when>
<xsl:when test="start-with('44',@codep)">
<!-- cas 2 -->
</xsl:when>
<xsl:otherwise>
<!-- autres cas -->
</xsl:otherwise>
</xsl:choose> XSLT - Yves bekkers - IFSIC 49
<xsl:variable>
• Déclaration de variable 1
<xsl:variable name="blackcolor"
select="'#FFFFCC'" />
• Déclaration de variable 2
<xsl:variable
name="blackcolor">#FFFFCC</xsl:variable>
• Référence à une variable
<BODY BGCOLOR='{$blackcolor}'>

XSLT - Yves bekkers - IFSIC 50


<xsl:variable>
• XSL est un langage à assignation unique
• Les « variables » sont des constantes à la
manière des constantes #define de C
• Une variable ne peut être réaffectée
• La visibilité d’une variable est son élément
père
• Une variable peut en cacher une autre

XSLT - Yves bekkers - IFSIC 51


Initialisation conditionnelle
• Exemple
Java XSLT
if (niveau > 20) <xsl:variable name="code">
code = 3; <xsl:choose>
else <xsl:when test="$niveau &gt; 20">
code = 5; <xsl:text>3</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>5</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
XSLT - Yves bekkers - IFSIC 52
Les espaces
• Les espaces non significatifs dans l’arbre xsl
ne sont pas produits
<xsl:template match="nom">
<p><xsl:value-of select="."/>
</p>
</xsl:template>
et
<xsl:template match="nom">
<p><xsl:value-of select="."/></p>
</xsl:template>
ont le même effet XSLT - Yves bekkers - IFSIC 53
Élément <xsl:text>
• Caractères espaces, TAB, CR, LF en sortie

<xsl:text> </xsl:text>

XSLT - Yves bekkers - IFSIC 54


Attribut
disable-output-escaping
• Pour sortir des caractères spéciaux tels quel
(sans être sous forme d’entité)
• Valeurs possible : yes ou no (par défaut)
• où
– Dans un élément xsl:text
– Dans un élément xsl:value-of
• Attention : cela peut produire des documents
qui ne sont pas bien formés
• Utiles pour produire
XSLT - Yvesdes
bekkers pages
- IFSIC ASP ou JSP 55
Générer une section CDATA - 1
• Vous voulez générer ceci
<elem><![CDATA[bla<bla]]></elem>
• Solution 1
<elem>
<xsl:text disable-output-escaping="yes">
<![CDATA[<![CDATA]]></xsl:text>
[bla<bla<xsl:text>]</xsl:text>
<xsl:text disable-output-
escaping="yes">]></xsl:text></elem>
XSLT - Yves bekkers - IFSIC 56
Générer une section CDATA - 2
• Vous voulez générer ceci
<elem><![CDATA[bla<bla]]></elem>
• Solution 2
– Mettre une déclaration
– <xsl:output indent="yes" method="xml"
cdata-section-elements="elem"/>
– Et vous obtenez le résultat voulu !

XSLT - Yves bekkers - IFSIC 57


Générateur d’identificateur
• generate-id(expr)
génère automatiquement un identificateur XML
spécifique au premier nœud de l’ensemble de
nœuds donné par l’expression
• generate-id()
génère automatiquement un identificateur XML
spécifique au nœud courant

XSLT - Yves bekkers - IFSIC 58


Fonction generate-id()
• Propriétés
– L’ordre alphabétique des identificateurs est le
même que l’ordre des nœuds dans le document
– Si generate-id(A) est un préfixe de
generate-id(B), alors A est un ancêtre de B
– L’identificateur est unique au sein de tous les
documents ouverts durant l’exécution.

XSLT - Yves bekkers - IFSIC 59


Une identification par nœud
html x1
x11 x12
head body

x121
h1 p x122table x123

tr tr tr

generate-id(/html/body/table) = x123

XSLT - Yves bekkers - IFSIC 60


Seconde partie
• Modularité
• Tri
• Procédures (Templates nommés)
– Appel récursif et passage de paramètres
• Indexation par clé

XSLT - Yves bekkers - IFSIC 61


Modularité

XSLT - Yves bekkers - IFSIC 62


Modularité des documents sources
• Document composé de plusieurs documents
<livre>
<chapitre>[Link]</chapitre>
<chapitre>[Link]</chapitre>
<chapitre>[Link]</chapitre>
</livre>
• Utiliser la fonction document()
<xsl:template match="chapitre">
<xsl:apply-templates
select="document(.)/*"/>
</xsl:template> XSLT - Yves bekkers - IFSIC 63
Fonction document
• Fonction xslt:document(xpath1[,xpath2])
– Fixe le document de sortie vers celui identifié par l’URI.
L’expression xpath1 est évaluée et son résultat est convertit
en une chaîne interprétée comme une URI
– La syntaxe des URI acceptables n’est pas fixée par la
norme. Il faut consulter la documentation du concepteur du
processeur XSLT utilisé pour la connaître
• Base d’adressage
– Si une l’expression xpath2 est présente, le répertoire du
document source dans lequel a été lu le nœud référencé par
xpath2 sert de base à l’URI.
– Si une l’expression xpath2 est absente, la base de l’URI est
le répertoire dans lequel a été lue la feuille de style
XSLT - Yves bekkers - IFSIC 64
Base d’adressage
• Si le document source n’a pas été lu sur un
fichier mais construit en mémoire par un
programme, on dispose éventuellement d’un
moyen de fixer la base des URI par programme.
– Il faut un processeur xslt qui le permette
– Par exemple avec Java 1.5 qui implémente la norme
JAXP 1.3 et Saxon qui la respecte aussi on peut
créer un document source en interne et fixer sa base
comme suit
DocumentSource source = new DocumentSource(inputDoc);
[Link](rootPath);
XSLT - Yves bekkers - IFSIC 65
Elément <xsl:import>
• Modularité des feuilles de style
<xsl:stylesheet version="1.0"
xmlns:xsl="[Link]
<xsl:output method="xml" version="1.0"
encoding="ISO-8859-1" indent="yes"/>
<xsl:import href="[Link]"/>
...
</xsl:stylesheet>

XSLT - Yves bekkers - IFSIC 66


Elément <xsl:document>
• Modularité des documents en sortie
<xsl:template match="preface">
<xsl:document href="{$dir}\[Link]">
<html><body>
<xsl:apply-templates/>
</body></html>
</xsl:document>
<a href="{$dir}\[Link]">Preface</a>
</xsl:template>

• Version 1.1 de XSLT


– Seul Saxon l’implémente actuellement
XSLT - Yves bekkers - IFSIC 67
Trier

XSLT - Yves bekkers - IFSIC 68


Élément <xsl:sort>

• Permet de trier l'ensemble des nœuds


sélectionnés par les instructions avant de les
traîter
<xsl:apply-templates>
<xsl:for-each>

XSLT - Yves bekkers - IFSIC 69


Exemple
<xsl:stylesheet xmlns:xsl = "[Link]
version = "1.0" >
<xsl:output method = "text" />
<xsl:template match = "/" >
<xsl:apply-templates select = "//*" />
</xsl:template>
<xsl:template match = "*" >
<xsl:value-of select = "name()" /> <XXX >
<xsl:text > </xsl:text> <ccc/>
</xsl:template> <zzz/>
</xsl:stylesheet> <ddd/>
<ooo/>
XXX ccc zzz ddd ooo </XXX>

XSLT - Yves bekkers - IFSIC 70


Exemple (suite)
<xsl:stylesheet xmlns:xsl = "[Link]
version = "1.0" >
<xsl:output method = "text" />
<xsl:template match = "/" >
<xsl:apply-templates select = "//*" >
<xsl:sort select = "name()" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match = "*" >
<xsl:value-of select = "name()" /> <XXX >
<xsl:text > </xsl:text>
</xsl:template> <ccc/>
</xsl:stylesheet> <zzz/>
<ddd/>
<ooo/>
ccc ddd ooo XXX zzz </XXX>

XSLT - Yves bekkers - IFSIC 71


Tri sur plusieurs critères
• Trier d’abord par noms puis par prénoms
<sxl:templates match="carnetDAdresse">
<xsl:apply-templates
select="carteDeVisite">
<xsl:sort select="nom"/>
<xsl:sort select="prénom"/>
</xsl:apply-templates>
</xsl:template>
XSLT - Yves bekkers - IFSIC 72
Définition de fonctions

XSLT - Yves bekkers - IFSIC 73


Fonction = templates nommés

• Déclaration de fonction
<xsl:template name="fun">
...
</xsl:template>
• Appel de fonction
<xsl:call-template name="fun"/>

XSLT - Yves bekkers - IFSIC 74


Passage de paramètres
• Déclaration (paramètre formel) Valeur par défaut
<xsl:template name="fun">
<xsl:param name="p" select="0"/>
... utilisation de p ...
<xsl:call-template name="fun">
<xsl:with-param name="p"
select="$p+1"/>
</xsl:call-template>
</xsl:template>
• Obtenir la valeur d’un paramètre
select="$p"
XSLT - Yves bekkers - IFSIC 75
Calcul de la profondeur d'un
élément
• Nom de la fonction max
• Paramètre $x un ensemble de nœuds
<xsl:template name="max">
<xsl:param name="x"/>
<xsl:choose>
<xsl:when test="$x">
<!-- cas où $x est non vide -->
… (c.f. page suivante)
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:template>

XSLT - Yves bekkers - IFSIC 76


Cas où $x est non vide
<xsl:variable name="prof1"> Profondeur max du premier
<xsl:call-template name="max">
<xsl:with-param name="x" select="$x/*[1]"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="prof2"> Profondeur max des suivants
<xsl:call-template name="max">
<xsl:with-param name="x" select="$x/*[position() != 1]"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose> Choix du maximum
<xsl:when test="$prof1 > $prof2">
<xsl:value-of select="1 + $prof1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="1 + $prof2"/>
</xsl:otherwise>
</xsl:choose>

XSLT - Yves bekkers - IFSIC 77


Mettre sous forme d’arbre
<a>
En sortie <h1>
En entrée <titre>titre 1</titre>
<a>
<p>bla bla 1</p>
<h1>titre 1</h1>
<p>bla bla 2</p>
<par>bla bla 1</par>
<p>bla bla 3</p>
<par>bla bla 2</par>
</h1>
<par>bla bla 3</par>
<h1>
<h1>titre 2</h1>
<titre>titre 2</titre>
<par>bla bla 4</par>
<p>bla bla 4</p>
<par>bla bla 5</par>
<p>bla bla 5</p>
<par>bla bla 6</par>
<p>bla bla 6</p>
</a>
</h1>
</a>
XSLT - Yves bekkers - IFSIC 78
Mettre sous forme d'arbre (bis)
• Itération sur tous les éléments <h1>
<xsl:template match="/">
<a>
<xsl:for-each select="//h1"> Sélection des frères
<h1> qui suivent
<titre><xsl:value-of select="."/></titre>
<xsl:call-template name="frere">
<xsl:with-param name="nds" select="following-sibling::*"/>

</xsl:call-template>
</h1>
</xsl:for-each>
</a>
XSLT - Yves bekkers - IFSIC 79
</xsl:template>
Mettre sous forme d'arbre (ter)
Traitement du
<xsl:template name="frere"> premier frère si
<xsl:param name="nds"/> c’est un élément par
<xsl:choose>
<xsl:when test="$nds[position()=1 and name()='par']">
<p><xsl:value-of select="$nds[1]"/></p>
<xsl:call-template name="frere">
<xsl:with-param name="nds" Appel récursif
select="$nds[position()!=1]"/> sur les autres frères
</xsl:call-template> après traitement
</xsl:when> du premier
<xsl:otherwise/>
</xsl:choose> Arrêt de la récursivité
</xsl:template> si le premier frère est un h1
XSLT - Yves bekkers - IFSIC 80
Paramètrer une feuille de style
• Les paramètres descendants directs d’un élément
<xsl:stylesheet> sont autorisés
<xsl:stylesheet>
<xsl:param name="dir" select="'mondir'"/>
...
</xsl:stylesheet>
• On peut passer une valeur dans la ligne de
commande
java ... dir=monDir

XSLT - Yves bekkers - IFSIC 81


Exemple
<xsl:stylesheet version="1.0" …>
<xsl:param name="jour"/>
<xsl:param name="mois"/> déclaration

<xsl:template match="/">
<html>
<body>
… Utilisation
<p><Dernière mise à jour le,
<xsl:value-of select="$jour/>
<xsl:value-of select="$mois“/>.</p>

XSLT - Yves bekkers - IFSIC 82
Mise au point

• Élément <xsl:message>
<xsl:message>
code = <xsl:value-of select="$code"/>
</xsl:message>
• Trace en sortie dans la fenêtre de commande
code = 25

XSLT - Yves bekkers - IFSIC 83


Les clés

• Un mécanisme d'indexation des documents

XSLT - Yves bekkers - IFSIC 84


Les clés
• Un mécanisme d’indexation dynamique
– Permet d'indexer des nœuds de l’arbre d’entrée
sans placer d'attribut ID
– Les déclarations apparaissent dans la feuille de
style et non dans le document à transformer
(pas d'attribut ID)
• Associe des paires <nomDeClé,Valeur> à
des nœuds

XSLT - Yves bekkers - IFSIC 85


Déclaration de clé <xsl:key>
• Toute déclaration doit être au premier niveau de la
feuille de style
<xsl:key name="id" match="XPath motif"
use="XPath value"/>
• Les trois attributs sont obligatoires
– Le nom de la clé est id.
– L'ensemble de nœuds à décorer (les nœuds filtrés)
résulte de l'évaluation de l'expression XPath motif,
– Chaque nœud filtré est décoré par un ensemble de paires
(clé,valeur) où les valeurs résultent de l'évaluation de
XPath value (voir ci-après)

XSLT - Yves bekkers - IFSIC 86


Valeur(s) des clés
• Pour chaque nœud filtré l'ensemble des valeurs à lui
associer est donné par l'attribut use="XPath
value"
– XPath value est évalué localement à chaque nœud filtré
– Si XPath value retourne un ensemble de nœuds, chaque
nœud résultat est converti en une chaîne qui donne une
valeur (le nœud filtré est indexé par plusieurs paires
<clé,valeur> !)
– Tout autre résultat est converti en une chaîne qui donne
une valeur unique

XSLT - Yves bekkers - IFSIC 87


Exemple de déclaration
<xsl:keys name="carteAvecNote"
match="//carteDeVisite[note]"
use="nom"/>
1. Déclare une clé appelée 'carteAvecNote'
2. Y associe tous les éléments <carteDeVisite>
ayant un fils <note>
3. Associe à chaque élément filtré un indexe qui est
une paire <'carteAvecNote',nom de la
personne>
4. Si l'éléments <carteDeVisite> comportait
plusieurs noms, chaque nom donnerait une paire
XSLT - Yves bekkers - IFSIC 88
Utilisation – la fonction key()
• Appel key(nom,expr)
– L'argument nom est un nom de clé défini par un élément
<xsl:key name="carteAvecNote">
– L'argument expr est une expression XPath
• Si expr retourne un ensemble de nœuds, chaque nœud résultat
est converti en une chaîne qui donne une valeur de clé (la
recherche peut porter sur plusieurs clés)
• Tout autre résultat est converti en une chaîne qui donne une
valeur de clé
– Exemple key('carteAvecNote',’bekkers’)
• Retourne un ensemble de nœuds appartenant au
document courant
– Il s'agit des éléments qui sont indexés par la paire
<'nom',valeur>
XSLT - Yves bekkers - IFSIC 89
Propriétés des clés
• Les valeurs de clé ne sont pas uniques
– La même paire peut identifier plusieurs nœuds
• Chaque nœud filtré peut avoir zéro, une ou
plusieurs paire qui l'indexe
• La fonction key() retourne un ensemble de
nœuds qui sont tous localisés dans le même
document XML

XSLT - Yves bekkers - IFSIC 90


Exemple1
• Soit le document XML
<personne>
<homme name="Bob" épouse="Alice"/>
<femme name="Alice"/>
</personne>
• Problème : “Retrouver les époux pour les femmes”
– remarque : ils ne sont pas codés directement
• Solution
– Déclaration d’une référence
<xsl:key name="man-by-wifes-name" match="homme"
use="@épouse"/>
– Utilisation de la référence
<xsl:template match="femme">
<xsl:apply-templates
select="key('man-by-wifes-name', @name)"/>

XSLT - Yves bekkers - IFSIC 91


Exemple2 – explorer une pièce de théâtre
Soit une pièce de théâtre
structurée comme suit
PLAY
PERSONAE
PERSONA
PERSONA
ACT
SCENE
SPEECH/SPEAKER
SPEECH/SPEAKER
SCENE
SPEECH/SPEAKER
ACT
SCENE
SPEECH/SPEAKER
SPEECH/SPEAKER

XSLT - Yves bekkers - IFSIC 92


Extrait du début d'un acte
liste de personnages de la pièce
<PLAY>
<TITLE>The Tragedy of Othello, the Moor of Venice</TITLE>
<FM>

</FM>
<PERSONAE>
<TITLE>Dramatis Personae</TITLE>
Un personnage
<PERSONA>DUKE OF VENICE</PERSONA>
<PERSONA>BRABANTIO, a senator.</PERSONA>
<PERSONA>Other Senators.</PERSONA>
<PERSONA>GRATIANO, brother to Brabantio.</PERSONA>
<PERSONA>LODOVICO, kinsman to Brabantio.</PERSONA>
<PERSONA>OTHELLO, a noble Moor in the service of
the Venetian state.</PERSONA>

XSLT - Yves bekkers - IFSIC 93


Extrait du début d'un acte
vue d’un discours
<ACT>
<TITLE>ACT I</TITLE>
<SCENE>
<TITLE>SCENE I. Venice. A street.</TITLE>
<STAGEDIR>Enter RODERIGO and IAGO</STAGEDIR>
<SPEECH> discours
<SPEAKER>RODERIGO</SPEAKER>
<LINE>Tush! never tell me; I take it …</LINE>
<LINE>That thou, Iago, who hast had …</LINE>
<LINE>As if the strings were thine, …</LINE>
</SPEECH>
<SPEECH>
<SPEAKER>IAGO</SPEAKER>
<LINE>'Sblood, but you will not hear me:</LINE>

XSLT - Yves bekkers - IFSIC 94


Présenter les personnages

XSLT - Yves bekkers - IFSIC 95


Déclaration

• Déclaration des indexes


<xsl:key name="scene" match="/PLAY/ACT/SCENE"
use="SPEECH/SPEAKER"/>
– Chaque élément <scene> est indexé par les noms
de personnage qui y apparaissent

XSLT - Yves bekkers - IFSIC 96


Graphe décoré par les indexes

XSLT - Yves bekkers - IFSIC 97


Utilisation
<xsl:template match="PERSONA">
<xsl:variable name="nom" select="substring-before(.,',')"/>
<xsl:variable name="speaker">
<xsl:choose>
<xsl:when test="$nom!=''">
<xsl:value-of select="$nom"/>
Extraction </xsl:when>
du nom <xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:for-each select="key('scene',$speaker)">
<xsl:value-of select="ancestor::ACT/TITLE"/> -
<xsl:value-of select="TITLE"/>
<br/> Est équivalent à
</xsl:for-each> //SCENE[SPEECH/SPEAKER=$speaker]
...
</xsl:template> XSLT - Yves bekkers - IFSIC 98
Les sources de l'exemple
• La dtd
– ~general/xml/XSL/keys/[Link]
• Othello en XML
– ~general/xml/XSL/keys/[Link]
• La feuille de style
– ~general/xml/XSL/keys/[Link]
• Le résultat HTML
– ~general/xml/XSL/keys/[Link]
XSLT - Yves bekkers - IFSIC 99
Conclusion sur XSLT

XSLT - Yves bekkers - IFSIC 100


XSLT qu'est-ce que c'est ?
• Un langage déclaratif (Turing complet !)
– avec une syntaxe ésotérique !
• Utilise une technique de filtrage à base de motifs
(patterns) et de modèles (template) décrits dans des
règles (template rule) pour transformer des arbres
• Bien plus puissant que CSS …
Conclusion
• Un vrai langage de programmation
– Les programmes XSLT sont plus que des feuilles de
style !

XSLT - Yves bekkers - IFSIC 101


Limites de CSS par rapport à
XSLT
• CSS ne permet pas de visualiser les attributs
• CSS ne permet pas de réarranger
l'information
• CSS n'offre pas de vrai moyen de faire des
calculs
• La cible ne peut pas être un autre dialecte
XML (CSS est un outil de présentation)
XSLT - Yves bekkers - IFSIC 102
Documentation XSLT
• La documentation de Saxon constitue une
excellente documentation pour XSLT
– Elle est précise, concise …
[Link]
[Link]
– N'hésitez pas à la consulter, même si vous
n'utilisez pas Saxon

XSLT - Yves bekkers - IFSIC 103


Outils

XSLT - Yves bekkers - IFSIC 104


Extensions à la norme
• Saxon
– Elements xslt : éléments sql, ...
– Functions xpath : formatage de date, conversions de
valeurs, évaluations xpath, try/catch ...
• EXSLT : une librairie portable en java (conseillée
par saxon)
– Fonctions mathématiques, expressions régulières,
random, heures-dates, chaînes, ensembles ...
– Site de chargement : [Link]

XSLT - Yves bekkers - IFSIC 105


Lancer une transformation XSLT
• Nombreux moyens
1. En ligne de commande
2. En Java, en utilisant l’API JAXP 1.1, connu
aussi comme TrAX (paquetage [Link])
3. Par la tâche <style> du processeur Ant
– Sous Eclipse
– En ligne de commande
4. À l'aide XMLSpy
5. À l'aide MS Internet Explorer

XSLT - Yves bekkers - IFSIC 106


Éditer xslt, xpath
• Eclipse (nombreux plugins)
– WTP, Oxygen, XmlBuddy, NiceXsl,
OrangeVoltXsl, ...
• XmlSpy
• StylusStudio
• Vex
• Jedith
XSLT - Yves bekkers - IFSIC 107
En ligne de commande
• Lancer Saxon7 en ligne de commande
java [Link]
[options] source-document
stylesheet
[ params...]

XSLT - Yves bekkers - IFSIC 108


Utiliser l’API JAXP 1.1 (TrAX)
public static void apply(String in, String out, String xslt)
throws FileNotFoundException, TransformerException {
// Créer une fabrique de transformer
TransformerFactory factory = [Link]();
// Utiliser la fabrique pour créer un template
// contenant la feuille de style
Templates template = [Link](new StreamSource(
new FileInputStream(xslt)));
// Utiliser le template pour créer un transformateur
Transformer xformer = [Link]();

// Préparer l'entrée et la sortie


Source source = new StreamSource(new FileInputStream(in));
Result result = new StreamResult(new FileOutputStream(out));

// Transformer
[Link](source, result);
}

XSLT - Yves bekkers - IFSIC 109


Effectuer la transformation par le
navigateur
• Mettre l’instruction de traitement suivante en
entête du document XML
<?xml-stylesheet type="text/xsl"
href="../[Link]" ?>
• Faire lire le document XML par le navigateur
IExplorer

XSLT - Yves bekkers - IFSIC 110


Tâche <style> de Ant
<property name="prefixe" value="othello"/>
<property name="[Link]" value="…"/>
<project name="myProject" default="svg">
<target name="svg">
<style in="${prefixe}.xml" out="${prefixe}.svg"
style="${[Link]}/[Link]">
<param name="[Link]" expression="blue"/>
<param name="[Link]" expression="#FFFF99"/>
</style>
</target>
</project>

XSLT - Yves bekkers - IFSIC 111


Ant et XSLT
• Ant utilise par défaut son propre processeur XSLT
• On peut lui changer ce processeur, voici un exemple
de lancement de Ant avec Saxon pour processeur
XSLT
java -cp \
[Link];.;[Link];[Link];[Link] \
-[Link]=\
[Link] \
-[Link]=\
[Link] \
[Link] %1 %2 %3 %4 %5 %6 %7 %8 %9

XSLT - Yves bekkers - IFSIC 112


Conclusion
• Oui
– XSLT est un vrai langage de programmation
– XSLT n’a pas son équivalent pour la
transformation d’arbre
• Mais
– La mise au point de programmes XSLT peut
s’avérer « délicate »
– La maintenabilité est discutable

XSLT - Yves bekkers - IFSIC 113


Des références
• XSLT Programmer’s Reference
Micheal H. Kay, Wrox Press
[Link]
• Saxon : Michael Kay
[Link]
très bonne documentation en ligne
• Xalan, Cocoon : projet Apache
[Link]
XSLT - Yves bekkers - IFSIC 114

Vous aimerez peut-être aussi