P
'
t
i
t
e
C
h
a
t
t
e
 
spacer~ ALL YOUR BASE ARE BELONG TO US Articles | Connexion
 
~XSLT

 Présentation

L'Extensible Stylesheet Language, ou XSL, correspond à un langage de transformation spécifié par le World Wide Web Consortium. Ce langage se voit utilisé pour transformer des documents XML en d'autres sources. Notez que ce site a été réalisé entièrement avec XSLT.
 Sommaire


 Introduction

Les feuilles de style XSL représentent des documents XML particuliers s'appliquant sur d'autres documents XML. A l'instar d'une feuille CSS qui précise quels styles donner à quels éléments du document HTML, les feuilles XSL précisent les opérations nécessairement applicables sur les balises d'un document XML. Les transformations réalisées se voient décrites par des règles, ou modèles, appelés "templates". Chacun des modèles définis au sein d'une feuille XSL se voit appliqué dans un contexte particulier, dont le nom des balises XML incarne la dépendance minimale.

Concrètement, une feuille XSL permet d'effectuer la transformation d'une balise <logo /> en équivalent XHTML <img src="images/logo.png" alt="Logo" /><br />. L'ensemble des règles se voit appliqué au document XML par un processeur XSL. Citons par exemple, en Java, les processeurs Saxon et Xalan.


 Les tempes plates

Pour concrétiser nos dires, le listing numéro un représente une feuille de style XSL relativement simple. Comme vous pouvez le constater, un document XSL n'est autre qu'un document XML bien formé employant l'espace de nommage "xsl". Les balises xsl:template désignent les fameux modèles évoqués précédemment. Tout modèle se doit d'offrir un attribut "match" spécifiant ses conditions d'invocation.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <head><title>Gros boulets</title></head>
      <body>
      <xsl:apply-templates />
      </body>
    </html>
  </xsl:template>

  <xsl:template match="zdar">
    Gros boulet en chef : <b><xsl:value-of select="." /></b>
  </xsl:template>
</xsl:stylesheet>
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
La condition "zdar" signifie que la règle s'applique lorsque qu'une balise <zdar> se trouve dans le document XML source. La seconde condition énumérée dans le document étudié se veut la règle "/". Cette dernière désigne la racine du document, quelle que soit sa nature. Vous pourrez vous reporter à notre initiation à XPath pour de plus amples informations. En effet, les conditions d'application ne sont autres que des requêtes XPath. Nous rencontrerons encore ces requêtes plus loin.

Lors du parcours de l'arbre XML du document source, le processeur XSL tente pour chaque balise d'appliquer une règle. Si une règle correspondante existe, elle se voit alors évaluée. Tout le contenu de la règle, inclut au sein des balise <xsl:template>, se verra transmis en sortie du processeur XSL. Si une expression XSL se trouve au sein des données de la règle, elle est évaluée au préalable. De la sorte, notre expression <xsl:value-of> incluera le contenu de la balise <zdar> dans le document produit.



Le processus d'application des feuilles XSL

Dans le cas d'un document XML contenant la mention <zdar>Gfx</zdar>, nous obtiendrions en sortie le code HTML suivant : "Gros boulet en chef : <b>Gfx</b>". L'attribut "select" de l'instruction xsl:value-of joue un rôle important pour la détermination des données à produire.


 Les rats signent

Une lecture attentive de la règle désignant la racine du document XML vous permettra de découvrir l'instruction xsl:apply-templates. Cette instruction se voit employée pour invoquer l'application de modèles. En l'absence de toute autre précision, cette directive lance le processus d'application des règles sur tous les enfants de la balise correspondant à la règle courante. Cependant, l'attribut "select" offre la possibilité d'affiner le choix des éléments enfants à traiter.

Une nouvelle fois, une requête XPath se voit requise. Ainsi, l'instruction <xsl:apply-templates select="zdar" /> provoquerait l'application de la règle <xsl:template match="zdar"> uniquement.

Nous pourrions d'une autre manière écrire :

<xsl:apply-templates select="gras" />
<xsl:apply-templates select="italique" />
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Dans cette situation, toutes les balises <gras> seraient traitées, puis toutes les balises <italique>. L'ordre de leur apparition dans le document XML ne serait alors pas respecté. La feuille de style présente dans le listing numéro un pourrait se voir appliqué à un document XML tel que celui-ci :

<?xml version="1.0" encoding="ISO-8859-1"?>
<document>
  <zdar>Grégoire Delorme</zdar>
</document>
       
      
JextCopier dans Jext

 A tribord de balises

L'instruction <xsl:value-of select="." /> que nous avons déjà employé permet d'incorporer le contenu d'une balise dans le document de sortie. Cette même instruction peut aussi servir à récupérer les valeurs des attributs d'une balise.

Observons donc cet extrait de feuille XSL capable de générer une balise XHTML en copiant la valeur de l'attribut d'une balise XML :

<xsl:template match="separateur">
  <xsl:element name="hr">
    <xsl:attribute name="size">
      <xsl:value-of select="@hauteur" />
    </xsl:attribute>
  </xsl:element>
</xsl:template>
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
L'ensemble de ces directives XSL aura pour but la transformation d'un fragment XML de type <separateur hauteur="2" /> en code HTML de la forme <hr size="2" />. Pour créer une balise dont le contenu et les attributs ne sont pas fixés, le programmeur XSL se doit de faire appel à la balise <xsl:element>. Cette dernière peut recevoir des balises filles <xsl:attribute name="nom">valeur</xsl:attribute>, pour générer des attributs de balise, ou un simple contenu, pour générer le contenu interne de la balise.

La copie de la valeur de l'attribut XML "hauteur" se veut possible par l'office de la ligne <xsl:value-of select="@hauteur" />. La section de ce site sur XPath vous apprendra que la mention @nom sert à désigner un attribut de la balise courante. Enfin, sachez que vous pouvez tester la présence d'un élément ou d'un attribut d'élément.

<xsl:if test="@name">
  Le nom est <xsl:value-of select="@name" />
</xsl:if>
       
      
JextCopier dans Jext
Voici un exemple :

Placé dans un template, ce code attendra la présence d'un attribut name. Si cet attribut existe, la phrase "Le nom est [nom]" sera produite. Dans le cas contraire, rien ne serait effectué. Ici encore, toute requête XPath est valide en tant que condition de test.



par Romain Guy
romain.guy@jext.org
http://www.jext.org
Dernière mise à jour : 14/10/2006



 
#ProgX©2005 Mathieu GINOD - Romain GUY - Erik LOUISE