Technologies internet


XSLT - divers


Voir :


Définition des variables

Trois façons :

  1. Le contenu <xsl:variable> spécifie la valeur de la variable :
    <xsl:variable name="homePage">index.html</xsl:variable>
    
  2. L'attribut select est utilisé pour définir la valeur :
    <xsl:variable name="lastPresident" select="president[position() = last()]/name"/>
    
  3. Une variable sans attribut select ni contenu est associée à une chaine de caractères vide :
    <xsl:variable name="empty"/>
    

Utilisation des variables

Le nom de la variable est précédé du caractère $.
Exemple :

<xsl:variable name="lastPresident" select="president[position() = last()]/name"
...
<xsl:value-of select="$lastPresident"/>

Pour utiliser une variable dans la valeur d'un attribut HTML, il faut mettre des accolades autour de la référence à la variable :

<a href="{$homePage}">Clicquez ici pour retourner à la page d'accueil...</a>

Exemples :

Modèles nommés (<xsl:call-template>, <xsl:param>, <xsl:with-param>)

Considérons le fichier suivant :

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="modeleNomme.xsl"?>
<team>
  <manager ssn="230568737">
    <name>Aidan Burke</name>
  </manager>
  <programmer ssn="993776766">
    <name>Jennifer Burke</name>
  </programmer>
  <programmer ssn="993885777">
    <name>Bill Tellam</name>
  </programmer>
</team>

Un modèle nommé peut être utilisé pour afficher la valeur d'attribut ssn pour les deux types de la même façon.

Exemple (fichier) :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns="http://www.w3.org/1999/xhtml">
  <xsl:output method="xml" encoding="ISO-8859-1" omit-xml-declaration="yes" indent="yes"/>
  <xsl:template match="/">
    <html>
      <head>
        <title>XSLT : exemple de modèle nommé</title>
      </head>
      <body>
        <h3>Membres de l'équipe</h3>
        <ul>
          <xsl:for-each select="team/manager|team/programmer">
            <xsl:sort select="name"/>
            <li>
              <xsl:value-of select="name"/>
              <xsl:text>, ssn = </xsl:text>
              <xsl:call-template name="formatSSN">
                <xsl:with-param name="ssn" select="@ssn"/>
              </xsl:call-template>
            </li>
          </xsl:for-each>
        </ul>
      </body>
    </html>
  </xsl:template>
  <!-- un modèle nommé qui formate les 9 chiffres du SSN en insérant
       des caractères '-' -->
  <xsl:template name="formatSSN">
    <xsl:param name="ssn" select="'000000000'"/>
    <xsl:value-of select="substring($ssn, 1, 3)"/>
    <xsl:text>-</xsl:text>
    <xsl:value-of select="substring($ssn, 4, 2)"/>
    <xsl:text>-</xsl:text>
    <xsl:value-of select="substring($ssn, 6)"/>
  </xsl:template>
</xsl:stylesheet>

Résultats :

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>XSLT : exemple de modèle nommé</title>
  </head>
  <body>
    <h3>Membres de l'équipe</h3>
    <ul>
      <li>Aidan Burke, ssn = 230-56-8737</li>
      <li>Bill Tellam, ssn = 993-88-5777</li>
      <li>Jennifer Burke, ssn = 993-77-6766</li>
    </ul>
  </body>
</html>

Incrémentation des variables

Une structure XML est souvent récursive (fichier):

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="familyTree.xslt"?>
<person name="Otto">
  <person name="Sandra">
    <person name="Jeremy">
      <person name="Eliana"/>
    </person>
    <person name="Eric">
      <person name="Aidan"/>
    </person>
    <person name="Philip">
      <person name="Alex"/>
      <person name="Andy"/>
    </person>
  </person>
</person>

Pour afficher cet arbre généalogique simplifié de la manière suivante :

Otto
Sandra
Jeremy
Eliana
Eric
Aidan
Philip
Alex
Andy

nous pouvons utiliser la feuille de style suivante :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
  <xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>

  <xsl:template match="/">
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
        <title>Exemple de tri : présidents des États-Unis</title>
      </head>
      <body>
        <!-- sélectionne la personne de plus haut niveau -->
        <xsl:apply-templates select="person">
          <xsl:with-param name="level" select="'0'"/>
        </xsl:apply-templates>
      </body>
    </html>
  </xsl:template>

  <!-- Produit les informations pour une personne et sélectionne
       récursivement tous les fils. -->
  <xsl:template match="person">
    <xsl:param name="level"/>

    <!-- indente selon le niveau -->
    <div style="text-indent:{$level}em">
      <xsl:value-of select="@name"/>
    </div>

    <!-- sélectionne récursivement les fils, incrémente le niveau -->
    <xsl:apply-templates select="person">
      <xsl:with-param name="level" select="$level + 1"/>
    </xsl:apply-templates>
  </xsl:template>
</xsl:stylesheet>

Comment contrôler l'écriture des "caractères spéciaux" après traitement ?

Une transformation XSLT met en jeu un minimum de trois documents :

Le processeur XSLT est une application XML qui accède à ces documents sources en utilisant un parseur SAX ou DOM classique et il ne voit qu'une représentation de ces documents, codée en Unicode, de laquelle il ne peut tirer aucune information sur la manière dont les caractères ont été codés dans les documents source.
Cela signifie que les seules informations dont un processeur XSLT dispose pour contrôler la syntaxe des documents résultats sont celles qui sont contenues dans l'instruction xsl:output :

<!-- Catégorie: élément de haut niveau -->
   <xsl:output
         method = "xml" | "html" | "text" | qname-but-not-ncname
         version = nmtoken
         encoding = string
         omit-xml-declaration = "yes" | "no"
         standalone = "yes" | "no"
         doctype-public = string
         doctype-system = string
         cdata-section-elements = qnames
         indent = "yes" | "no"
         media-type = string
    />

C'est dans cette instruction que vous pourrez spécifier le type de document généré (XML, HTML ou texte) et l'encodage à utiliser.

Les données XML en entrée, la feuille de style XSLT et l'arbre résultat n'utilisent pas obligatoirement les mêmes codages de caractères ou la même langue.

Exemple: une feuille de style XSLT peut être codée en UTF-16 tout en spécifiant UTF-8 comme méthode de sortie :

<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http//www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="UTF-8"/>

Exemples :

Désactivation de la production littérale des caractères en sortie

Normalement, la méthode de sortie xml conserve les caractères & et < (et potentiellement d'autres caractères) au moment de la sortie des noeuds textuels de manière à garantir que la sortie soit bien formée au sens XML.

Toutefois, il est parfois utile de pouvoir produire une forme contenant des sections qui deviendront bien formées par un traitement ultérieur.

Pour cette raison, XSLT produit un moyen pour changer ce comportement. Les éléments xsl:value-of et xsl:text peuvent recevoir l'attribut disable-output-escaping dont les valeurs autorisées sont yes ou no; La valeur par défaut est no; si la valeur est mise à yes, alors les caractères & et < des noeuds textuels générés par instanciation de l'élément xsl:value-of ou xsl:text seront interprétés. Par exemple :

<xsl:text disable-output-escaping="yes">&lt;</xsl:text>

est une instruction qui signifie à la méthode de sortie de produire le caractère <.

Exemple :

Nous voulons générer "&nbsp;" dans un fichier html.

Accès à un autre fichier xml

On ne peut chercher le contenu d'un autre fichier xml en utilisant la fonction document:

Exemple :

  <xsl:variable name="temp">
      <xsl:copy-of select="document('nom_de_fichier_xml'[condition]"/>
    </xsl:variable>

L'adresse du fichier xml (nom_de_fichier_xml) peut être relative, par exemple: ../../abc.xml
La condition est définie par XPath.