Vous
disposez maintenant des outils pour créer un document XML ainsi,
quíéventuellement, ceux pour créer la DTD associée.
Et alors, maintenant jíen fais quoi de tout cela, le XML
níétant pas directement utilisable par les navigateurs ?
Il est donc nécessaire de passer par une nouvelle phase qui
est la transformation des documents en un format utilisable, xhtml, texte, pdf
Ö
Il est donc nécessaire díutiliser ´ un
traducteur ª de XML vers autre chose. XSLT est un des langages qui le permettent.
a. Principe
A ce jour très peu díoutils permettent de lire du XML dans
´ le texte ª cíest le moins que líon puisse dire.
Il est donc obligatoire de transformer le document XML en un
document dans un format lisible et utilisable.
Les créateurs du langage XML y ont pensé et propose un
outils du nom de XSLT (eXtensible Stylesheet Langage for Transformation).
Ce langage permet de créer un filtre qui est alors utilisé
par un logiciel de transformation comme Saxon, Xalan pour ne citer que ces
logiciels libres. Ils permettent de ´ traduire ª le document XML en
un document dans un autre langage. Ce langage est définit par le concepteur du
filtre.
|
Le site
internet de référence est géré par le w3c. Son adresse est la suivante :
Le document
au format XSL est aussi un document XML. Il doit donc respecter les mêmes
règles de construction vues précédemment.
b. Construction díune feuille de style (stylesheet) au format XSL
La feuille de style (le ficher filtre) va proposer un
ensemble de règles qui vont permettre à partir díun élément source (document
XML) de créer un élément cible (document au format désiré).
Les éléments à prendre en compte dans un document XML sont
les éléments les plus bas dans líarbre représentant la structure du document
XML (élément, texte, attribut Ö).
Les règles (ou template) vont donc síappliquer à ces
éléments.
Ces règles et instructions commencent par le préfixe xsl
(<xsl: Ö).
ÿ
Instructions
dans le document XML
Pour que la transformation puisse se faire, il faut inclure
dans le document XML, après la déclaration habituelle, la ligne
suivante :
<?xml:stylesheet
type="text/xml" href="fichier.xsl" ?>
Vous devez donc avoir une
entête de document XML qui ressemble à ceci :
<?xml
version=".0" encoding="ISO-8859-1" ?> <?xml:stylesheet
type="text/xml" href="fichier.xsl" ?> |
ÿ
Instructions
dans le document XSL
Avant de définir les templates, vous devez insérer dans
votre fichier XSLT les deux premières lignes ainsi que la dernière
ligne suivante dans ce document :
<?xml
version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"> <xsl:output
method="html" indent="yes"/> Ö </xsl:stylesheet> |
La deuxième ligne correspond à ce qui a déjà été vu dans la
partie concernant les espaces de noms. Elle permet de définir líentête du
document xsl.
Entre ces lignes vont se trouver les règles de
transformation.
Dans votre document XSL vont être inclus deux types
díinformations :
ÿ
les
templates
ÿ
les
résultats de la transformation dans le ´ langage ª du document final
(html, texte, Ö)
Le mot clé transform peut remplacer dans líentête le terme stylesheet. Le résultat est identique.
Níoubliez pas de le modifier aussi à la fin du document </xsl:transform>
c. Construction des règles de transformation (template)
Il
existe plusieurs règles qui peuvent contenir des expressions qui permettent
díeffectuer des transformations selon certaines conditions. Ces expressions
seront étudiées dans le point 2 où il est question de la syntaxe Xpath. Cette
syntaxe permet la construction de ces expressions.
Rappel
Votre
document XML est organisé comme un arbre. Pour transformer ce document, le
langage XSLT et notamment líune de ses composantes le langage Xpath va
parcourir cet arbre selon vos indications pour récupérer les contenus. Il est
donc fortement conseiller avant de vous lancer dans la traduction, de réaliser
le schéma de cette arborescence, votre travail en sera plus facile.
Remarque
Lorsquíune
règle est rencontrée, tous les núuds de líarbre sont testés à partir de
líendroit définit.
ÿ
Règle
1 match
La syntaxe
de cette règle est la suivante :
<xsl:template
match="expression"> chaîne de remplacement ou autres
éléments XSLT </xsl:template> |
Cette règle permet de
rechercher un núud défini dans "expression" et de le remplacer par
des éléments résultats (html, texte Ö) ou à nouveau proposer un ensemble de
règles XSLT. Cette règle est líune des plus importantes.
Exemple
Le premier núud rencontré
dans un document xml est le noeud racine. Il est le plus souvent symboliser par
le signe / mais peut aussi líêtre par son nom. Reprenons líexemple simple
sncf.xml vu lors du chapitre précédent. La DTD est externe nous reverrons cet
exemple complet lors du chapitre VI.
sncf.xml |
<?xml
version="1.0" encoding="ISO-8859-1"
standalone="no"?> <!DOCTYPE
SNCF PUBLIC "sncf/DTD" "sncf.dtd"> <SNCF> </SNCF> |
Le fichier XSL qui permet
de le traduire en html peut être le suivant :
sncf.xslt |
<?xml
version="1.0" encoding :"ISO-8859-1" ?> <xsl:stylesheet
xmlns:xsl="http://www.w3.org/999/XSL/transform"
version="1.0"> <xsl:output
method="html" indent="yes"/> <xsl:template
match="/"> ou
<xsl:template match="SNCF"> <HTML><HEAD><TITLE> Les
trains </TITLE></HEAD> <BODY
BGCOLOR="#FFFFFF"> La
Société nationale des Chemins de Fer </BODY></HTML> </xsl:template> </xsl:stylesheet> |
Pour
effectuer la transformation vous pouvez utiliser Xalan et la syntaxe
suivante :
OU
Vous obtenez alors le code
html suivant :
<HTML><HEAD><TITLE> Les
trains </TITLE></HEAD> <BODY
BGCOLOR="#FFFFFF"> La Société
nationale des Chemins de Fer </BODY></HTML> |
La première
syntaxe vous envoie le résultat à líécran, la deuxième dans le fichier indiqué
après líoption ño à savoir sncf.html.
ÿ
Règle
2 apply-templates
Une fois le premier núud traité (racine), vous devez
indiquer au programme de transformation de continuer à appliquer les autres
règles pour effectuer la suite des transformation.
Les syntaxes les plus habituelles de cette règle sont :
<xsl:apply-templates/>
OU <xsl:apply-templates>
Ö </xsl:apply-templates> OU <xsl:apply-templates
select="expression"/> OU <xsl:apply-templates
select="expression"> Ö </xsl:apply-templates> |
La première syntaxe indique que toutes les règles suivantes
doivent être appliquées à tous les núuds.
La troisième et quatrième règle indiquent que toutes les
règles suivantes doivent être appliquées mais seulement aux núuds décrits par
líexpression Xpath "expression".
Remarque
Si vous oubliez cette
règle, la transformation síarrête au traitement du premier núud.
Si la règle ne possède pas
de contenu elle est directement fermée (/ à la fin).
Attention
Dès que cette règle est
trouvée, les règles qui suivent sont appliquées. Une fois toutes les règles
exécutées, le traitement recommence après la fermeture de la règle apply-templates
(là où le traitement síétait interrompu pour ´ dérouler ª les autres
règles).
ÿ
Règle
3 for-each
La syntaxe de cette règle
est :
<xsl:for-each
select="expression"> Ö </xsl:for-each> |
Cette règle permet de répéter une transformation díun ensemble
de núuds définit par "expression".
Lors des transformations html, elle permet notamment la
création simple de tableau.
Cette règle
ne peut être utilisée quíà líintérieur díune règle <xsl:template Ö si vous
ne respectez pas cela vous aurez une erreur.
ÿ
Règle
4 value-of select
La syntaxe
de cette règle est :
<xsl:value-of
select="expression"> Ö </xsl:value-of> |
Cette règle permet de récupérer le contenu du texte décrit
entre le début du núud (élément) et sa fin. Le núud est identifié par expression.
Attention
Síil existe des sous
éléments à cet élément, le texte qui leur est associé est aussi extrait et
écrit.
ÿ
Règle
5 if test
La syntaxe
de cette règle est :
<xsl:if
test="expression"> Ö </xsl:if> |
Cette règle permet de traiter un núud (ou un ensemble de
núuds) selon sa valeur et ceci de manière conditionnelle.
Il est ainsi possible díobtenir une transformation
différente en fonction des critères intégrés dans ce test.
ÿ
Règle
6 choose
La syntaxe
de cette règle est la suivante :
<xsl:choose> <xsl:when
test="expression 1"> Ö</xsl:when> <xsl:when
test="expression 2"> Ö</xsl:when> Ö <xsl:when
test="expression n"> Ö</xsl:when> <xsl:otherwise>
Ö</xsl:otherwise> </xsl:choose> |
Cette règle permet díeffectuer plusieurs tests. Les
développeurs utilisant des langages de programmation reconnaîtront une
structure proche du switch. Les parties case sont représentées par <xsl:when>.
ÿ
Règle
7 sort
La syntaxe
de cette règle est la suivante :
<xsl:sort
select="expr"
data-type="type" order="ordre"> Ö </xsl:sort> |
Cette règle ne peut síutiliser quíaprès une règle 2
(<xsl :apply-templates Ö>) ou une règle 3 (<xsl:for-each Ö>).
Elle permet díeffectuer un tri des éléments en cours de
traitements.
select="expr" |
Permet de
sélectionner la base du tri. |
data-type="type" |
Permet
díindiquer le type des éléments à trier. Deux valeurs sont possibles : ß
test
ß
number |
order="ordre" |
Permet de
définir líordre de tri croissant ou décroissant. Si vous
omettez order
le tri est croissant (ascending). En
remplaçant la valeur représentée par ordre par descending, líordre est décroissant. |
ÿ
Règle
8 number
La syntaxe de cette règle est la suivante :
<xsl:number
value="expr"
format="type"/> |
Cette règle permet díinsérer des numérotations dans un
format indiqué dans líoption format="type".
type peut prendre les valeurs suivantes :
Valeur de type |
Signification
|
1 |
Chiffre
arabe (1, 2, Ö) |
I
|
Chiffre
romain majuscule (I,
II, Ö) |
i |
Chiffre
romain minuscule (i, ii, Ö) |
A |
Alphabet
miajuscule (A, B, Ö) |
a |
Alphabet
minuscule (a, b, Ö) |
On retrouve le même système de numérotation dans líoption type de la balise OL en html. Cette balise permet de
créer des listes ordonnées (Ordre List).
Code html |
Résultat visuel |
<Ol
type=a> <LI>
Introduction <LI>Deuxième
Partie Ö </OL> |
a.
Introduction b.
Deuxième
Partie Ö |
Si vous définissez format="c", le format sera de
líalphabet minuscule et le début de la numérotation commencera par la lettre c.
Le système est le même pour les autres formats.
Si vous désirez effectuer
la numérotation i,j,k Ö vous devez utiliser líoption format="i".
Mais, le problème est que cette notation représente celle en chiffre romain
minuscule. Alors, comment faire la
distinction entre les deux ? Vous devez alors ajouter líoption
letter-value="alphabetique".
<xsl:number
value="expr"
format="i" letter-value="alphabetique"/> |
Il existe
díautres options :
ß
Grouping-separator="seprator"
associé à grouping-size="nb"
Ces deux options permettent de
définir un séparateur (caractère , . ..) qui à líaffichage sépare chaque paquet
de nb chiffres.
<xsl:number value="expr" format="1" grouping-size="." grouping-size="3"/> Cette ligne renvoie la
numérotation 1,2, Ö, 998,999,1.000, Ö |
ß
count="noeud"
Cela permet de réaliser une
numérotation, en fonction du nombre de núuds appelé núud rencontrés.
ÿ
Règle
9 <xsl:text>
Cette règle permet díinsérer du texte en conservant la
structure (espaces Ö).
Vous pouvez ajouter líoption
disable-output-escaping="yes" qui permet díinclure des caractères
réservés sans les interpréter (< Ö).
<xsl:text>trois
espaces :
</xsl:text> |
ÿ
Règle
10 <xsl:attribute>
Cette règle
permet díassocier à une balise un attribut.
Vous
voulez, lors de la transformation de votre document en html, inclure un lien
hypertexte dont la source est récupérée dans votre document xml au niveau de
líélément URL. La syntaxe html qui doit résulter de la transformation est
<A
href="lien">zone
cliquable</A>.
Comment
faire pour insérer les caractères < et > ? Les coder avec > et < mais dans ce cas
lors du chargement de votre document html vous obtiendrez à líécran
<A
href="lien">zone</A> et non líinsertion de la
zone cliquable.
Le plus
simple est alors díutiliser cette règle.
Ö <A> <xsl:attribute
name="href"> <xsl:value-of
select="URL"> </xsl:attribute> zone
cliquable </A> Ö |
Le résultat
de la transformation est alors :
<A
href="lien">zone
cliquable</A>
Ce qui est
bien interprété par un navigateur :
zone
cliquable
Les
expressions qui se trouvent dans les différentes règles vues précédemment sont
constituées en respectant elle même un syntaxe précise. Cette syntaxe est
définie dans un langage : Xpath.
a. Pourquoi faire ?
Nous avons vu comment, à partir du langage XSLT transformer,
par le biais de règles, les documents XML. Dans ces règles sont insérées des
expressions ou des mots-clés (pattern).
Les expressions prennent en compte la structure du document,
la position de tel núud dans líarborescence.
Le mot-clé, dés quíil est trouvé, quelque soit le contexte,
est traité.
Xpath est un langage à part entière. Il est très complet.
Níhésitez pas à consulter le site du w3c.
Xpath travaille essentiellement sur deux notions :
ß
les
núuds
ß
les
axes (chemin qui conduit au núud)
Xpath propose des éléments qui vont permettre de travailler
sur ces deux notions pour se déplacer dans le document et effectuer les
sélectionner.
Le terme ´ núud contextuel ª est souvent employé.
Ce terme désigne tout simplement le núud courant, cíest-à-dire le núud en cours
de traitement.
b. Les expressions Xpath de selection et de localisation
Il faut bien garder en tête que le traitement se fait núud
par núud. Le positionnement se fait donc relativement à la position du
núud courant ou de manière absolue par rapport à la racine de
líarborescence ou díun núud explicitement nommé. Souvent par rapport au núud
définit dans la règle 1 (<xsl:template match="expression"> Ö).
Les expressions sont constituées de différents éléments qui
permettent de se déplacer (axes) et de sélectionner (núud).
ÿ
Les symboles.
Symboles
|
Signification ñ Utilisation |
/ ./ ../ Ö |
/ représente le parent de líélément sélectionné. Vous
spécifiez un chemin de manière absolue en utilisant ce symbole. Par contre, ce symbole peut aussi représenter un chemin
relatif si vous tapez avant le caractère . ou .. . Ce système est identique au
déplacement dans une arborescence UNIX. Par exemple, le symbole ../TGV sélectionne le parent du núud
courant appelé train. |
// .// ..// Ö |
Permet de sélectionner tous les descendants. Ici aussi
vous pouvez spécifier cela de manière absolue // ou de manière relative .//,
..// Ö Par exemple, .//TGV sélectionne tous les descendants à partir du núud où nous
sommes (.//) mais ne prend en compte que le núud appelé TGV, tous les autres sont ignorés. |
* |
Sélectionne tous les enfants du núud courant (*) ou du núud indiqué (train/*). Ce symbole est aussi valide pour les attributs, axes Ö |
@ |
Sélectionne líattribut donc le nom suit ce caractère. Par exemples, TGV/@photo permet de sélectionner líattribut
photo de
líélément TGV. TGV/@* sélectionne tous les attributs de líélément TGV. |
[ ] |
Ces crochets permettent díinsérer une expression
(prédicat) pour préciser une sélection. Par exemple, TGV[@photo=ílocomotiveí] permet de ne sélectionner que les
attributs photo
de líélément TGV
qui ont pour valeur locomotive. |
ÿ
Définition
des axes
Terme |
Signification ñ Utilisation |
ancestor |
Représente tous les núuds ancêtres du núud courant ou du
núud indiqué (parent, parent du parent Ö). ancestor::wagon permet de se déplacer sur les
axes et de sélectionner tous les núuds appelés wagon qui sont les
´ ancêtres ª du núud courant. |
ancestor-or-self |
Représente tous les núuds ancêtres du núud courant ou du
núud indiqué ainsi que le núud lui-même. |
attribute |
Représente les attributs du núud courant ou du núud
sélectionné. attribute::* équivaut à @* |
child |
Représente les enfants du núud courant ou du núud indiqué.
child::train permet de sélectionner tous les núuds enfants appelés train à partir
du núud courant. |
child-or-self |
Représente les enfants du núud courant ou du núud indiqué
ainsi que le núud lui-même. |
following |
Représente tous les núuds suivants le núud courant ou le
núud indiqué, quelque soit leur position dans líarbre. |
following-sibling |
Représente tous les núuds suivants le núud courant ou le
núud indiqué, quelque soit leur position dans líarbre qui ont le même parent. |
parent |
Représente le parent direct du núud courant ou du núud
indiqué. |
preceding |
Représente tous les núuds précédents le núud courant ou le
núud indiqué, quelque soit leur position dans líarbre. |
preceding-sibling |
Représente tous les núuds précédents le núud courant ou le
núud indiqué, qui ont le même parent. |
self |
Représente le núud courant. |
La syntaxe pour líutilisation de ces termes qui spécifient
des axes doit être suivi des caractères :: comme dans les exemples présentés
ci-dessus.
Ö <xsl:value-of
select="child::famille[enfant="victor" |
@garcon="victor"]/> Ö A partir
du núud courant on recherche un núud fils du nom de famille qui possède
soit : ÿ
Un
núud fils enfant
qui possède pour valeur victor ÿ
Un
attribut garcon
ayant pour valeur victor |
c. Les tests sur les noeuds
Il est
souvent nécessaire díeffectuer des tests sur les núuds, leur contenu, pour
effectuer des sélections précises.
Pour cela
Xpath met à notre disposition un certain nombre de tests.
Ces tests
se retrouvent notamment dans les règles <xsl:if testÖ, <xsl:when test Ö,
<xsl:value-of Ö
ÿ
Les
opérateurs de comparaison
Opérateur |
Signification |
= |
Egalité
entre la partie droite et la partie gauche |
!= |
Différence
entre la partie droite et la partie gauche |
> |
La valeur
de gauche est plus grande que la valeur de droite |
< |
La valeur
de gauche est plus petite que la valeur de droite |
>= |
La valeur
de gauche est plus grande ou égale à la valeur de droite |
<= |
La valeur
de gauche est plus petite ou égale à la valeur de droite |
Il est
nécessaire de coder les signes > et < du fait quíils font parties du code
xml.
ÿ
Les
opérateurs booléens
Opérateur |
Signification |
and |
Et
logique |
or |
Ou
logique |
not(expr) |
Négation |
true() |
Vrai |
false() |
Faux |
Il ne faut
pas confondre líopérateur or et le signe | que líon retrouve dans les expressions. Le deuxième signe
permet de sélectionner plusieurs valeurs, éléments Ö Ce níest pas un opérateur
logique.
ÿ
Les
opérateurs arithmétiques
Opérateur |
Signification |
+ |
addition |
- |
soustraction |
* |
multiplication |
div |
division
(le signe / est utilisé dans le langage xml) |
mod |
modulo
(reste de la division) |
round(expr) |
arrondi à
líentier le plus proche |
floor(expr) |
arrondi à
líentier inférieur |
ceilling(expr) |
arrondi à
líentier supérieur |
sum(expr) |
somme
(total) des valeurs des núuds sélectionnés par líexpression expr |
ÿ
Quelques
fonctions de test importantes
Fonctions |
Signification |
text() |
Cíest un
núud qui ne contient que du texte |
comment() |
Cíest un
núud qui ne contient que des commentaires |
node() |
Cíest un
núud. Ce test ne tient compte que du núud (pas des attributs). Ce test ne
peut se faire sur le núud racine. |
Ö <xsl:template
match="text()"> <xsl:value-of
select=". "/> </xsl:template> Ö |
Ces trois
lignes permettent de sélectionner le noeud courant ne contenant que du texte
et de récupérer ce texte. Ils sont souvent utilisés pour traiter les contenus
textes des feuilles du document xml. Souvenez vous que cette règle traite
tous les núuds rencontrès à partir du núud courant de départ. Si 15 núuds de
la descendance ne possèdent que du texte, le texte de ces 15 núuds sera
affiché. |
Ö <xsl:template
match="comment()/"> Ö |
Cette
ligne permet de sélectionner le noeud courant qui contient des commentaires
mais de ne pas en tenir compte. |
ÿ
Autres
fonctions utiles
Fonctions |
Signification |
count(expr) |
Renvoie
le nombre de núuds qui satisfont à expr |
generate-id(expr) |
Crée un
identifiant unique pour le premier núud défini par líexpression expr. |
last() |
Renvoie
le numéro du dernier núud courant défini par une expression. |
position() |
Renvoie
la position (numéro) du núud courant dans líensemble de núuds courants. |
name() |
Renvoie
le nom du núud courant. |
1 2 3 4 5 6 |
Ö <xsl:template
match="train"> <xsl:for-each
select="destination"> <xsl:number
value="position()" format="A"/>. <xsl:value-of
select="depart"/> </xsl:for-each> </xsl:template> Ö Si vous
possédez un document xml décrivant une liste de train contenant la gare de
départ, vous pouvez transformer ce document en fichier texte sous forme
paragraphes numérotés en lettres alphabétiques majuscules. A.
Nantes B.
Paris C.
Ö Une fois
le núud possédant le nom train trouvé (Ligne 1), une boucle va parcourir tous les núuds
nommés destination (Ligne 2). A chaque núud destination trouvé, sa position est récupérée
(Ligne 3). Cette position est alors transformée en numérotation avec le
format alphabétique majuscule. Ensuite la valeur du núud nommé depart (Ligne 4) est récupérée et insérée
dans le document transformé. |
Tous les éléments sont maintenant connus pour pouvoir créer
une application complète comprenant
ÿ
un
document xml
ÿ
une
dtd
ÿ
un
fichier xsl pour la transformation
Les
chapitres suivants proposent des exemples.