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:
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:

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
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.