Vous êtes sur la page 1sur 52

XSLT

Feuilles de styles
Feuilles de styles
• But: Indépendance entre contenue et affichage
– Affichage à des périphériques particuliers
• Imprimantes
p
• Téléphones mobiles
• PDA
– Tout les navigateurs web récents supportent les
feuilles de styles CSS (Cascading Style Sheet)
F ill de
Feuilles d styles
t l (CSS)
Cascading
g Style
y Sheets
• Principalement associée à HTML
• Permet de spécifier dans les pages web:
– Les polices de caractères, leurs attributs d’affichage
(gras, italique, souligné, taille, couleur)
– La couleur ou l’image de fond
– Les formats de puces
– Les couleurs de liens
– Les alignements par défaut
– Etc.
Processus pour afficher des pages
HTML pourvues de feuilles de styles

Fichiers HTML Fichiers CSS


avec ppeu de Chargement
g
mise en forme

N i
Navigateur WEB

Affichage

Fichiers HTML
riche en mise
en forme
Feuilles de styles (CSS)
• Les différentes versions officielles de ce standard
sont les suivantes:
– CSS1 (level 1): recommandation depuis le 17 décembre
1996; version de base
– CSS2 (level 2) recommandation depuis le 12 mai 1998
• Affichage graphique
• Gestion du son
• Impression en braille pour les non-voyant
– CSS3 (level 2) working draft
• Traitement de langues: Arabes et chinoises
Limites pour afficher un document
XML avec CSS

• CSS a été prévue pour HTML qui possède déjà


d’importantes facultés de mise en page.
• CSS propose donc uniquement des fonctions de mise
en forme assez simples (on ne peut pas insérer de
retour
t chariot
h i t en CSS puisque
i cecii estt normalement
l tà
la charge de HTML).
• Pas
P de d possibilité
ibilité de
d filtres
filt ett de
d tri.
ti
• Les attributs XML ne peuvent pas être affichés,
seulement
l t le
l contenu
t d éléments
des élé t peutt l’être.
l’êt
Objectifs
j du langage
g g XSLT
• XSLT (eXtensible Stylesheet Language Transformations) est une
recommandation W3C depuis novembre 1999. 1999

• Depuis Mai 2010 la version 2.1

• XSLT est un langage de feuilles de styles associé à XML


((bien sûr)) écrit en XML.

• XSLT permet la génération d’autres contenus à partir d’un


fichier XML
XML, par exemple:
– du HTML (bien formé)
– du XML plus compliqué (tables de matière + règles de formatage)
– du Latex,
– du PDF
– du code Java,
– format Microsoft RTF,…
Objectifs
j du langage
g g XSLT
• Une feuille de style XSLT est un document séparé
qui contient des règles de transformation XSLT
• Une règleg de transformation comportep deux
parties:
– Un modèle de chemin exprimé p en termes du langage g g
XPath,
– Une transformation sous la forme d’une suite d’instructions.
• On peut associer une feuille de style XSLT à un
((ou pplusieurs)) documents XML
• XSLT permet de:
– sélectionner et extraire ll’information
information d
d’un
un document XML
– générer de nouveaux documents XML
XSLT = Transformation d’arbre
Feuille de style XSLT

Document source Document de sortie

Processeur
XSLT
Association d’un fichier XSL à un
fichier XML
• U
Une feuille
f ill ded style
t l XSL (enregistré
( i t é dans
d un
fichier dont l'extension est .xsl ) peut être liée à
un document
d XML en insérant
i é l balise
la b li suivante
i
au début du document XML :
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="project.xsl"
type="text/xsl"?>
/

<votre_xml>

......

</votre_xml>
Structure de document XSLT
• Les
L instructions
i t ti sontt des
d éléments
élé t XML
<?xml version="1.0" encoding="UTF-8"?>
< l t l h t
<xsl:stylesheet
<!-- déclaration de version et de namspace-->
version="1
version 1.0
0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
! Format de sortie -->
<xsl:output method="xml" version="1.0" encoding="UTF-8"/>
<!-- ... règles
g XSLT ... -->
<xsl:template match="condition">
... Actions..
</xsl:template>
</xsl:stylesheet>
Elé
Elément
t <xsl:stylesheet>
< l t l h t>
• Él
Élément racine
i d’un
d document
d XSLT + attributs
ib
fixés.
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
– Attribut version : version de langage XSL
– Attribut xmlns:xsl : espace
p de nom XSL.
– Le fait que toutes les balises XSL commencent par xsl:
p
empêche toute confusion.
Elément <xsl:output>
• Format de sortie du document résultat

<xsl:output method="xml" encoding="UTF-8" …/>

– Attribut method : type du document en sortie


(XML HTML
(XML, HTML, ddu code
d JJava, fformatt Mi
Microsoft
ft RTF
RTF,
LaTex,…)
– Attribut
A ib encoding : codage d du
d ddocument (ISO-
(ISO
8859-1, UTF-8,…)
Élément <xsl:template>
• Un programme XSLT est un ensemble de règles
• Une règle est décrite sous forme d’un élément
XML :
<xsl:template match="condition">
… Actions
ti …
</xsl:template>
– Condition: c’est une expression XPATH
– Actions: cc’est
est des instructions XSLT et/ou
données littérales.
Actions de base
• Les actions à l’intérieur de xsl:template peuvent être:
– Commande de recopie du contenu, sans balises
<xsl:value-of select="BALISE-OU-JOKER"/>

– Commande de recopie de l’élément (contenu + balises)


<xsl:copy of select=
<xsl:copy-of select="BALISE
BALISE-OU-JOKER
OU JOKER"/>
/>

– Commande de traitement des éléments suivants


<xsl:apply-templates select="BALISE"/>

Exemples de Jokers:
– * signifie ‘tout fils’
– . signifie l’élément courant
Élément <xsl:template>
• La transformation XSLT débute obligatoirement
par le traitement de la règle racine dans tout
fichier XSLT (c'est la première chose que le
processeur XSLT recherche).
recherche)
<xsl:template match=
match="/">
/ >
… action …
</xsl:template>
• Cette règle ss'applique
applique au nœud racine du fichier
XML.
Premier exemple complet
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www
xmlns:xsl= http://www.w3.org/1999/XSL/Transform
w3 org/1999/XSL/Transform">
>

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


« A la racine du
<xsl:template match="/">
<HTML> document d’entrée ! »
<HEAD>
<TITLE>Welcome</TITLE>
</HEAD> Arbre en sortie
<BODY>
Welcome!
</BODY>
</HTML> Action :
</xsl:template> « Document html
inclus à générer ! »
</xsl:stylesheet>
Élé
Élément
t <xsl:value-of>
< l l f>
• Générer le contenu d’un élément
• Insère la valeur du nœud sélectionné sous la
forme de texte.
Syntaxe

<xsl:value-of select="Expression Xpath"/>


Exemple 1
• Arbre en entrée
<carteDeVisite>
<nom> Mohamed
M h d </nom>
/
</carteDeVisite>

• Template
<xsl:template match=
match="carteDeVisite">
carteDeVisite >
<xsl:value-of select="nom"/>
</xsl:template>
• Arbre en sortie
Mohamed
Exemple 2
• Arbre en entrée
<carteDeVisite>
<nom> Mohamed
M h d </nom>
/
</carteDeVisite>

• Template
<xsl:template match=
match="carteDeVisite">
carteDeVisite >
<p>Nom : <xsl:value-of select="nom"/></p>
</xsl:template>
• Arbre en sortie
<p>Nom : Mohamed</p>
Exemple 3
• Arbre en entrée
<carnetDAdresse>
<carteDeVisite> <nom>Ali </nom> </carteDeVisite>
<carteDeVisite> <nom> Salima </nom> </carteDeVisite>
<carteDeVisite> <nom> Mohmed </nom> </carteDeVisite>
</carnetDAdresse>

• Template
T l
<xsl:template match="/carnetDAdresse">
<xsl:value-of select="carteDeVisite/nom"/>
</xsl:template>
• En sortie
Ali
Seul le premier élément sélectionné est produit
Exemple 4
• Arbre en entrée
<carnetDAdresse>
<carteDeVisite> <nom>Ali </nom> </carteDeVisite>
<carteDeVisite> <nom> Salima </nom> </carteDeVisite>
<carteDeVisite> <nom> Mohmed </nom> </carteDeVisite>
</carnetDAdresse>

Template
<xsl:template match="/carnetDAdresse/carteDeVisite">
<xsl:value-of select="nom"/>
</xsl:template>

• En sortie
AliSalimaMohmed
Pour chaque carte de visite le template est appliqué
Application de la première règle sur la racine
Génération de
<h1>Le 1er nom est
Génération du nœud correspondant au chemin
promotion/individu/nom
Génération de
</h1>
Rédi
Rédiger une feuille
f ill ded style
t l XSLT

• Il existe deux façons d’appeler un template :


1. Appliquer les templates correspondants à tous
les fils du nœud courant :
<xsl:apply-templates/>

2 Sélectionner les nœuds à traiter à ll’aide


2. aide d
d’une
une
requête XPath, et leur appliquer les templates
correspondants
d :
<xsl:apply-templates select=”requeteXPath”/>
Élément
<xsl:apply-templates>
• Indique au processeur XSL de traiter les éléments
enfants directs en leur appliquant
pp q les templates
p définies
dans la feuille XSL.
<xsl:template
l l match="expression
h " i Xpath">
h"

<xsl:apply
xsl:apply-templates
templates select
select="fils-à-traiter"/>
fils à traiter />

</xsl:template>

• L'attribut select permet de spécifier certains


éléments enfants auxquels la transformation doit être
appliquée
Principe de « propagation »
• Si dans la feuille de style on prévoit une instruction
xsl:template pour traiter un certain élément,
élément ne pas
oublier de préciser dans l’instruction ce qui doit se
passer avec ses fils !
– si on veut les ignorer, on ne dit rien
– si on veut les traiter, écrire :
<xsl:apply-templates select="fils-à-traiter"/>

– pour traiter tous les fils, écrire :


<xsl:apply-templates select="*"/>
Second exemple complet (1)
<xsl:stylesheet version="1.0"
xmlns:xsl=
"http://www
http://www.w3.org/1999/XSL/Transform
w3 org/1999/XSL/Transform">
>
<xsl:output method="html" indent="no"
g
encoding="iso-8859-1"/>

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


<html>
<xsl:apply-templates/>
</html>
</xsl:template>
Modèle de sous-arbre
...
Second exemple complet (suite)
<xsl:template match="carnetDAdresse">
<body>
<h1>Liste des Noms</h1>
<xsl:apply-templates/>
</body>
</xsl:template>

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

</xsl:stylesheet>
Exemple
• Pour un document source contenant 4 cartes de visite
<carnetDAdresse>
<carteDeVisite> <nom> Bekkers </nom> </carteDeVisite>
<carteDeVisite> <nom> Bartold </nom> </carteDeVisite>
<carteDeVisite> <nom> Letertre </nom> </carteDeVisite>
<carteDeVisite> <nom> Apolon </nom> </carteDeVisite>
</carnetDAdresse>

<html>
<body>
<h1>Liste des Noms</h1>
<p>Nom : Bekkers</p>
<p>Nom : Bartold</p>
<p>Nom : Letertre</p>
<p>Nom
p No : Apolon</p>
po o /p
</body>
</html>
Production d'élément
Peut se faire :

• Avec des littéraux


<xsl:template match carnetDAdresse >
match="carnetDAdresse">
<carteDeVisite> …./…</carteDeVisite>
</xsl:template>

Ou bien avec xsl:element


<xsl:template
p match="carnetDAdresse">
<xsl:element name="carteDeVisite">
…./…
</xsl:element>
</xsl:template>

• En sortie
<carteDeVisite> …./…</carteDeVisite>
Production d’attribut

• avec xsl:attribute
<xsl:template match carnetDAdresse >
match="carnetDAdresse">
<carteDeVisite>
< xsl:attribute name="date">02/12/2010 < /xsl:attribute>
</carteDeVisite>
</xsl:template>

• En sortie
<carteDeVisite date="02/12/2010"> …./…</carteDeVisite>
Production dd’attribut
attribut
• Arbre en entrée
<a href="fic.txt"/>
• Template
<xsl:template match=
match="a">
a >
<b><xsl:attribut name="id">
<xsl:value-of select="@href"/>
select= @href />
</xsl:attribut></b>
</xsl:template>
• En sortie
<b id="fic.txt"/>
Élement <xsl:for-each>
• Applique un modèle de manière répétée, c'est-
à-dire à chaque nœud d'une collection.
• Traite ll'un
un après ll'autre
autre tous les nœuds obtenus
par l'attribut select.
<xsl:for-each
select="Expression-Xpath">
p p
…actions…
</xsl:for-each>
/xsl:for each
Exemple
<?xml version=
version="1
1.0
0"?>
?>
<?xml‐stylesheet type="text/xsl" href="foreach.xsl" ?>
<customers>
<customer>
<name>John Smith</name>
<address>123 Oak St.</address>
<state>WA</state>
/
<phone>(206) 123‐4567</phone>
</customer>
<customer>
<name>Zack Zwyker</name>
<address>368 Elm St.</address>
<state>PA</state>
<phone>(206) 423‐4537</phone>
</customer>
<customer>
<name>Albert Aikens</name>
lb ik /
<address>369 Elm St.</address>
<state>PA</state>
< h
<phone>(206) 423‐4538</phone>
>(206) 423 4538</ h >
</customer>
</customers>
Feuille de style foreach.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template
p match="/">
/
<HTML>
<BODY>
<TABLE>
<xsl:for‐each select="customers/customer">
<TR>
<TD><xsl:value of select=
<TD><xsl:value‐of select="name" /></TD>
name  /></TD>
<TD><xsl:value‐of select="address" /></TD>
<TD><xsl:value‐of select="phone" /></TD>
</TR>
/TR
</xsl:for‐each>
</TABLE>
</BODY>
</HTML>
p
</xsl:template>
John Smith    123 Oak St  (206) 123‐4567
</xsl:stylesheet> Zack Zwyker
Z k Z k 368 El  St  (206) 423 4537
368 Elm St. (206) 423‐4537
Albert Aikens 368 Elm St. (206) 423‐4538
Élément <xsl:sort>
• Permet de trier l'ensemble des nœuds
sélectionnés par les instructions avant de les
traîter
• Exemple
p : trier les cartes de visite ppar noms
<xsl:for-each
select="carnetDAdresse/carteDeVisite">
<xsl:sort select="nom"/>
...
</xsl:for-each>
Tri sur plusieurs critères
• Trier d’abord par noms puis par prénoms
<sxl:templates match="carnetDAdresse">
s :app y te p ates
<xsl:apply-templates
select="carteDeVisite">
<xsl:sort select=
select="nom"/>
nom />
<xsl:sort select="prénom"/>
</xsl:apply-templates>
</xsl:template>
Exemple
<?xml version=
version="1
1.0
0"?>
?>
<?xml‐stylesheet type="text/xsl" href="foreach.xsl" ?>
<customers>
<customer>
<name>John Smith</name>
<address>123 Oak St.</address>
<state>WA</state>
/
<phone>(206) 123‐4567</phone>
</customer>
<customer>
<name>Zack Zwyker</name>
<address>368 Elm St.</address>
<state>PA</state>
<phone>(206) 423‐4537</phone>
</customer>
<customer>
<name>Albert Aikens</name>
lb ik /
<address>369 Elm St.</address>
<state>PA</state>
< h
<phone>(206) 423‐4538</phone>
>(206) 423 4538</ h >
</customer>
</customers>
<?xml version="1.0"?> Feuille de style foreach.xsl
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
<HTML>
<BODY>
<TABLE>
<xsl:for‐each
<xsl:for each select=
select="customers/customer">
customers/customer >
<xsl:sort select="state" order="descending"/>
<xsl:sort select="name"/>
<TR>
<TD><xsl:value‐of select="name" /></TD>
<TD><xsl:value‐of select="address" /></TD>
<TD><xsl:value‐of
TD l l f select="phone" /></TD>
l t " h " / /TD
</TR>
</xsl:for‐each>
</TABLE>
</BODY>
</HTML> John Smith    123 Oak St  (206) 123‐4567
</xsl:template> Albert Aikens 368 Elm St. (206) 423‐4538
</xsl:stylesheet> Zack Zwyker 368 Elm St. (206) 423‐4537
Élément <xsl:if
xsl:if test
test="condition">
condition
• La condition est une expression
p logique
g q qqui
permet d'effectuer un filtrage.
<xsl:for-each select="carteDeVisite">
<xsl:value-of select="nom"/>
<xsl:if test="position()!=last()">,
</xsl:if>
</xsl:for-each>
/ l f h
• Génère une virgule
g après chaque nom sauf
pour le dernier
• En sortie
Ali, Salima, Mohamed
Élément <xsl:choose>
• Utilisé lors de choix parmi différentes conditions
possibles.
ibl
• Il contient un ou plusieurs éléments <xsl:when> suivi
de l'optionnel élément <xsl:otherwise>.
• Syntaxe
<xsl:choose>
<xsl:when test="Condition1">…</xsl:when>
<xsl:when test="Condition2">…</xsl:when>

< l th
<xsl:otherwise>
i >
<!-- autres cas -->
</xsl:otherwise>
</xsl:choose>
Élément <xsl:choose>
<xsl:choose>
<xsl:when test=
test="start-with(‘22'
start-with( 22 ,@codep)
@codep)">
>
<!-- cas 1 -->
</xsl:when>
<xsl:when test="start-with(‘16',@codep)">
<!-- cas 2 -->
</xsl:when>
/
<xsl:otherwise>
<!-- autres cas -->
</xsl:otherwise>
</xsl:choose>
<xsl:variable>
l i bl
• Les « variables » sont des constantes à la manière des
constantes #define de C
• Une variable ne ppeut être réaffectée
• La visibilité d’une variable est son élément père
• Déclaration de variable 1
<xsl:variable name="backcolor"
select="'#FFFFCC'"
select= #FFFFCC />
• Déclaration de variable 2
<xsl:variable
name="backcolor">#FFFFCC</xsl:variable>
• Référence à une variable
<BODY BGCOLOR='{$backcolor}'>
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>
/ l h
<xsl:otherwise>
<xsl:text>5</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
C l i
Conclusion
• Oui
O i
– XSLT est un vrai langage de programmation
– XSLT n’a pas son équivalent pour la
transformation
so o dd’arbre
be
• Mais
– La mise
i au point i ded programmes XSLT
S peut
s’avérer « délicate »
– La maintenabilité est discutable
Des références
• XSLT Programmer’s Reference
Micheal H.
H Kay,
Kay Wrox Press
http://www.wrox.com
• Saxon : Michael Kay
http://saxon.sourceforge.net/
très bonne documentation en ligne
saxon -o
o fichier.html fichier.xml fichier.xsl
Pour dire "utilise tel fichier ".xsl" pour tel fichier ".xml" pour
pproduire tel fichier ".html".

Vous aimerez peut-être aussi