Menu
Index
XCRFs
Corpus Question/Réponse
Stage de DEA
Mémoire de DEA
Enseignement
Exercices DTD
Cours Relax NG
Interro Modélisation
Exercices XPath
Cours XSLT
Exercices XSLT
Cours SAX
Quelques liens
English Version

Rappels XSLT

Les bases

Objectif : transformer un document XML en un autre document XML (souvent un document HTML).

Commandes

Il y a deux façons d'effectuer une transformation XSLT. On peut utiliser xsltproc :
xsltproc stylesheet.xsl fichier.xml > output.xml
On peut aussi effectuer la transformation avec un navigateur compatible (mozilla, Safari, etc.). Il suffit pour cela d'ajouter en en-tête du document XML un lien vers la feuille XSLT utilisée :
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl" ?>
De plus, si le fichier XML contient cet en-tête, il n'est pas nécessaire de préciser le nom de la feuille XSLT dans la ligne de commande xsltproc :
xsltproc fichier.xml > outpout.xml

Forme d'une feuille XSLT

La racine d'une feuille de transformations XSLT est xsl:stylesheet ou xsl:transform.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
...
</xsl:stylesheet>
	

Modèles Simples

Création d'un modèle

Un modèle (template) de transformation est défini dans un élément xsl:template. Il est possible de nommer ce modèle avec l'attribut name. L'attribut match contient une expression XPath indiquant les éléments sur lesquels ce modèle s'applique.
<xsl:template name="modele-personne" match="personne">
une personne
</xsl:template>
      
Il est possible, dans ces modèles, de calculer la valeur d'une expression XPath avec l'élément xsl:value-of. Cet élément possède un attribut select qui contient l'expression XPath évaluée, dont le contexte est l'élément sur lequel le modèle est appliqué.
<xsl:template name="modele-personne" match="personne">
  Nom : <xsl:value-of select="nom">.
</xsl:template>
L'exemple précédent empêche le traitement des éventuels sous-éléments de personne. Pour indiquer que l'on veut appliquer nos modèles aux sous-éléments, on utilise xsl:apply-templates. L'attribut select contient une expression XPath indiquant les éléments sur lesquels on veut appliquer nos règles. Si aucun attribut select n'est fournie, les règles sont appliquées sur tous les sous-éléments de l'élément courant.
<xsl:template match="personne">
  <p>
    Nom : <xsl:value-of select="nom"/>
    <br/>
    <xsl:apply-templates select="adresse"/>
  </p>
</xsl:template>

<xsl:template match="adresse">
  <xsl:value-of select="num" />, rue <xsl:value-of select="rue"/>
  <br/>
  <xsl:value-of select="CP" /> <xsl:value-of select="ville"/>
</xsl:template>
      

Modèles implicites

Il existe trois modèles implicites dans le processeur XSLT. Ces règles sont appliquées automatiquement, sauf indication contraire dans la feuille de transformations XSLT. Le premier modèle consiste à recopier la valeur des noeuds texte et attribut dans le document de sortie :
<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>
L'autre règle par défaut est celle garantissant que tous les sous-éléments seront traités.
<xsl:template match="*|/">
  <xsl:apply-templates/>
</xsl:template>
       
Enfin, la dernière règle que les commentaires et instructions de traitement ne produisent aucun résultat dans le document sortie.
<xsl:template match="processing-instruction()|comment()"/>
       

Principales Commandes XSLT

xsl:variable

<xsl:variable name="nom">
   Valeur...
</xsl:variable>
      
ou
<xsl:variable name="nom" select="expression" />
      

xsl:if

<xsl:if test="condition">
   Instructions...
</xsl:if>
      

xsl:choose

<xsl:choose>
   <xsl:when test="condition">
      instructions...
   </xsl:when>
   ...
   <xsl:otherwise>
      instructions...
   </xsl:otherwise>
</xsl:choose>
      

xsl:for-each

<xsl:for-each select="pattern">
   instructions...
</xsl:for-each>
      

xsl:call-template

<xsl:call-template name="nom_template">
  <xsl:with-param name="nom_param" select="expression" />
</xsl:call-template>
      

Notion de Modes

Il est possible de vouloir traiter un même élément du document XML source plusieurs fois de plusieurs façons différentes dans une même transformation (ex. Table des Matières). Pour cela, on utilise la notion de mode.
<xsl:template match="/">
  <h2>Table des Matières</h2>
  <xsl:apply-templates select="titre" mode="tdm"/>

  <h2>Contenu</h2>
  <xsl:apply-templates select="titre" mode="contenu"/>
</xsl:template>

<xsl:template match="titre" mode="tdm">
...
</xsl:template>

<xsl:template match="titre" mode="contenu">
...
</xsl:template>
      
Last update 02/21/06