Documente Academic
Documente Profesional
Documente Cultură
Plan
Introduction Prlude d'une feuille de style Rgles de rcriture : Template, Parcours rcursifs Rgles par dfaut Parcours itratifs Modularit Variables, Tri, conditionnelle, passage de paramtres Dfinition de fonctions rcursives Les cls - un mcanisme d'indexation de documents
XSLT - Yves bekkers - IFSIC 2
Transformation de documents
XSL (eXtensible Stylesheet Language) Deux normes indpendantes
XSLT : langage de transformation
XPath : langage pour adresser les nuds dun arbre
Modle de calcul
Utilise une technique de filtrage base de motifs (patterns) et de modles (template) dcrits dans des rgles (template rules) pour transformer des arbres
XSLT - Yves bekkers - IFSIC 4
Document de sortie
Elment <xsl:stylesheet>
lement racine dun document XSLT
<xsl:stylesheet version="1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" >
Attribut version : version de langage XSL (obligatoire) Attribut xmlns:xsl : espace de nom XSL
XSLT - Yves bekkers - IFSIC 10
Elment <xsl:output>
Format de sortie du document rsultat
<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
html : accepte les balises manquantes, gnre les entits HTML (é ...)
(sortie par dfaut si XSL reconnat l'arbre de sortie HTML4)
Parcours/transformation darbre
Rgle de rcriture : template rules
<xsl:template>
Rgles de rcriture
template rules pattern rgle = motif + template modle
filtrage
rcriture
lment <xsl:template>
Rgle de rcriture motif + modle
<xsl:template match="motif"> modle </xsl:template> Attribut match : expression XPATH
Un motif pour filtrer l'arbre d'entre
<xsl:template match="/"> <HTML> <HEAD> <TITLE>Welcome</TITLE> </HEAD> rgle <BODY> Welcome! </BODY> modle </HTML> Document html </xsl:template> </xsl:stylesheet>
XSLT - Yves bekkers - IFSIC 16
Contenu de l'lment
<xsl:template>
Un lment <xsl:template> contient
Le modle de texte HTML (ou XML ou texte simple)
le texte XML doit tre bien form
Expressions XPath <xsl:template match="titre"> <h1><xsl:value-of select="."/></h1> </xsl:template> Extraction du contenu de l'arbre en entre
XSLT - Yves bekkers - IFSIC 17
<carnetDAdresse> <carteDeVisite> <nom>Bekkers</nom> ... </carteDeVisite > <carteDeVisite> <nom> Bartold </nom> ... </carteDeVisite > ... </ carnetDAdresse >
18
Rsultat
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
Raccourci dcriture
descente par dfaut aux nuds fils
<xsl:apply-templates/>
XSLT - Yves bekkers - IFSIC
Expression xpath
22
lment <xsl:value-of>
Gnrer le contenu dun lment
<xsl:template match="carteDeVisite"> <p>Nom : <xsl:value-of select="nom"/> </p> </xsl:template>
Slection de la valeur :
attribut select : expression xpath ici : le texte contenu dans llment nom de llment carteDeVisite
XSLT - Yves bekkers - IFSIC 23
Exemple 1
Arbre en entre
<carteDeVisite> <nom>Bekkers</nom> </carteDeVisite>
Rgle
<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 entre
<note>enseigne <cl>XML</cl> au SEP</note>
Rgle
<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 entre
<note>enseigne <cl>XML</cl> au SEP</note>
Rgle
<xsl:template match="note"> <xsl:value-of select= "text()"/> </xsl:template>
En sortie
enseigne
Exemple 4
Arbre en entre
<note>enseigne <cl>XML</cl> au SEP</note>
Rgle
<xsl:template match="*"> <xsl:value-of select="name()"/> </xsl:template>
En sortie
note
XSLT - Yves bekkers - IFSIC 28
Exemple 5
Arbre en entre
4 cartes de visite : Bekkers, Bartold, Letertre, Apolon
Rgle
<xsl:template match="/carnetDAdresse"> <xsl:value-of select="carteDeVisite/nom"/> </xsl:template>
En sortie
Bekkers
Exemple 6
Arbre en entre
4 cartes de visite : Bekkers, Bartold, Letertre, Apolon
Rgle
<xsl:template match="/carnetDAdresse/carteDeVisite"> <xsl:value-of select="nom"/> </xsl:template>
En sortie
BekkersBartoldLetertreApolon
31
Ne rien faire
33
<xsl:output method="text"/>
</xsl:stylesheet>
Traverse tout larbre et sort les feuilles (contenu dlment texte et valeur dattribut)
XSLT - Yves bekkers - IFSIC 34
Gnration de contenu
35
En sortie
<b id="fic.txt"/>
XSLT - Yves bekkers - IFSIC 37
En sortie
<b id="fic.txt"/>
XSLT - Yves bekkers - IFSIC 38
Parcours itratifs
39
lement <xsl:for-each>
Itration sur une ensemble de nuds
<xsl:template match="/carnetDAdresse"> <xsl:for-each select="carteDeVisite"> <p><xsl:value-of select="nom"/></p> </xsl:for-each> </xsl:template>
40
lment <xsl:comment>
Sortir les commentaires lidentique
<xsl:template match="comment()"> <xsl:comment> <xsl:value-of select="."/> </xsl:comment> </xsl:template>
42
lment
<xsl:processing-instruction>
Sortir les instructions de tratement lidentique
<xsl:template match="processinginstruction()"> <xsl:processing-instruction name="./name()"> <xsl:value-of select="."/> </xsl:processing-instruction> </xsl:template>
43
Conflits de Rgles
Rgle implicite de priorit
La rgle la plus slective gagne Parmi 2 templates de mme slectivit, le dernier dans la feuille de style gagne
Exemple
nom est plus slectif que /|* note[cl] est plus slectif que note ville[@codepostal=35000] est plus slectif que ville[@codepostal]
XSLT - Yves bekkers - IFSIC 44
Les modes
Permet de dclarer plusieurs rgles pour un mme lment Chaque rgle traite llment diffremment <xsl:template match="h1" mode="normal">
<xsl:template match="h1" mode="table-index">
45
Attributs mode
Dans un lment apply-templates
<xsl:apply-templates mode="passe1"/>
Autres outils
47
lment <xsl:if>
Conditionnelle
<xsl:for-each select="carteDeVisite"> <xsl:value-of select="nom"/> <xsl:if test="position()!=last()">, </xsl:if> </xsl:for-each>
Gnre une virgule aprs chaque nom sauf pour le dernier En sortie
Bekkers, Bartold, Letertre, Apolon
XSLT - Yves bekkers - IFSIC 48
lment <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> XSLT - Yves bekkers - IFSIC 49 </xsl:choose>
<xsl:variable>
Dclaration de variable 1
<xsl:variable name="blackcolor" select="'#FFFFCC'" />
Dclaration de variable 2
<xsl:variable name="blackcolor">#FFFFCC</xsl:variable>
50
<xsl:variable>
XSL est un langage assignation unique Les variables sont des constantes la manire des constantes #define de C Une variable ne peut tre raffecte La visibilit dune variable est son lment pre Une variable peut en cacher une autre
51
Initialisation conditionnelle
Exemple
Java if (niveau > 20) code = 3; else code = 5; XSLT <xsl:variable name="code"> <xsl:choose> <xsl:when test="$niveau > 20"> <xsl:text>3</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>5</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:variable>
52
Les espaces
Les espaces non significatifs dans larbre 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>
53
lment <xsl:text>
Caractres espaces, TAB, CR, LF en sortie
<xsl:text> </xsl:text>
54
Attribut
disable-output-escaping
Pour sortir des caractres spciaux tels quel (sans tre sous forme dentit) Valeurs possible : yes ou no (par dfaut) o
Dans un lment xsl:text Dans un lment xsl:value-of
Attention : cela peut produire des documents qui ne sont pas bien forms Utiles pour produire pages ASP ou JSP 55 XSLT - Yvesdes bekkers IFSIC
Solution 1
<elem> <xsl:text disable-output-escaping="yes"> <![CDATA[<![CDATA]]></xsl:text> [bla<bla<xsl:text>]</xsl:text> <xsl:text disable-outputescaping="yes">]></xsl:text></elem>
XSLT - Yves bekkers - IFSIC 56
Solution 2
Mettre une dclaration
<xsl:output indent="yes" method="xml" cdata-section-elements="elem"/>
Gnrateur didentificateur
generate-id(expr)
gnre automatiquement un identificateur XML spcifique au premier nud de lensemble de nuds donn par lexpression generate-id() gnre automatiquement un identificateur XML spcifique au nud courant
XSLT - Yves bekkers - IFSIC 58
Fonction generate-id()
Proprits
Lordre alphabtique des identificateurs est le mme que lordre des nuds dans le document Si generate-id(A) est un prfixe de generate-id(B), alors A est un anctre de B Lidentificateur est unique au sein de tous les documents ouverts durant lexcution.
59
head
x121
body h1
x12
p x122 table
x123
tr
tr
tr
generate-id(/html/body/table) = x123
60
Seconde partie
Modularit Tri Procdures (Templates nomms)
Appel rcursif et passage de paramtres
Indexation par cl
61
Modularit
62
63
Fonction document
Fonction xslt:document(xpath1[,xpath2])
Fixe le document de sortie vers celui identifi par lURI. Lexpression xpath1 est value et son rsultat est convertit en une chane interprte comme une URI La syntaxe des URI acceptables nest pas fixe par la norme. Il faut consulter la documentation du concepteur du processeur XSLT utilis pour la connatre
Base dadressage
Si une lexpression xpath2 est prsente, le rpertoire du document source dans lequel a t lu le nud rfrenc par xpath2 sert de base lURI. Si une lexpression xpath2 est absente, la base de lURI est le rpertoire dans lequel a t lue la feuille de style
XSLT - Yves bekkers - IFSIC 64
Base dadressage
Si le document source na pas t lu sur un fichier mais construit en mmoire par un programme, on dispose ventuellement dun moyen de fixer la base des URI par programme.
Il faut un processeur xslt qui le permette Par exemple avec Java 1.5 qui implmente la norme JAXP 1.3 et Saxon qui la respecte aussi on peut crer un document source en interne et fixer sa base comme suit
DocumentSource source = new DocumentSource(inputDoc); source.setSystemId(rootPath);
XSLT - Yves bekkers - IFSIC 65
Elment <xsl:import>
Modularit des feuilles de style
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/> <xsl:import href="feuille1.xsl"/> ... </xsl:stylesheet>
66
Elment <xsl:document>
Modularit des documents en sortie
<xsl:template match="preface"> <xsl:document href="{$dir}\preface.html"> <html><body> <xsl:apply-templates/> </body></html> </xsl:document> <a href="{$dir}\preface.html">Preface</a> </xsl:template>
Trier
68
lment <xsl:sort>
Permet de trier l'ensemble des nuds slectionns par les instructions avant de les trater
<xsl:apply-templates> <xsl:for-each>
69
Exemple
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > <xsl:output method = "text" />
<xsl:template match = "/" > <xsl:apply-templates select = "//*" /> </xsl:template> <xsl:template match = "*" > <xsl:value-of select = "name()" /> <xsl:text > </xsl:text> </xsl:template> </xsl:stylesheet>
Exemple (suite)
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 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()" /> <xsl:text > </xsl:text> </xsl:template> </xsl:stylesheet>
Dfinition de fonctions
73
Appel de fonction
<xsl:call-template name="fun"/>
74
Passage de paramtres
Dclaration (paramtre formel)
Valeur par dfaut <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>
Exemple
<xsl:stylesheet version="1.0" > <xsl:param name="jour"/> dclaration <xsl:param name="mois"/>
<xsl:template match="/"> <html> <body> Utilisation <p><Dernire mise jour le, <xsl:value-of select="$jour/> <xsl:value-of select="$mois/>.</p>
XSLT - Yves bekkers - IFSIC 82
Mise au point
lment <xsl:message>
<xsl:message> code = <xsl:value-of select="$code"/> </xsl:message>
83
Les cls
Un mcanisme d'indexation des documents
84
Les cls
Un mcanisme dindexation dynamique
Permet d'indexer des nuds de larbre dentre sans placer d'attribut ID Les dclarations apparaissent dans la feuille de style et non dans le document transformer (pas d'attribut ID) Associe des paires <nomDeCl,Valeur>
des nuds
85
Dclaration de cl <xsl:key>
Toute dclaration doit tre au premier niveau de la feuille de style
<xsl:key name="id" match="XPath motif" use="XPath value"/>
Si XPath value retourne un ensemble de nuds, chaque nud rsultat est converti en une chane qui donne une valeur (le nud filtr est index par plusieurs paires <cl,valeur> !) Tout autre rsultat est converti en une chane qui donne une valeur unique
XSLT - Yves bekkers - IFSIC 87
Exemple de dclaration
<xsl:keys name="carteAvecNote" match="//carteDeVisite[note]" use="nom"/> 1. Dclare une cl appele 'carteAvecNote' 2. Y associe tous les lments <carteDeVisite> ayant un fils <note>
3. Associe chaque lment filtr un indexe qui est une paire <'carteAvecNote',nom de la
personne>
4. Si l'lments <carteDeVisite> comportait plusieurs noms, chaque nom donnerait une paire
XSLT - Yves bekkers - IFSIC 88
Exemple key('carteAvecNote',bekkers)
Chaque nud filtr peut avoir zro, une ou plusieurs paire qui l'indexe La fonction key() retourne un ensemble de nuds qui sont tous localiss dans le mme document XML
XSLT - Yves bekkers - IFSIC 90
Exemple1
Soit le document XML
<personne> <homme name="Bob" pouse="Alice"/> <femme name="Alice"/> </personne>
Solution
Dclaration dune rfrence <xsl:key name="man-by-wifes-name" match="homme" use="@pouse"/> Utilisation de la rfrence <xsl:template match="femme"> <xsl:apply-templates select="key('man-by-wifes-name', @name)"/>
XSLT - Yves bekkers - IFSIC 91
94
95
Dclaration
Dclaration des indexes
<xsl:key name="scene" match="/PLAY/ACT/SCENE" use="SPEECH/SPEAKER"/>
Chaque lment <scene> est index par les noms de personnage qui y apparaissent
96
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"/> Est quivalent <br/> </xsl:for-each> //SCENE[SPEECH/SPEAKER=$speaker] ... </xsl:template>
XSLT - Yves bekkers - IFSIC 98
Othello en XML
~general/xml/XSL/keys/othello.xml
La feuille de style
~general/xml/XSL/keys/keys.xslt
Le rsultat HTML
~general/xml/XSL/keys/personnages.html
XSLT - Yves bekkers - IFSIC 99
100
Utilise une technique de filtrage base de motifs (patterns) et de modles (template) dcrits dans des rgles (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
Documentation XSLT
La documentation de Saxon constitue une excellente documentation pour XSLT
Elle est prcise, concise
http://saxon.sourceforge.net/saxon6.5.3/ index.html
103
Outils
104
Extensions la norme
Saxon
Elements xslt : lments sql, ... Functions xpath : formatage de date, conversions de valeurs, valuations xpath, try/catch ...
En ligne de commande
Lancer Saxon7 en ligne de commande
java net.sf.saxon.Transform [options] source-document stylesheet
[ params...]
108
109
110
111
Ant et XSLT
Ant utilise par dfaut son propre processeur XSLT On peut lui changer ce processeur, voici un exemple de lancement de Ant avec Saxon pour processeur XSLT
java -cp \ myjar.jar;.;saxon.jar;ant.jar;jaxp.jar \ -Djavax.xml.transform.TransformerFactory=\ com.icl.saxon.TransformerFactoryImpl \ -Djavax.xml.parsers.SAXParserFactory=\ org.apache.crimson.jaxp.SAXParserFactoryImpl \ org.apache.tools.ant.Main %1 %2 %3 %4 %5 %6 %7 %8 %9
112
Conclusion
Oui
XSLT est un vrai langage de programmation XSLT na pas son quivalent pour la transformation darbre
Mais
La mise au point de programmes XSLT peut savrer dlicate La maintenabilit est discutable
XSLT - Yves bekkers - IFSIC 113
Des rfrences
XSLT Programmers Reference
Micheal H. Kay, Wrox Press http://www.wrox.com