5.XSLT

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.