Ce cours vous est offert par XMLFacile !
Merci de respecter le travail des auteurs en gardant cette mention.
D'autres cours de ce genre sont disponibles sur le site XMLFacile! (www.xmlfacile.com)
XSLT - XML Facile!
5.XSLT
5.1.Introduction à XSLT
Si vous avez été attentifs lors des chapitres précédents, vous avez maintenant un
document XML bien formé[C'est quoi?] et quelques notions de
XPath[C'est quoi?]. Il est donc temps de traiter ce document XML pour le restituer sous une autre forme (disons... plus lisible).
Nous allons, ici, faire appel à la transformation XSL (XSLT). Il s'agit d'écrire un document indiquant comment doivent être traités chaque noeud du document XML pour obtenir le document que l'on souhaite.
La lecture d'une feuille XSL n'est pas toujours très aisée mais ça reste un outil très puissant car cela ne nécessite (dans la plupart des cas) pas de programmation (à partir du moment où vous disposez d'un outil pour appliquer la feuille de style à votre document XML).
5.2.Objectif
Reprenons le fichier XML sur lequel nous avons travaillé.
Nous aimerions transformer ce fichier XML pour obtenir le résultat HTML suivant:
Nom |
Prenom |
sexe |
HAWKING |
Stephen |
H |
REEVES |
Hubert |
H |
EINSTEN |
Albert |
H |
CURIE |
Marie |
F |
Autrement dit nous allons transformer le document XML précédent en code HTML:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Encyclopedie</title>
</head>
<body><table border="1">
<tr>
<th>Nom</th>
<th>Prenom</th>
<th>sexe</th>
</tr>
<tr>
<td>HAWKING</td>
<td>Stephen</td>
<td>H</td>
</tr>
<tr>
<td>REEVES</td>
<td>Hubert</td>
<td>H</td>
</tr>
<tr>
<td>EINSTEN</td>
<td>Albert</td>
<td>H</td>
</tr>
<tr>
<td>CURIE</td>
<td>Marie</td>
<td>F</td>
</tr>
</table></body>
</html>
Cela ne devrait pas être bien compliqué.
5.3.La feuille XSL
Une feuille XSL est un document XML avec des balises et attributs qui lui sont propres.
Voici un squelette de feuille XSL
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<!-- ici nous pourrons indiquer ce qu'il faut faire lorsque
l'on va rencontrer la racine du document
(en fait avant même de rencontrer la balise racine) -->
</xsl:template>
</xsl:stylesheet>
La balise racine d'une feuille XSL est nécessairement
stylesheet (ou son alias
<xsl:transform>). Afin qu'il n'y ait pas de confusion possible avec d'autres balises (balises qui, elles, ne font pas partie du traitement XSL mais que l'on souhaiterait voir dans le document résultat) nous précisons l'
espace de nom[C'est quoi?]. L'espace de nom pour XSL étant defini à l'URL suivante "http://www.w3.org/1999/XSL/Transform". Généralement le préfixe choisi est "xsl:" (mais comme vous le savez vous pouvez choisir ce que bon vous semble). Et, enfin, dans un premier temps, nous ne nous intéresserons qu'à la première version "1.0" de XSL. Vous savez donc tout sur la balise racine de la feuille XSL qui vous est proposée ici.
Il convient ensuite d'indiquer quel type de document vous souhaitez générer. Ceci se fait par l'intermédiaire de la balise output et notamment son attribut method.
L'attribut
method peut prendre les valeurs suivantes:
-
xml pour générer un autre document XML
-
html pour générer un document HTML
-
text pour générer un simple document texte
- voire encore une valeur librement choisie mais pour laquelle il n'y a pas de norme (dépendant donc de votre outil de transformation XSL)
Le résultat attendu pour la transformation peut être précisé par l'attribut version. Tout particulièrement utile lors de la génération de document HTML.
De même, le choix de l'
encodage[C'est quoi?] du document résultat est important et peut être précisé par l'attribut
encoding.
Plus anecdotique mais pas inintéressant il est possible de demander la génération d'un document indenté via l'attribut indent que l'on positionnera à "yes" si l'on veut que l'outil s'occupe de l'indentation du document (XML ou HTML).
La balise output dispose de nombreux autres attributs que (souhaitons le) nous verrons par la suite.
En enfin! Le coeur du sujet. Il y a bien des manières différentes de construire une feuille XSL mais votre document contiendra au moins une balise
template (et plus probablement un ensemble de balises de ce type). Cette balise contient un attribut
match qui contient un chemin
XPath[C'est quoi?]. Le contenu de la balise servira a décrire quelle opération doit être réalisée lorsque le parcours du document XML conduira à rencontrer un noeud correspondant au chemin XPath précisé.
5.4.La transformation XSL
Afin de prendre contact avec ce qu'est véritablement la transformation XSL, nous commencerons par un exemple très basique. Nous allons simplement construire la structure du document HTML.
Pour cela, nous utiliserons la feuille XSL suivante:
Qui retournera le document HTML suivant
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>XML Facile!</title>
</head>
<body>
Ma transformation XSL
</body>
</html>
autrement dit, une page avec un titre et un simple texte "Ma transformation XSL" (bon... pour l'indentation... on repassera).
Ici, le traitement est simple. Nous nous contentons d'écrire du code HTML (là aussi des balises... mais que l'on distingue aisément des balises de traitement XSL grâce à l'emploi des espaces de nom) dès le début de la transformation (et finalement sans tenir compte du contenu du document XML).
Mais je sens que vous ne me croyez pas trop... Vous voulez tester par vous même? Vous avez bien raison. Pour cela différentes options s'offrent à vous:
- Ecrire un petit bout de code dans votre langage préféré pour faire votre transformation XSL. Peut-être la solution la plus pertinente à moyen terme (celle pour laquelle vous opterez finalement mais ce n'est pas la plus facile donc pas la plus rapide)
- Utiliser un petit programme en ligne de commande (on optera pour un programme facile à installer)
- Utiliser votre navigateur préféré (sauf... si ce dernier ne le permet pas) à condition de ne pas oublier d'ajouter la ligne qui va bien à votre document XML. Avant la balise racine du document XML ajoutez l'instruction <?xml-stylesheet type="text/xsl" href="xslt_01.xsl"?>, assurez vous d'avoir le fichier xsl au même endroit que le fichier XML et ouvrez votre document XML avec Firefox ou Internet explorer (Chrome semble plus réfractaire pour d'apparentes sombres raisons de sécurité). Pensez à modifier, dans le document XML, le nom du fichier xsl si vous souhaitez faire différents tests.
5.5.Tranformation XSL (apply-templates)
Nous avons vu comment amorcer la transformation XSL. Maintenant il s'agit de prendre en compte l'ensemble des noeuds XML. Pour cela, au coeur du traitement initial (défini par <xsl:template match="/">) nous allons demander à prendre en compte les noeuds fils (en partant de / le noeud fils est simplement le noeud racine du document XML) et rechercher pour chacun le "template" XSL (que nous n'allons pas tarder à créer) qui correspond (d'après le chemin XPath). Ce même template pourra demander à ce que les noeuds fils soient traités et ainsi de suite. Ceci se fait avec l'instruction <xsl:apply-templates>.
Comme dans l'exemple suivant
qui donne
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Annuaire</title>
</head>
<body><table border="1">
<tr>
<th>Nom</th>
<th>Prenom</th>
</tr>
<tr>
<td>HAWKING</td>
<td>Stephen</td>
Une brève histoire du temps
</tr>
<tr>
<td>REEVES</td>
<td>Hubert</td>
L'Univers expliqué à mes petits-enfants
Patience dans l'azur, L'évolution cosmique
Poussières d'étoiles
</tr>
<tr>
<td>EINSTEN</td>
<td>Albert</td>
Des ondes gravitationnelles
Sur la théorie quantique du rayonnement
</tr>
<tr>
<td>CURIE</td>
<td>Marie</td>
traité de radioactivité
</tr>
</table></body>
</html>
Voici ce que nous avons fait
- Au sein des balises HTML <body>, nous avons rajouté la balise <xsl:apply-templates> pour indiquer au parseur qu'à cet endroit on souhaite appliquer les transformations des noeuds fils (du chemin /) du document XML (en l'occurrence ici, la balise racine "encyclopedie").
- Nous avons créé un second bloc <xsl:template> avec un attribut match indiquant le noeud "encyclopedie" afin de réaliser les opérations nécessaires lorsque ce noeud sera rencontré. Ici, nous amorçons la construction d'un tableau HTML, son entête mais pas directement son contenu
- Pour le contenu du tableau HTML, là aussi, nous déléguons le traitement des noeuds fils (i.e. "personne") à un autre "template" (toujours via <xsl:apply-templates>). De même "personne" délègue le traitement des noeuds fils à d'autres "templates"...
- Pour l'affichage du contenu texte des balises (i.e. les noeuds "nom" et "prenom") nous appuyons sur le comportement par défaut du parseur XSL.
Pas de chance! Si le "template" par défaut est pratique pour afficher les noms et prénoms, celui-ci conduit aussi a afficher le contenu d'autres noeuds que nous avions choisi d'ignorer pour l'instant (comme "publications").
Lorsque le parseur XSL ne trouve pas de "template" adapté au traitement d'un noeud alors par défaut il affiche le contenu textuel.
La balise <xsl:apply-templates> possède un attribut select qui permet de restreindre la liste des noeuds fils sur lesquels la transformation doit s'appliquer.
Nous allons nous en servir pour restreindre la liste des noeuds traités aux seuls "nom" et "prenom" afin d'ignorer (pour le moment) les autres (comme "publications").
Si nous appliquons la feuille de style suivante
nous avons pour nouveau résultat:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Encyclopedie</title>
</head>
<body><table border="1">
<tr>
<th>Nom</th>
<th>Prenom</th>
</tr>
<tr>
<td>HAWKING</td>
<td>Stephen</td>
</tr>
<tr>
<td>REEVES</td>
<td>Hubert</td>
</tr>
<tr>
<td>EINSTEN</td>
<td>Albert</td>
</tr>
<tr>
<td>CURIE</td>
<td>Marie</td>
</tr>
</table></body>
</html>
C'est mieux non? Une autre façon de faire était possible, faisant intervenir une autre instruction que nous allons voir de suite.
5.6.Transformation XSL (value-of)
Pour afficher le contenu textuel d'un noeud XML vous pouvez faire appel à la balise XSL
<xsl:value-of> avec l'attribut
select précisant le
chemin XPath[C'est quoi?] de l'information à retourner.
Ainsi la transformation précédente aurait pu être écrite
avec le même résultat
Nom |
Prenom |
HAWKING |
Stephen |
REEVES |
Hubert |
EINSTEN |
Albert |
CURIE |
Marie |
Ou encore
Qui est une autre philosophie d'écriture d'un fichier XSL. Qui par certains aspects peut-être jugé plus lisible.
Comme nous l'avons dit l'attribut select accepte pour valeur un chemin XPath, il est donc possible de la même manière d'afficher la valeur d'un attribut.
Nous allons donc modifier notre feuille XSL pour afficher l'attribut "date de naissance".
et hop...
Nom |
Prenom |
Date Naissance |
HAWKING |
Stephen |
1942-01-08 |
REEVES |
Hubert |
1932-07-13 |
EINSTEN |
Albert |
1879-03-14 |
CURIE |
Marie |
1867-11-07 |
5.7.Conclusion
Ce n'est qu'un aperçu de ce que l'on peut faire avec XSLT mais rien qu'avec ceci vous pouvez déjà vous amuser. J'espère que cela vous suffit pour mesurer l'intérêt qu'apportent de telles feuilles de style.
Ce cours vous est offert par XMLFacile !
Merci de respecter le travail des auteurs en gardant cette mention.
D'autres cours de ce genre sont disponibles sur le site XMLFacile! (www.xmlfacile.com)