XSLT (eXtensible Stylesheet Language
Transforma-tion)
Table des mati`
eres
1
Introduction
2
1.1
D´
efinition de XSL . . . .
2
1.2
Structure d’une feuille de style . . . .
2
2
Les r`
egles de transformation
3
2.1
D´
eclaration d’une r`
egle . . . .
3
2.2
Une r`
egle pour plusieurs ´
el´
ements . . . .
3
2.3
Traitement des ´
el´
ements fils . . . .
4
2.4
S´
election des ´
el´
ements fils . . . .
4
2.5
Notre exemple . . . .
5
2.6
Une feuille sans r`
egle . . . .
5
2.7
Traitement de l’exemple (2) . . . .
5
2.8
Exemple de feuille de style
. . . .
6
2.9
Utilisation de la feuille de style . . . .
6
2.10 S´
election des r`
egles par paquets . . . .
6
3
Construction de l’arbre r´
esultat
7
3.1
Noeud textuel constant . . . .
7
3.2
Noeud texte par XPATH
. . . .
7
3.3
Noeud ´
el´
ement et attribut . . . .
8
3.4
Noeud ´
el´
ement et attribut dynamique
. . . .
8
3.5
Copie de noeuds . . . .
9
3.6
Copie du noeud courant sans le contenu . . . .
10
3.7
Noeud commentaire . . . .
10
3.8
Noeud instruction de traitement
. . . .
10
4
Les ´
el´
ements de structure
11
4.1
Les sections conditionnelles . . . .
11
4.2
Boucle sur des ensembles de noeuds . . . .
12
4.3
Tri d’un ensemble de noeuds . . . .
12
5
Les variables XSL
13
5.1
D´
efinition de variables . . . .
13
5.2
D´
efinition de variables (suite) . . . .
13
6
R`
egles nomm´
ees et param`
etres
14
6.1
Param`
etres de r`
egle . . . .
14
6.2
R`
egles nomm´
ees . . . .
15
6.3
Param`
etres d’une feuille XSL . . . .
15
7
Traitement des espaces de noms
15
8
Indexation et utilitaires
16
8.1
Indexation du document XML
. . . .
16
8.2
Utilitaires
. . . .
17
9
Formatage des nombres
17
10 Extension d’XPATH par XSL
18
11 Les d´
eclarations
19
11.1 Format de sortie . . . .
19
11.2 Importation de feuilles XSL . . . .
19
11.3 Priorit´
e des r`
egles import´
ees
. . . .
19
11.4 Inclusion de feuille XSL . . . .
20
11.5 Liste d’attributs r´
eutilisable . . . .
20
11.6 Gestion des espaces . . . .
20
12 ´
Etendre XSLT
21
12.1 ´
Etendre XSL avec JAVA . . . .
21
12.2 Utiliser son extension . . . .
21
12.3 Extension standard pour XSLT . . . .
22
1
Introduction
1.1
D´
efinition de XSL
•
XSL (
eXtensible Stylesheet Language
) c’est
• XSLT (
XSL Transformation
),
• FO (
Formatting Object
)
•
XSLT est un langage permettant de produire un document XML ou texte `
a partir d’un autre document par
application de r`
egles de transformation.
C’est donc un outil
essentiel
dans une chaˆıne de traitement XML.
•
FO est une DTD XML qui d´
efinie la pr´
esentation d’un texte sur un document papier (PS, GV, PDF, DPS).
1.2
Structure d’une feuille de style
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > ... d´eclarations globales ... (?) ... r`egles de transformation ... (?) </xsl:stylesheet>
Le symbole (?) indique le caract`
ere optionnel d’un attribut ou d’un ´
el´
ement.
2
Les r`
egles de transformation
2.1
D´
eclaration d’une r`
egle
L’attribut match indique les noeuds trait´
es par cette r`
egle :
<xsl:template match="expression_XPATH" >
... contenu de remplacement ... (?) </xsl:template>
Fonctionnement
: Dans le corps d’une r`
egle
• les noeuds ´
el´
ements XSL sont
interpr´
et´
es
• les autres noeuds (texte et ´
el´
ement) sont
recopi´
es
Dans une r`
egle, le
noeud par d´
efaut
est celui sur lequel s’applique la r`
egle.
<xsl:template match="section[nom]" >
<p> <!-- recopi´e --> nom : <!-- recopi´e --> <xsl:value-of select="nom"/> <!-- interpr´et´e --> </p> <!-- recopi´e --> </xsl:template>
2.2
Une r`
egle pour plusieurs ´
el´
ements
L’attribut match peut contenir plusieurs expressions XPATH connect´
ees par un | (
union des ensembles de
noeuds
) :
<xsl:template match="expr1|expr2|..." >
... ´el´ement(s) de remplacement ...
</xsl:template>
Exemple
:
<xsl:template match="section|chapitre|definition"> <p>nom : <xsl:value-of select="nom"/></p> </xsl:template>
2.3
Traitement des ´
el´
ements fils
Dans une r`
egle, l’´
el´
ement xsl:apply-templates traite les fils du noeud courant :
Feuille XSL
<xsl:template match="/"> <liste> <xsl:apply-templates /> </liste> </xsl:template> <xsl:template match="a|b"> <xsl:apply-templates /> </xsl:template> <xsl:template match="c"> <c> <xsl:value-of select="." /> </c> </xsl:template>Donn´
ees XML
<a> <b> <c>Hello</c> </b> <b/> <a/> </a>R´
esultat
<liste> <c>Hello</c> </liste>2.4
S´
election des ´
el´
ements fils
Nous
pouvons
directement
s´
electionner
les
´
elements
`
a
traiter
avec
l’attribut
select
de
xsl:apply-templates :
<xsl:template match="/"> <liste> <xsl:apply-templates select="//c" /> </liste> </xsl:template> <xsl:template match="c"> <c> <xsl:value-of select="." /> </c> </xsl:template>2.5
Notre exemple
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE stock SYSTEM "essai.dtd">
<stock> <produit>
<nom> Livre </nom>
<prix monnaie="Francs"> 50 </prix>
<comment> Un article tr`es recherch´e </comment> </produit>
<produit>
<nom> CD </nom>
<prix monnaie="Euros"> 23 </prix> </produit>
</stock>
2.6
Une feuille sans r`
egle
Une feuille de style contient toujours deux r`
egles
par d´
efaut
:
• La premi`
ere code le
parcours en profondeur
:
<xsl:template match="*|/"> <!-- R1 --> <xsl:apply-templates/>
</xsl:template>
• La seconde extrait les noeuds de
type texte
:
<xsl:template match="text()"> <!-- R2 --> <xsl:value-of select="."/>
</xsl:template>
2.7
Traitement de l’exemple (2)
L’application d’une feuille de style vide donne :
Livre 50 Un article très recherché CD 23 <?xml version="1.0" encoding="UTF−8"?> R1 R2 R2 R2 R2 R2 R1 R1 R1 XSL
Le texte est cod´
e en UTF-8.
2.8
Exemple de feuille de style
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" doctype-system="http://www.w3.org/TR/REC-html40/loose.dtd" /> <xsl:template match="/"> <!-- R1 --> <html><body> <xsl:apply-templates/> </body></html> </xsl:template> <xsl:template match="stock"> <!-- R2 --> <h1>Stock de la soci´et´e</h1>
<xsl:apply-templates/> </xsl:template>
<xsl:template match="produit"> <!-- R3 --> <h2>Produit <xsl:value-of select="nom"/></h2>
<p>Prix : <xsl:value-of select="prix"/> en <xsl:value-of select="prix/@monnaie"/></p> <xsl:if test="comment"> <p><xsl:value-of select="comment"/></p> </xsl:if> </xsl:template> </xsl:stylesheet>
2.9
Utilisation de la feuille de style
L’application de la feuille de style pr´
ec´
edente donne :
<p> Un article très recherché </p> <p>Prix : 50 en Francs</p> <h2>Produit Livre </h2> <h1>Stock de la société</h1> <body> <html> <!DOCTYPE HTML SYSTEM "http://www..."> </html> </body> <p>Prix : 23 en Euros</p> <h2>Produit CD </h2> XSL R1 R2 R3 R3
2.10
S´
election des r`
egles par paquets
Deux r`
egles et deux modes
<xsl:template match="produit">
<h2>Produit <xsl:value-of select="nom"/></h2>
<xsl:apply-templates select="." mode="seulement-prix" /> <xsl:apply-templates select="." mode="seulement-comment" /> </xsl:template>
<xsl:template match="produit" mode="seulement-prix"> <p>Prix : <xsl:value-of select="prix"/>
en <xsl:value-of select="prix/@monnaie"/></p> </xsl:template>
<xsl:template match="produit" mode="seulement-comment"> <xsl:if test="comment">
<p><xsl:value-of select="comment"/></p> </xsl:if>
</xsl:template>
3
Construction de l’arbre r´
esultat
3.1
Noeud textuel constant
Ins´
erer un noeud texte
<xsl:text>
... texte `a ins´erer ... </xsl:text>
Exemple
: pour obtenir Soleil & nuages :
<xsl:text>Soleil & nuages</xsl:text>
<xsl:text><![CDATA[Soleil & nuages]]></xsl:text>
Par d´
efaut
, les noeuds de texte sont ´
egalement recopi´
es :
<xsl:template match="prix">
Prix : <xsl:value-of select="."/> </xsl:template>
Pour ´
eviter les
espaces superflus
il est pr´
ef´
erable d’utiliser :
<xsl:template match="prix"> <xsl:text>Prix : </xsl:text> <xsl:value-of select="."/> </xsl:template>
Remarque
: Les noeuds constitu´
es
uniquement
d’espaces ( &x20; , &x9; , &xD; , &xA; ) ne sont pas r´
ecopi´
es.
3.2
Noeud texte par XPATH
<xsl:value-of select="expression_XPATH" />
Exemples
:
<xsl:value-of select="/stock/produit[nom=’Livre’]/prix" />
<!-- le fils "nom" du noeud courant --> <xsl:value-of select="./nom" />
Seul le
premier noeud
renvoy´
e est utilis´
e (appel implicite de la fonction string ).
3.3
Noeud ´
el´
ement et attribut
• Pour ins´
erer un
noeud de type ´
el´
ement
dont on connait le nom il suffit de le placer dans la r`
egle :
<xsl:template match="produit">
<h2>Produit <xsl:value-of select="nom"/></h2> </xsl:template>
• Une expression
XPATH
peut ˆ
etre utilis´
ee dans la valeur d’un attribut si elle est entour´
ee
d’accolades
(utilisez {{ pour { et }} pour } ).
<xsl:template match="produit">
<h2 id="{@id}" title="Description : {comment}"> <xsl:value-of select="nom"/>
</h2>
</xsl:template>
On consid`
ere dans cet exemple que l’´
el´
ement produit poss`
ede un attribut id et un sous-´
el´
ement comment .
3.4
Noeud ´
el´
ement et attribut dynamique
•
Quand on ne connait pas le nom de l’´
el´
ement `
a ins´
erer, on utilise :
<xsl:element
name="nom_local" (!) namespace="espace_de_nom" (?) >
... contenu de cet ´el´ement ... </xsl:element>
•
Mˆ
eme chose pour un attribut :
<xsl:attribute
name="nom_local" (!) namespace="espace_de_nom" (?) >
... valeur de cet attribut ... </xsl:attribute>
<prix monnaie="Euros"> 10 ==> <Euros prix="10"/> </prix>
avec la r`
egle
<xsl:template match="prix"> <xsl:element name="{@monnaie}"> <xsl:attribute name="prix"> <xsl:value-of select="."/> </xsl:attribute> </xsl:element> </xsl:template>Exemple 2
: La notation
<section id="{une-expression-xpath}"> ... d´efinition du contenu ... </section>est ´
equivalente `
a
<section> <!-- attribut --> <xsl:attribute name="id"> <xsl:value-of select="une-expression-xpath"/> </xsl:attribute> <!-- contenu --> ... d´efinition du contenu ... </section>On peut donc commencer par
d´
efinir
un ´
el´
ement, puis lui
ajouter des attributs
et enfin lui
ajouter du contenu
.
3.5
Copie de noeuds
•
Copie directe d’un ensemble de noeuds :
<xsl:copy-of select="expression_XPATH" />
Exemple 1
: ne garder que le nom et le prix :
<xsl:template match="produit"> <produit>
<xsl:copy-of select="nom|prix"/> </produit>
</xsl:template>
Exemple 2
: copie fid`
ele :
<xsl:template match="/" > <xsl:copy-of select="/" /> </xsl:template>
3.6
Copie du noeud courant sans le contenu
•
Cr´
eer un ´
el´
ement de mˆ
eme nom que le noeud
cou-rant :
<xsl:copy>
... contenu ... </xsl:copy>
Examples
<!-- Tout recopier (ou presque) --> <xsl:template match="*"> <xsl:copy> <xsl:xsl:copy-of select="@*" /> <xsl:apply-templates /> </xsl:copy> </xsl:template> <!-- Enlever le prix --> <xsl:template match="cadeau"> <xsl:copy> <xsl:copy-of select="*[not(self::prix)]"/> </xsl:copy> </xsl:template>
3.7
Noeud commentaire
•
Ins´
erer un commentaire :
<xsl:comment>
... texte du commentaire ... </xsl:comment>
3.8
Noeud instruction de traitement
L’instruction XSL
<xsl:processing-instruction name="cible" >
arg1=’val1’ arg2=’val2’
</xsl:processing-instruction>
donne dans le document produit
4
Les ´
el´
ements de structure
4.1
Les sections conditionnelles
<xsl:if test="expression_XPATH"> ...
</xsl:if>
Comportement
: Le corps de l’´
el´
ement xsl:if est trait´
e
si et seulement si
boolean(expression XPATH)
est vraie.
Remarque
: Il n’y a pas de structure
sinon
.
Exemple
:
<xsl:template match="produit">
<h2>Produit <xsl:value-of select="nom"/></h2>
<xsl:if test="comment[ (normalize-space(.) != ’’) ]"> <p><xsl:value-of select="comment"/></p> </xsl:if> </xsl:template>
•
Le choix multiple
<xsl:choose> <xsl:when test="expression_XPATH_1"> ... </xsl:when> <xsl:when test="expression_XPATH_2"> ... </xsl:when> ... <xsl:otherwise> ... </xsl:otherwise> </xsl:choose>La partie otherwise est optionnelle. Les ´
el´
ements when peuvent ˆ
etre vides.
Exemple
de choix multiple :
<xsl:template match="produit"> <xsl:choose> <xsl:when test="not(comment)"> <p>Pas de commentaire.</p> </xsl:when> <xsl:when test="(normalize-space(comment) = ’’)"> <p>Commentaire vide.</p> </xsl:when> <xsl:otherwise> <p><xsl:value-of select="comment" /></p> </xsl:otherwise> </xsl:choose> </xsl:template>
4.2
Boucle sur des ensembles de noeuds
•
L’instruction XSL for-each modifie le noeud courant :
<xsl:for-each select="expression_XPATH"> ...
</xsl:for-each>
Exemple
:
<xsl:template match="/"> <h1>Liste des noms</h1> <xsl:for-each select="//nom">
<p>nom : <xsl:value-of select="."/></p> </xsl:for-each>
</xsl:template>
4.3
Tri d’un ensemble de noeuds
•
L’instruction xsl:sort associ´
ee `
a xsl:for-each et xsl:apply-templates
modifie
l’ordre des noeuds :
<xsl:sort
select="expression_XPATH" (.) data-type="text|number" (text) order="ascending|descending" (ascending) case-order="upper-first|lower-first" (upper-first) lang="nom_de_langue" (langue syst`eme) />
Exemple 1
:
<xsl:template match="/">
<h1>Liste des produits</h1> <xsl:for-each select="//produit">
<xsl:sort select="nom"/>
<p>nom : <xsl:value-of select="nom"/></p> </xsl:for-each>
Exemple 2
:
<xsl:template match="/">
<h1>Liste des produits</h1>
<xsl:apply-templates select="//produit" >
<xsl:sort select="prix" order="descending" /> <xsl:sort select="nom" order="descending" /> </xsl:apply-templates>
</xsl:template>
Plusieurs clauses xsl:sort sont utilisables.
5
Les variables XSL
5.1
D´
efinition de variables
•
Les variables contenants un fragment de
l’arbre resultat
. Elles peuvent ˆ
etre
globales
ou
locales
.
<xsl:variable name="nom_de_la_variable"> ... contenu ... </xsl:variable>
Exemple
<xsl:variable name="head"> <head><link rel="stylesheet" type="text/css" href="style.css" /> </head> </xsl:variable> <xsl:template match="/"> <html> <xsl:copy-of select="$head"/> <body>...</body> </html> </xsl:template>
5.2
D´
efinition de variables (suite)
•
Les variables contenants un fragment de
l’arbre d’entr´
ee
:
<xsl:variable
name="nom_de_la_variable" select="expression_XPATH" />
Exemple
<xsl:variable name="produits" select="//produit" /> <xsl:variable name="pas.cher" select="$produits[prix < 10]" /> <xsl:variable name="gratuit" select="$pas.cher[prix = 0]" />
<xsl:template match="/"> ...
<xsl:for-each select="$pas.cher[ comment ]"> ...
</xsl:for-each> ...
</xsl:template>
5.3
Priorit´
es fix´
ees entre les r`
egles
•
L’attribut priority permet
d’augmenter
(si > 0) ou de
diminuer
(si < 0) la priorit´
e d’une r`
egle :
<!-- traiter les produits dont le prix est sup´erieur `a 10 --> <xsl:template match="produit[ (prix > 10) ]" priority="100" >
...
</xsl:template>
<!-- traiter les produits -->
<xsl:template match="produit" priority="0" > <!-- d´efaut --> ...
</xsl:template>
<!-- traiter les ´el´ements -->
<xsl:template match="*" priority="-1000" > ...
</xsl:template>
6
R`
egles nomm´
ees et param`
etres
6.1
Param`
etres de r`
egle
R`
egle avec param`
etres
<xsl:template match="produit">
<xsl:param name="avecPrix" select="false()" /> <xsl:param name="prix" select="prix" />
<h2><xsl:value-of select="nom" /></h2> <xsl:if test="$avecPrix">
<p>Prix : <xsl:value-of select="$prix" /></p> </xsl:if>
</xsl:template>
Passage des param`
etres
<xsl:apply-templates select="//produit">
<xsl:with-param name="avecPrix" select="true()" />
<xsl:with-param name="prix" select="(prix * 0.9)" /><!-- r´eduction --> </xsl:apply-templates>
6.2
R`
egles nomm´
ees
R`
egle accompagn´
ee d’un nom
<xsl:template name="faire-le-site-du-master"> <xsl:apply-templates select="//parcours" /> <xsl:apply-templates select="//enseignement" /> <xsl:apply-templates select="//intervenant" /> </xsl:template>
Appel de r`
egle nomm´
ee
<xsl:apply-templates select="/">
<xsl:call-template name="faire-le-site-du-master" /> <xsl:call-template name="faire-autre-chose" /> </xsl:apply-templates>
Remarque
: le noeud courant de la r`
egle
appelante
devient le noeud courant de la r`
egle
appel´
ee
.
Remarque
: vous pouvez utiliser des
param`
etres
.
6.3
Param`
etres d’une feuille XSL
Il est possible d’ajouter des
param`
etres `
a une feuille XSL
afin de changer son fonctionnement :
Feuille XSL avec param`
etre
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="debug" select="false()" />
... r`egles ...
</xsl:stylesheet>
Les param`
etres s’utilisent comme des variables :
<xsl:if test="($debug)"> MODE DEBUG
</xsl:if>
7
Traitement des espaces de noms
Il est possible de travailler sur
plusieurs espaces de noms
:
<stock xmlns="http://www.luminy.univ-mrs.fr"> ...
Feuille de style
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:lum="http://www.luminy.univ-mrs.fr" xmlns:dil="http://www.dil.univ-mrs.fr" version="1.0"> <xsl:template match="/"> <dil:prix> <xsl:value-of select="//lum:produit[1]/lum::prix" /> </dil:prix> </xsl:template> </xsl:stylesheet>L’application de la feuille de style donne :
<dil:prix xmlns:dil="http://www.dil.univ-mrs.fr" xmlns:lum="http://www.luminy.univ-mrs.fr" > 50
</dil:prix>
L’espace de nom
lum
est d´
efini mais pas utilis´
e. Nous pouvons demander sa suppression avec
exclude-result-prefixes :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:lum="http://www.luminy.univ-mrs.fr" xmlns:dil="http://www.dil.univ-mrs.fr" exclude-result-prefixes="lum" version="1.0"> ... m^eme r`egle ... </xsl:stylesheet>8
Indexation et utilitaires
8.1
Indexation du document XML
•
Cr´
eation de cl´
es :
<programme> <module> <cours> <nom>XML</nom> <enseignant>Jean-Luc Massat</enseignant> ... <xsl:key name="lesCours" (!) match="/programmes/module/cours" (!) use="nom" (!) />key(’lesCours’, ’XML’)/enseignant
Exemple 2
:
...
<produit code="756200"> ... </produit> <produit code="563980"> ... </produit> ... <commande> <code-produit>756200</code-produit> <code-produit>563980</code-produit> ... </commande> ...
<xsl:key name="commandesParCode" match="//commande" use="code-produit" />
<xsl:template match="/">
<h2>Les commandes des produits en stock</h2>
<xsl:variable name="enStock" select="//produit[ (stock > 0) ]" /> <xsl:apply-templates select="key(’commandesParCode’, $enStock/@code)" /> </xsl:template>
8.2
Utilitaires
´
Emission d’un
message d’erreur
:
<xsl:message
terminate="yes|no" (?) />
... texte du message ... </xsl:message>
Pour
imprimer
un message sur la sortie d’erreur standard et ´
eventuellement
arrˆ
eter
le processeur XSL.
9
Formatage des nombres
La fonction format-number(nombre,format) renvoie une chaˆıne issue du formatage d’un nombre :
format-number(500100, "###,###.00") = 500,100.00
Nous pouvons ´
egalement d´
efinir un format et l’utiliser :
<xsl:decimal-format name="mesNombres" (?) decimal-separator="," (.) grouping-separator="." (,) infinity="" (infinity) NaN="" (NaN) percent="%" (%) per-mille="M" (?) />
format-number(34.567, "0,##", "mesNombres") = 34,57 format-number(.6, "0%", "mesNombres") = 6% format-number(.6, "0M", "mesNombres") = 60M
10
Extension d’XPATH par XSL
XPATH est
´
etendu
:
• ajout de la fonction generate-id(noeud) qui renvoie un identifiant unique :
<!-- test de noeuds identiques -->
<xsl:if test="generate-id($n1) = generate-id($n2)"> ...
</xsl:if>
• ajout de la fonction current() qui renvoie le noeud courant
<xsl:template ...>
<xsl:variable name="p" select="//article[@id = current()/@id]"/> ...
</xsl:template ...>
• ajout de la fonction key(index,clef) ,
• ajout du ou | dans les expressions.
• ajout de la fonction format-number(nombre,format)
• ajout de la fonction document(URI) qui renvoie le document XML identifi´e par l’URI
<xsl:value-of select="document(’stock.xml’)//produit[prix > 10]" />
Deux documents li´
es
<xsl:variable name="stock" select="document(’/chemin/vers/stock.xml’)" /> <xsl:variable name="achats" select="document(’achat.xml’, $stock)" />
Attention
: l’utilisation des noeuds issus d’un autre arbre entraˆıne un
changement de contexte
qui
s’applique a toutes les
expressions XPATH
(nouvelle d´
efinition de la racine / ).
11
Les d´
eclarations
11.1
Format de sortie
<xsl:output method="xml|html|text|..." (xml) version="nu_de_version" (1.0) encoding="encodage" (UTF-8) indent="yes|no" (yes) xml-declaration="yes|no" (yes) doctype-system="URL_de_la_DTD" (?) doctype-public="FPI_de_la_DTD" (?) cdata-section-elements="liste d’´el´ements" (?) ...
/>
11.2
Importation de feuilles XSL
•
Importation de feuilles XSL avec gestion de la priorit´
e :
<xsl:import href="URL_de_la_feuille_XSL" />
Les r`
egles import´
ees sont moins prioritaires que les r`
egles d´
efinies dans la feuille courante.
Cette d´
eclaration doit figurer en tˆ
ete d’une feuille de style.
11.3
Priorit´
e des r`
egles import´
ees
Les r`
egles
internes
sont
plus prioritaires
que les r`
egles
import´
ees
. La clause <xsl:apply-imports/> permet
de choisir les r`
egles import´
ees.
Feuille base.xsl
<!-- r`egle R1 --> <xsl:template match="pre"> <xsl:copy-of select="."/> </xsl:template>Feuille mise-en-forme.xsl
<xsl:import href="base.xsl" /> <!-- r`egle R2 --> <xsl:template match="pre"> <center><xsl:apply-imports /></center> </xsl:template>L’application de mise-en-forme.xsl
<center> <!-- g´en´er´e par la r`egle R2 --> <pre> ... </pre> <!-- g´en´er´e par la r`egle R1 --> </center>
11.4
Inclusion de feuille XSL
•
Inclusion de feuilles XSL (aucun impact sur la priorit´
e) :
11.5
Liste d’attributs r´
eutilisable
Forme g´
en´
erale :
<xsl:attribute-set name="nom-de-liste" (!) use-attribute-sets="nom-de-liste" (?) > ... d´efinitions d’attributs ... </xsl:attribute-set>
Utilit´
e
: regrouper les d´
efinitions d’attributs pour les r´
eutiliser associ´
ees `
a plusieurs ´
el´
ements (tableaux,
para-graphes, images, etc.)
Les listes sont d´
efinies en
dehors
des r`
egles.
Exemple
:
<xsl:attribute-set name="classeTableau" >
<xsl:attribute name="class">tableau</xsl:attribute> </xsl:attribute-set>
<xsl:attribute-set name="tableauAvecBords" use-attribute-sets="classeTableau" > <xsl:attribute name="border">1</xsl:attribute> </xsl:attribute-set> <xsl:template match="/"> <table xsl:use-attribute-sets="tableauAvecBords" > ... contenu du tableau ... </table> </xsl:template>
nous donne
<table class="tableau" border="1"> ... contenu du tableau ... </table>
11.6
Gestion des espaces
•
Politique par d´
efaut de gestion des blancs pour les noeuds de type texte.
<xsl:preserve-space
elements="liste_d’´el´ements" (!) />
<xsl:strip-space
elements="liste_d’´el´ements" (!) />
12
Etendre XSLT
´
12.1
´
Etendre XSL avec JAVA
Avec la classe Java
import java.util.Date; import java.util.Calendar;
public class GetDate {
public static Date getDate(String full) { Date d = Calendar.getInstance().getTime(); if (! full.equals("true")) { d.setMinutes(0); d.setHours(0); } return d; } }
12.2
Utiliser son extension
et la feuille de style :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java"> <xsl:output method="html"/> <xsl:template match="/"> <xsl:value-of select="java:GetDate.getDate(’true’)" /> <xsl:value-of select="java:GetDate.getDate(’false’)" /> </xsl:template>nous obtenons
Tue Jan 21 17:48:03 CET 2015 Tue Jan 21 00:00:03 CET 2015