Cours XSLT Langage de transformation d’arbre
Cours XSLT Langage de transformation d’arbre
…
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
: accepte les balises manquantes, génère les entités HTML (é ...)
- (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
Parcours/transformation d’arbre
- Règle de réécriture : template rules
–
- Spécifier un parcours de l’arbre d’entrée
–
–
- Obtenir une valeur dans l’arbre source
–
– les crochets dans un attribut
{@src}">;
Règles de réécriture
règle = motif + modèle
template
template rules
pattern
filtrage réécriture
Transformer un arbre en un autre
Élément
- Règle de réécriture motif + modèle
… modèle …
– Attribut match : expression XPATH
- Un motif pour filtrer l'arbre d'entrée
– Contenu de l'élément :
- Un modèle de sous-arbre en sortie
- Un programme XSLT est un ensemble de règles motif « filtre la racine du document d’entrée »
Premier exemple complet
XSLT - Yves bekkers - IFSIC 16
modèle
« Document html»
Welcome
Welcome!
règle
- Un élément 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
Contenu de l'élément
- pour extraire des informations du document source
Extraction du contenu de l'arbre en entrée
Expressions XPath
Second exemple - le carnet d’adresse
Liste des Noms
Bekkers
...
En entrée En sortie
XSLT - Yves bekkers - IFSIC 18
Nom : Bekkers
Nom : Bartold
Nom : Letertre
Nom : Apolon
Bartold
...
...
Second exemple (1)
xmlns:xsl=" Transform">
Expression xpath
Modèle de sous-arbre
...
Second exemple (2)
Liste des Noms
Nom :
Résultat
- Pour un document source contenant 4 cartes de visite
XSLT - Yves bekkers - IFSIC 21
Liste des Noms
Nom : Bekkers
Nom : Bartold
Nom : Letertre
Nom : Apolon
Changement de contexte - Élément
- Descente dans les fils d’un nœud
Liste des Noms
<xsl:apply-templates
Expression xpath • Raccourci d’écriture
– descente par défaut aux nœuds fils
select="child::node()"/>
Élément
Nom :
- Générer le contenu d’un élément
- Sélection de la valeur :
– attribut select : expression xpath
– ici : le texte contenu dans l’élément nom de l’élément carteDeVisite
Résultat de 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 sans le nom)
- Le nœud est un Commentaire
– Le texte du commentaire (sans les marques )
Exemple 1
- Arbre en entrée
- Règle
Bekkers
XSLT - Yves bekkers - IFSIC 25
Nom :
- Arbre en sortie
Nom : Bekkers
Exemple 2
- Arbre en entrée
enseigne <clé>XML au SEP
- Régle
- En sortie enseigne XML au SEP
Exemple 3
- Arbre en entrée
enseigne <clé>XML au SEP
- Règle
XSLT - Yves bekkers - IFSIC 27
- En sortie enseigne
Seul le premier élément sélectionné est produit
Exemple 4
- Arbre en entrée
enseigne <clé>XML au SEP
- Règle
- En sortie note
Exemple 5
- Arbre en entrée
4 cartes de visite : Bekkers, Bartold, Letertre, Apolon
- Règle
- En sortie
Bekkers
Seul le premier élément sélectionné est produit
Exemple 6
- Arbre en entrée
4 cartes de visite : Bekkers, Bartold, Letertre, Apolon
- Régle
<xsl:template
t h "/ tDAd / t D Vi it ">
match="/carnetDAdresse/carteDeVisite">
- En sortie
BekkersBartoldLetertreApolon
Pour chaque carte de visite le template est appliqué
Règles par défaut
Règles par défaut (1)
Traverser la racine et tous les noeuds « élément »
Sortir les feuilles « texte » et les « attributs »
Règles par défaut (2)
- Commentaires et instructions de traitement
- Ne rien faire
Feuille de style minimum
xmlns:xsl= …L/Transform">
- Traverse tout l’arbre et sort les feuilles (contenu d’élément texte et valeur d’attribut)
Génération de contenu
Résultat littéral ou non ?
Méthodes de génération de contenu
- Deux méthodes de génération de contenu :
1) Résultat litéral
2) Résultat non litéral (validation possible de la feuille de style)
Valeur d'attribut par résultat littéral évalué
Évaluation d’expression xpath en accolades dans les valeurs d’attribut
- Arbre en entrée
- Template
{@href}"/>;
- En sortie
Résultat non littéral
- Arbre en entrée
- Template
- En sortie
Parcours itératifs
Élement
- Itération sur une ensemble de nœuds
Deux styles de programmation
- Récursive
- Itérative
- Attribut select donne l’ensemble de nœuds vers lequel on se déplace
Élément
- Sortir les commentaires à l’identique
Élément
- Sortir les instructions de traîtement à l’identique
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]
Les modes
- Permet de déclarer plusieurs règles pour un même élément
- Chaque règle traite l’élément différemment
Chaque règle traite l élément différemment
Attributs mode
- Dans un élément apply-templates
- Dans un élément template
...
- Attention un apply-templates n’hérite pas du mode du template englobant
Autres outils
Élément
- Conditionnelle
,
XSLT - Yves bekkers - IFSIC 48
- Génère une virgule après chaque nom sauf pour le dernier
- En sortie
Bekkers, Bartold, Letertre, Apolon
Élément
- Conditionnelle à choix multiple
- Déclaration de variable 1
select="'#FFFFCC'" />
Dé l ti d i bl 2
- Déclaration de variable 2
<xsl:variable
name="blackcolor">#FFFFCC
- Référence à une 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
Initialisation conditionnelle
- Exemple
if (niveau > 20)
code = 3;
Java XSLT
3
5
else
code = 5;
Les espaces
- Les espaces non significatifs dans l’arbre xsl ne sont pas produits
et
ont le même effet
Élément
- Caractères espaces, TAB, CR, LF en sortie
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 des pages ASP ou JSP
Générer une section CDATA - 1
- Vous voulez générer ceci
- Solution 1
XSLT - Yves bekkers - IFSIC 56
[bla<bla]
]>
Générer une section CDATA - 2
- Vous voulez générer ceci
- Solution 2
Solution 2
– Mettre une déclaration
–
– Et vous obtenez le résultat voulu !
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
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.
Une identification par nœud
html
head body
x1
x11 x12
h1 p table
tr tr tr
x121 x122 x123
generate-id(/html/body/table) = x123
Seconde partie
- Modularité
- Tri
- Procédures (Templates nommés)
– Appel récursif et passage de paramètres
- Indexation par clé
Modularité
Modularité des documents sources
- Document composé de plusieurs documents
chap1.xml
chap2.xml
< h it > h3 l
chap3.xml
- Utiliser la fonction document()
<xsl:apply-templates
select="document(.)/*"/>
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
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
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);
source.setSystemId(rootPath);
Elément
- Modularité des feuilles de style
...
Elément
- Modularité des documents en sortie
Preface
- Version 1.1 de XSLT
– Seul Saxon l’implémente actuellement
Trier
Élément
- Permet de trier l'ensemble des nœuds
sélectionnés par les instructions avant de les
traîter
Exemple
xsl:apply templates select // /
XXX ccc zzz ddd ooo
Exemple (suite)
Tri sur plusieurs critères
- Trier d’abord par noms puis par prénoms
<xsl:apply-templates
s :app y te p ates
select="carteDeVisite">
Définition de fonctions
Fonction = templates nommés
- Déclaration de fonction
...
- Appel de fonction
Passage de paramètres
- Déclaration (paramètre formel)
... utilisation de p ...
Valeur par défaut
- Obtenir la valeur d’un paramètre select="$p"
Calcul de la profondeur d'un élément
- Nom de la fonction max
- Paramètre $x un ensemble de nœuds
… (c.f. page suivante)
Cas où $x est non vide
Profondeur max du premier
Profondeur max des suivants
Choix du maximum
Mettre sous forme d’arbre
En entrée
titre 1
bla bla 1
bla bla 2
titre 1
bla bla 1
bla bla 2
bla bla 3
En sortie
p p
bla bla 3
titre 2
bla bla 4
bla bla 5
bla bla 6
titre 2
bla bla 4
bla bla 5
bla bla 6
14
Mettre sous forme d'arbre (bis)
- Itération sur tous les éléments
Sélection des frères qui suivent
Mettre sous forme d'arbre (ter)
Traitement du premier frère si c’est un élément par
select="$nds[position()!=1]"/>
Appel récursif sur les autres frères après traitement du premier
Arrêt de la récursivité si le premier frère est un h1
Paramètrer une feuille de style
- Les paramètres descendants directs d’un élément
sont autorisés
...
- On peut passer une valeur dans la ligne de Commande java ... dir=monDir déclaration
Exemple
Utilisation
…
<Dernière mise à jour le,
.
…
Mise au point
- Élément
code =
code
- Trace en sortie dans la fenêtre de commande code = 25
Les clés
- Un mécanisme d'indexation des documents
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
Déclaration de clé
- Toute déclaration doit être au premier niveau de la feuille de style
- 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)
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
Exemple de déclaration
match="//carteDeVisite[note]"
use="nom"/>
- Déclare une clé appelée 'carteAvecNote'
- Y associe tous les éléments ayant un fils
- Associe à chaque élément filtré un indexe qui est
une paire <'carteAvecNote',nom de la personne>
- Si l'éléments comportait plusieurs noms, chaque nom donnerait une paire
Utilisation – la fonction key()
- Appel key(nom,expr)
– L'argument nom est un nom de clé défini par un élément
– 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>
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
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
Exemple1
- Soit le document XML
- Problème : “Retrouver les époux pour les femmes”
– remarque : ils ne sont pas codés directement remarque : ils ne sont pas codés directement
- Solution
– Déclaration d’une référence
– Utilisation de la référence
<xsl:apply-templates
select="key('man-by-wifes-name', @name)"/>
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
…
Extrait du début d'un acte liste de personnages de la pièce
The Tragedy of Othello, the Moor of Venice
…
Un personnage Dramatis Personae
DUKE OF VENICE
BRABANTIO, a senator.
Other Senators.
GRATIANO, brother to Brabantio.
LODOVICO, kinsman to Brabantio.
OTHELLO, a noble Moor in the service of the
Venetian state.
…
Extrait du début d'un acte vue d’un discours
ACT I
SCENE I. Venice. A street.
Enter RODERIGO and IAGO
RODERIGO
XSLT - Yves bekkers - IFSIC 94
Tush! never tell me; I take it …
That thou, Iago, who hast had …
As if the strings were thine, …
IAGO
'Sblood, but you will not hear me:
Présenter les personnages
- Déclaration des indexes
use="SPEECH/SPEAKER"/>
Déclaration
– Chaque élément est indexé par les noms de personnage qui y apparaissent
Graphe décoré par les indexes
Utilisation
Extraction du nom
-
...
//SCENE[SPEECH/SPEAKER=$speaker]
Est équivalent à
Les sources de l'exemple
- La dtd
– ~general/xml/XSL/keys/play.dtd
- Othello en XML
Othello en XML
– ~general/xml/XSL/keys/othello.xml
- La feuille de style
– ~general/xml/XSL/keys/keys.xslt
- Le résultat HTML
– ~general/xml/XSL/keys/personnages html
Conclusion sur XSLT
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 è l (template r le) po r transformer 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 !
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)
Documentation XSLT
- La documentation de Saxon constitue une excellente documentation pour XSLT
– Elle est précise, concise …
Index html
– N'hésitez pas à la consulter, même si vous n'utilisez pas Saxon
Outils
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 ...
Lancer une transformation XSLT
- Nombreux moyens
- En ligne de commande
- En Java, en utilisant l’API JAXP 1.1, connu aussi comme TrAX (paquetage javax.xml.transform)
3 P l âh d
XSLT - Yves bekkers - IFSIC 106
. Par la tâche
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
myjar.jar;.;saxon.jar;ant.jar;jaxp.jar \
-Djavax.xml.transform.TransformerFactory=\
com.icl.saxon.TransformerFactoryImpl \
-Djavax.xml.parsers.SAXParserFactory=\