lundi 22 octobre 2012

XSLT


1.Introduction à XSLT

Maintenant que l'on a un fichier XML et qu'il est valide, on va en faire quelque chose. Dans les pages qui vont suivre, nous allons tenter de voir ce que l'on peut faire simplement avec XSLT. XSLT est relativement complexe mais il est aussi très puissant. Avec XSLT on peut faire beaucoup de choses a condition de savoir l'utiliser.
Dans ces pages nous n'allons pas entrer dans les détails simplement parce que nous ne parlerons que de ce que nous connaissons et avons testé.
Ceci dit il est très simple d'assimiler les bases qui permettent déjà de faire des choses intéressantes. Par exemple, sur ce site, les cours sont écrit une seule fois en XML. Deux feuilles de styles différentes permettent de formater les cours page par page ou bien en version imprimable sur une seule page HTML.
Dans les pages suivantes nous allons formater l'annuaire en XML que nous avions dans les chapitres précédents.

2.Objectif

Reprenons le fichier XML sur lequel nous avons travaillé.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE annuaire SYSTEM "annuaire.dtd">
<annuaire>
    <personne type="étudiant">
        <nom>HEUTE</nom>
        <prenom>Thomas</prenom>
        <email>webmaster@xmlfacile.com</email>
    </personne>
    <personne type="chanteur">
        <nom>SOUCHON</nom>
        <prenom>Alain</prenom>
        <email>alain@souchon.name</email>
    </personne>
</annuaire>


Nous aimerions transformer ce fichier XML en fichier HTML suivant:
Qui a le code source suivant:

<html>
  <head>
    <title>Annuaire</title>
  </head>
  <body>
    <table border="1">
      <tr><th>Nom</th><th>Prenom</th><th>email</th></tr>
      <tr><td>HEUTE</td><td>Thomas</td><td>webmaster@xmlfacile.com</td></tr>
      <tr><td>SOUCHON</td><td>Alain</td><td>alain@souchon.name</td></tr>
    </table>
  </body>
</html>


Je vous assure que cela va être facile.

3.La transformation XSL

Voici la première étape.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="1.0" encoding="ISO-8859-1" indent="yes"/>
    <xsl:template match="/">
        <html>
            <head><title>Annuaire</title></head>
            <body>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>


En appliquant cette feuille de style(Cf. section "installation") sur n'importe quel fichier XML on aura:
<html>
    <head><title>Annuaire</title></head>
    <body>
    </body>
</html>
  • A la première ligne, on précise la version d'XML que l'on utilise, (n'oublions pas qu'un fichier XSL est un fichier XML [c'est quoi?) ainsi que l'encodage [c'est quoi?(ici l'encodage europe de l'ouest)
  • Ensuite on trouve ce qui différencie un fichier XSL d'un fichier XML. La racine du fichier est imposée, elle doit être <xsl:stylesheet> (ou son alias <xsl:transform>) et doit préciser la version d'XSLT utilisée.
  • On définit le type de fichier de sortie dont 3 sont reconnus: text, xml ou html. Ici on a bien entendu choisit HTML. On a également défini l'encodage.
  • <xsl:template match="/"> est évoqué dès que la racine du fichier XML à transformer est rencontrée. Dans le cas présent dès que la racine est affichée le parseur écrit le contenu de la balise <xsl:template/>
Sur cet exemple, on ne le voit pas très bien mais un fichier XSL n'est pas comme un programme ordinaire, il ne se lit pas nécessairement de haut en bas. Tout dépend du contenu de votre fichier XML.

4.Tranformation XSL (apply-templates)

Après la première, la deuxième étape.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="ISO-8859-1"/>
    <xsl:template match="/">
        <html>
            <head><title>Annuaire</title></head>
            <body>
                <xsl:apply-templates select="annuaire"/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="annuaire">
        <table border="1">
            <tr><th>Nom</th><th>Prenom</th><th>email</th></tr>
            <xsl:apply-templates select="personne"/>
        </table>
    </xsl:template>

    <xsl:template match="personne">
    </xsl:template>
</xsl:stylesheet>
  • On a rajouté la balise <xsl:apply-templates> au milieu des balises body pour indiquer au parser qu'à cet endroit on souhaite appliquer les transformations de la balise annuaire.
  • La balise annuaire est très similaire à la précédente, on décrit le début du tableau, on demande la transformation des balises personne puis on décrit la fin du tableau.
  • La balise personne est très simple pour le moment.
Il est temps maintenant de passer à l'ultime étape.

5.Transformation XSL (value-of)

On se rapproche de la fin, maintenant il va falloir afficher le contenu d'une balise XML.



  • Pour chacune des personnes on veut une nouvelle ligne c'est pourquoi la balise <xsl:apply-templates> est entre les balises <tr>
  • Il n'y a pas d'attribut select car on veut appliquer toutes les transformations. En fait on pouvait déjà le faire pour les autres balises.
  • Pour chacune des balises nom, prenom et email on veut que le contenu soit entre les balises HTML <td>. On utilise la balise XSL <xsl:value-of>pour afficher la valeur de nom, prenom ou email
Maintenant nous allons voir un fichier différent qui arrive à un résultat identique.

6.Autre manière de faire

Cette version plus courte fonctionne également.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="ISO-8859-1"/>
    <xsl:template match="/">
        <html>
            <head><title>Annuaire</title></head>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="annuaire">
        <table border="1">
            <tr><th>Nom</th><th>Prenom</th><th>email</th></tr>
            <xsl:apply-templates/>
        </table>
    </xsl:template>

    <xsl:template match="personne">
        <tr>
            <td><xsl:value-of select="nom"/></td>
            <td><xsl:value-of select="prenom"/></td>
            <td><xsl:value-of select="email"/></td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

  • Ici on a supprimé les attributs 'select' des balises xsl:apply-templates
  • On a aussi supprimé les balises <xsl:template match="prenom">,<xsl:template match="nom"> et <xsl:template match="email">
On peut aussi remarquer que dans ce cas on est libre de les mettre dans l'ordre que l'on veut. L'attribut 'select' fonctionne un peu comme les arborescences des répertoires. On peut aussi récupérer une balise en remontant dans l'arborescence.
Juste une petite modification dans la balise personne pour montrer comment on récupère un attribut.


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="ISO-8859-1"/>
    <xsl:template match="/">
        <html>
            <head><title>Annuaire</title></head>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="annuaire">
        <table border="1">
            <tr><th>Nom</th><th>Prenom</th><th>email</th></tr>
            <xsl:apply-templates/>
        </table>
    </xsl:template>

    <xsl:template match="personne">
        <tr><td><xsl:value-of select="@type"/>: <xsl:value-of select="nom"/></td>
            <td><xsl:value-of select="prenom"/></td>
            <td><xsl:value-of select="email"/></td></tr>
    </xsl:template>
</xsl:stylesheet>
  • On met un @ devant les attributs pour les récupérer.
Et si on avait voulu récupérer l'attribut toto de la balise annuaire dans la balise personne, on aurait mis './../@toto' dans l'attribut select. C'est en fait le langage XPath qui est utilisé.

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.

Aucun commentaire:

Enregistrer un commentaire