Voir :
Trois façons :
<xsl:variable name="homePage">index.html</xsl:variable>
<xsl:variable name="lastPresident" select="president[position() = last()]/name"/>
<xsl:variable name="empty"/>
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 :
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>
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 :
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>
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 :
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"><</xsl:text>
est une instruction qui signifie à la méthode de sortie de produire le caractère <.
Exemple :
Nous voulons générer " " dans un fichier html.
<xsl:template match="x"> <p> </p> </xsl:template>mauvais (le fichier xslt n'est pas bien formé)
<xsl:template match="x"> <p>&nbsp;</p> </xsl:template>mauvais (<p>&nbsp;</p> envoyé à la sortie)
<xsl:template match="x"> <p><xsl:text disable-output-escaping="yes">&nbsp;</xsl:text></p> </xsl:template>bon ! (<p> </p> envoyé à la sortie)
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.