Ce document est une traduction de la recommandation XSL Transformations (XSLT) 1.0 du W3C, datée du 16 novembre 1999. Cette version traduite peut contenir des erreurs absentes de l'original, dues à la traduction elle-même. La version originale en anglais, seule normative, se trouve à l'adresse http://www.w3.org/TR/1999/REC-xslt-19991116. Traduction : Ramzi Guetari Traduction hébergée par XMLfr. Copyright © 1998 W3C (MIT, INRIA, Keio), tous droits réservés. Les règles du W3C sur la responsabilité, les marques de commerce, les droits d'auteur et les licences de logiciels sont applicables. Note de traduction: L'entité ISO LATIN I de "oe" ligaturé n'étant pas supportée par certains navigateurs, il sera écrit oe. |
Copyright © 1998 W3C (MIT, INRIA, Keio), tous droits réservés. Les règles du W3C sur la responsabilité, les marques de commerce, les droits d'auteur et les licences de logiciels sont applicables.
Cette spécification définit la syntaxe et la sémantique de XSLT, qui est un langage permettant de transformer des documents XML en d'autres documents XML.
XSLT est conçu pour être utilisé comme une partie de XSL, le langage des feuilles de style de XML. En plus de XSLT, XSL inclus un vocabulaire XML pour la spécification de formatage. XSL spécifie les règles de présentation d'un document XML en utilisant XSLT pour décrire comment le document peut être transformé en un autre document qui utilise le vocabulaire de formatage.
XSLT est aussi conçu pour être utilisé indépendamment de XSL. Cependant, XSLT n'est pas censé être utilisé comme un langage de transformation XML à vocation générale. Il a surtout été conçu pour les types de transformations nécessaires lorsque XSLT est utilisé comme une partie de XSL.
La version originale de ce document a été examinée par les Membres du W3C ainsi que d'autres parties concernées, elle a été approuvée par le directeur comme étant une Recommandation du W3C. C'est un document stable pouvant être utilisé comme document de référence ou cité comme une référence normative par d'autres documents. Le rôle du W3C en mettant à disposition cette Recommandation est de promouvoir son déploiement le plus large possible. Ceci dans le but d'améliorer et d'accroître la fonctionnalité et l'interopérabilité du Web.
La liste des erreurs répertoriées dans cette spécification est disponible à: http://www.w3.org/1999/11/REC-xslt-19991116-errata.
Les commentaires sur cette spécification peuvent être adressés à xsl-editors@w3.org; les archives des commentaires sont disponibles. Les discussions publiques sur XSL, y compris les Transformations XSL, se tiennent sur la mailing liste XSL-List.
La version anglaise de cette spécification est la seule version normative (http://www.w3.org/TR/1999/REC-xslt-19991116). Cependant, pour les traductions de ce document, consulter http://www.w3.org/Style/XSL/translations.html.
Une liste des Recommandations courantes du W3C ainsi que d'autres documents techniques peut être trouvée à: http://www.w3.org/TR.
Cette spécification a été produite comme une partie de l'activité Style du W3C.
1 Introduction
2 Structure des feuilles de
style
2.1 Espace de noms XSLT
2.2 Éléments
de feuilles de styles
2.3 Feuille
de style sous forme d'élément littéral résultat
2.4 Noms qualifiés
2.5 Traitement de la compatibilité
ascendante
2.6 Combinaison
de feuilles de style
2.6.1 Inclusion
de feuilles de style
2.6.2 Import
de feuilles de style
2.7 Feuilles
de style encapsulées
3 Modèle de données
3.1 Les fils du noeud
racine
3.2 URI base
3.3 Entités
non valides
3.4 Suppression de caractères
espace
4 Expressions
5 Règles modèle
5.1 Modèle
de traitement
5.2 Modèles
5.3 Définition
de règles modèle
5.4 Application
des règles modèle
5.5 Résolution de conflits
des règles modèle
5.6 Outrepasser des règles
modèles
5.7 Modes
5.8 Règles modèle
encastrées
6 Modèles nommés
7 Créer l'arbre
résultat
7.1 Créer
des éléments et des attributs
7.1.1 Éléments
résultats littéraux
7.1.2 Créer
des éléments avec xsl:element
7.1.3 Créer
des attributs avec xsl:attribute
7.1.4 Ensembles
d'attributs nommés
7.2 Créer de texte
7.3 Créer
des instructions de traitement
7.4 Créer
des commentaires
7.5 Copier
7.6 Calculer
le texte généré
7.6.1 Générer
du texte avec xsl:value-of
7.6.2 Les
modèles de valeurs d'attributs
7.7 Calculer
7.7.1 Attributs
de conversion de nombres en chaînes de caractères
8 Répétition
9 Traitement conditionnel
9.1 Traitement
conditionnel par xsl:if
9.2 Traitement
conditionnel par xsl:choose
10 tri
11 Variables et Paramètres
11.1 Fragments
d'arbre résultat
11.2 Valeurs des Variables
et des Paramètres
11.3 Utilisation des valeurs
des Variables et des Paramètres avec xsl:copy-of
11.4 Variables et
paramètres de haut niveau
11.5 Les Variables et
les Paramètres dans les modèles
11.6 Passage
de paramètres aux modèles
12 Fonctions additionnelles
12.1 Documents avec sources
multiples
12.2 Clés
12.3 Formatage de nombres
12.4 Fonctions additionnelles
diverses
13 Messages
14 Extensions
14.1 Eléments extension
14.2 Fonctions extension
15 Reprise
16 Sorties
16.1 La méthode
de sortie XML
16.2 La méthode
de sortie HTML
16.3 La méthode
de sortie texte
16.4 Désactivation
de la production littérale des caractères en sortie
17 Conformité
18 Notation
A Références
A.1 Références
normatives
A.2 Autres références
B Récapitulatif de la syntaxe des éléments
C Fragment de la DTD des feuilles de style XSLT (non normatif)
D Exemples (non normatifs)
D.1 Exemple de document
D.2 Exemple avec des données
E Avertissements (non normatif)
F Changement depuis
la recommandation proposée (non normatif)
G Fonctionnalités
à l'étude pour une future version de XSLT (non normatif)
Cette spécification définit la syntaxe et la sémantique du langage XSLT. Une transformation dans XSLT est exprimée comme un document XML bien formé [XML] conformément aux espaces de noms définis dans la recommandation XML [Noms XML], pouvant aussi bien contenir des éléments définis par XSLT que d'autres éléments non définis par XSLT. Les éléments définis par XSLT se distinguent par leur appartenance à un espace de nom XML spécifique (voir [2.1 Espace de noms XSLT]), qui est référencé dans cette spécification par Espace de noms. Ainsi cette spécification est une définition de la syntaxe et de la sémantique de l'Espace de noms XSLT.
Une transformation exprimée en XSLT décrit les règles pour transformer un arbre source en un arbre résultat. La transformation est obtenue en associant des motifs à des modèles. Les motifs sont appliqués aux éléments de l'arbre source. Le modèle est instancié pour créer une partie de l'arbre résultat. L'arbre résultat est distinct de l'arbre source. La structure de l'arbre résultat peut être complètement différente de la structure de l'arbre source. Pendant la construction de l'arbre résultat, des éléments de l'arbre source peuvent être filtrés et réordonnés, et des structures arbitraires peuvent être ajoutées.
Une transformation exprimée en XSLT est appelée feuille de styles. Ceci parce que quand XSLT est transformé dans le vocabulaire de formatage XSL, la transformation fonctionne comme une feuille de styles.
Ce document ne spécifie pas comment une feuille de styles XSLT est associée à un document XML. Il est recommandé que les processeurs XSL supportent le mécanisme décrit dans [Feuilles de style XML]. Lorsque ce mécanisme ou n'importe quel autre mécanisme rencontre une séquence de plus d'une seule feuille de styles XSLT qu'il faut appliquer simultanément à un document XML, alors le résultat doit être le même que si l'on appliquait une seule feuille de styles qui importerait chaque membre de la séquence dans l'ordre (voir [2.6.2 Import des feuilles de style]).
Une feuille de styles contient un ensemble de règles modèles. Une règle modèle est constituée de deux parties : un motif qui sert à identifier des noeuds de l'arbre source et un modèle pouvant être instancié afin de constituer une partie de l'arbre résultat. Ceci permet à une feuille de styles d'être applicable à une large catégorie de documents ayant des structures d'arbres source similaires.
Un modèle est instancié pour un élément source particulier afin de créer une partie de l'arbre résultat. Un modèle peut contenir des éléments permettant de spécifier littéralement les éléments de la structure résultante. Un modèle peut aussi contenir des éléments de l'espace de noms XSLT représentant des instructions pour la création de fragments de l'arbre résultat. Lorsqu'un modèle est instancié, chaque instruction est exécutée et remplacée par le fragment d'arbre résultat qu'elle aura crée. Les instructions peuvent sélectionner et traiter les descendants des éléments source. La création d'un fragment de l'arbre résultat par le traitement des éléments descendants se fait en trouvant la règle modèle applicable et en instanciant son modèle. Il faut noter que les éléments ne sont traités que lorsqu'ils sont sélectionnés par l'exécution d'une instruction. L'arbre résultat est construit en prenant la règle modèle du noeud racine et en instanciant son modèle.
Lors de la recherche d'une règle modèle applicable, plusieurs autre règles modèle peuvent avoir un motif correspondant à un élément donné. Cependant, une seule et unique règle modèle sera appliquée. La méthode permettant de déterminer quelle est la règle modèle à appliquer est décrite dans [5.5 Résolution de conflits des règles modèle].
Un modèle possède à lui tout seul une puissance considérable : il peut créer des structures de n'importe quel niveau de complexité; il peut accéder et récupérer les valeurs de chaînes de caractères situées à n'importe quel endroit de l'arbre source; il peut générer des structures répétées au fur et à mesure que les occurrences d'éléments sont rencontrées dans l'arbre source. Pour les transformations simples où la structure de l'arbre résultat est indépendante de la structure de l'arbre source, une feuille de styles peut souvent être réduite à un seul modèle, valable pour la génération de la totalité de l'arbre résultat. Les transformations appliquées à des documents XML représentant des données sont souvent de ce type (voir [D.2 Exemple de données]). XSLT offre la possibilité d'utiliser une syntaxe simplifiée pour ce type de feuilles de style (voir [2.3 Feuille de style sous forme d'élément littéral résultat]).
L'instanciation d'un modèle se fait toujours par rapport à un noeud courant et une liste de noeuds courante. Le noeud courant est toujours membre de la liste de noeuds courante. Plusieurs opérations dans XSLT sont relatives au noeud courant. Seules quelques instructions permettent de changer la liste de noeuds courante ou le noeud courant (voir [5 Règles modèle] et [8 Répétition]); Durant l'instanciation de l'une de ces instructions, la liste de noeuds courante est modifiée et forme une nouvelle liste de noeuds courante dont les éléments deviennent, chacun à leur tour, le noeud courant. A la fin de ce processus, le noeud courant et la liste de noeuds courante redeviennent ce qu'ils étaient avant instanciation de l'instruction.
XSLT utilise le langage d'expression défini par [XPath] pour sélectionner les éléments à traiter, les traitements conditionnels et la génération de texte.
XSLT fournit deux ouvertures pour étendre le langage, l'une pour étendre le jeu d'instructions d'utilisables dans les modèles et une autre pour étendre l'ensemble des fonctions utilisables dans les expressions XPath. Ces ouvertures reposent toutes les deux sur l'utilisation des espaces des noms XML. Cette version de XSLT ne définit pas le mécanisme d'implémentation de ces ouvertures. Voir [14 Extensions].
NOTE : Le groupe de travail XSL prévoit de définir ce mécanisme soit dans une future version de cette spécification soit dans une spécification séparée.
La signification des règles d'écriture des éléments spécifiques à la syntaxe XSLT est fournie au chapitre [18 Notation].
Les types MIME text/xml et application/xml [RFC2376] devraient être utilisés pour les feuilles de style XSLT. Il est possible qu'un type de média soit spécifiquement associé à une feuille de style XSLT ; dans ce cas, ce type de média est également autorisé.
L'URI de l'espace de noms XSLT est : http://www.w3.org/1999/XSL/Transform.
NOTE : La valeur 1999 se trouvant dans l'URI indique l'année d'attribution de l'URI par le W3C. Cela n'indique pas la version de XSLT utilisée; cette dernière étant spécifiée par des attributs (voir [2.2 L'élément de feuille de styles] et [2.3 Feuille de style sous la forme d'élément littéral résultat]).
Les processeurs XSLT doivent utiliser le mécanisme des espaces de noms [Noms XML] pour reconnaître les éléments et les attributs de cet espace de noms. Les éléments de l'espace de noms XSLT sont reconnus uniquement dans la feuille de styles et non dans le document source. La liste complète des éléments XSLT prédéfinis est spécifiée dans [B Récapitulatif des éléments de syntaxe]. Les constructeurs informatique ne doivent pas étendre l'espace de noms XSLT avec des éléments ou des attributs nouveaux. Toute extension doit se présenter sous la forme d'un nouvel espace de noms séparé. Chaque espace de noms utilisé pour des instructions additionnelles doit être identifié au moyen du mécanisme d'extension d'élément spécifié dans [14.1 Éléments extension].
Cette spécification utilise le préfixe
xsl:
pour référencer les éléments
de l'espace de noms XSLT. Cependant, les feuilles de style XSLT sont libres
d'utiliser n'importe
quel préfixe, à condition qu'il y ait
une déclaration
d'espace de noms liant le préfixe
à l'URI de l'espace de noms XSLT.
Un élément appartenant à l'espace de noms XSLT peut avoir n'importe quel attribut n'appartenant pas à l'espace de noms XSLT, à condition que le nom étendu de l'attribut ne soit pas une URI d'espace de noms nulle. La présence de tels attributs ne doit pas modifier le comportement des éléments XSLT et des fonctions définies dans ce document. Ainsi, un processeur XSLT est toujours libre d'ignorer de pareils attributs, et, ce faisant, n'a pas à signaler d'erreur quand il ne reconnaît pas l'URI de l'espace des noms. De tels attributs peuvent fournir, par exemple, des identificateurs uniques, des indications d'optimisation ou de la documentation.
Une erreur doit être produite quand des éléments de l'espace de noms XSLT ont des attributs dont les noms étendus ont des URI nulles (par exemple : des attributs sans noms préfixés), exception faite des noms d'attributs définis dans la présente spécification.
NOTE : Les conventions utilisées pour les noms des éléments XSLT, les attributs et les fonctions font que tous les noms tous écrits en lettres minuscules, utilisent le trait d'union pour séparer les mots et n'utilisent les abréviations que si elles existent déjà dans la syntaxe du langage en question, comme par exemple XML ou HTML.
<xsl:stylesheet id = id
extension-element-prefixes = tokens
exclude-result-prefixes = tokens
version = number>
<!-- Contenu : (xsl:import*, top-level-elements)-->
</xsl:stylesheet>
<xsl:transform
id = id
extension-element-prefixes = tokens
exclude-result-prefixes = tokens
version = number>
<!-- Contenu : (xsl:import*,
top-level-elements)-->
</xsl:transform>
Une feuille de styles est représentée
par
l'élément xsl:stylesheet
dans un document XML. xsl:transform
est autorisé comme synonyme de
xsl:stylesheet
.
L'élément xsl:stylesheet
doit avoir un attribut
version
indiquant la version de XSLT exigées par la feuille
de styles. Pour cette version de XSLT, la valeur doit être 1.0. Lorsque
la valeur n'est pas égale à 1.0, le traitement en compatibilité
ascendante est activé (voir [2.5 Traitement de la
compatibilité ascendante]).
L'élément xsl:stylesheet
peut contenir les types
d'éléments suivants:
xsl:import
xsl:include
xsl:strip-space
xsl:preserve-space
xsl:output
xsl:key
xsl:decimal-format
xsl:namespace-alias
xsl:attribute-set
xsl:variable
xsl:param
xsl:template
Un élément fils de l'élément
xsl:stylesheet
est appelé élément de haut
niveau.
L'exemple suivant montre la structure d'une feuille de styles. Les points de suspension (...) indiquent où les valeurs et les contenus d'attributs ont été omis. Bien que cet exemple montre un cas d'utilisation de chacun des éléments autorisés, les feuilles de style peuvent en contenir de zéro à plusieurs occurrences.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="..."/>
<xsl:include href="..."/>
<xsl:strip-space elements="..."/>
<xsl:preserve-space elements="..."/>
<xsl:output method="..."/>
<xsl:key name="..." match="..." use="..."/>
<xsl:decimal-format name="..."/>
<xsl:namespace-alias stylesheet-prefix="..." result-prefix="..."/>
<xsl:attribute-set name="...">
...
</xsl:attribute-set>
<xsl:variable name="...">...</xsl:variable>
<xsl:param name="...">...</xsl:param>
<xsl:template match="...">
...
</xsl:template>
<xsl:template name="...">
...
</xsl:template>
</xsl:stylesheet>
L'ordre avec lequel les fils de l'élément xsl:stylesheet
apparaissent n'est significatif que pour les éléments xsl:import
et les récupérations d'erreurs. Les utilisateurs ont la liberté
d'ordonner les éléments selon leurs préférences
et les outils de création de feuilles de styles n'ont pas besoins de
contrôler l'ordre dans lequel apparaissent les éléments.
De plus, l'élément xsl:stylesheet
peut contenir n'importe quel élément n'appartenant pas à
l'espace de noms XSLT, à la condition que l'URI de l'espace de noms
du nom étendu de l'élément soit non nulle. La présence
de tels éléments de haut niveau ne doit changer le comportement
ni des éléments ni des fonctions XSLT définis dans
ce document; ainsi, il ne doit pas être permis de permettre la modification
des règles d'un élément de haut niveau comme xsl:apply-templates
pour résoudre, par exemple, des conflits. Ainsi, un processeur XSLT
est toujours libre d'ignorer ces éléments de haut niveau,
et il doit ignorer un élément de haut niveau sans générer
d'erreur s'il ne reconnaît pas l'URI de l'espace de noms. De tels
éléments peuvent, par exemple, fournir :
les informations utilisées par les extensions d'éléments ou l'extension de fonctions (voir [14 Extensions]),
les informations concernant l'utilisation de l'arbre résultat,
les informations concernant l'obtention de l'arbre source,
les meta-données de la feuille de styles,
une documentation structurée de la feuille de styles.
Une syntaxe simplifiée existe pour les feuilles de style et consiste
en un simple et unique modèle appliqué au noeud racine. La feuille
de styles peut consister en un simple élément littéral
résultat (voir [7.1.1 Les éléments
littéraux résultats]). Une telle feuille de styles est équivalente
à une feuille de styles qui utiliserait un élément xsl:stylesheet
contenant une règle modèle qui contiendrait, elle-même,
un élément littéral résultat; la règle modèle
ayant comme motif de recherche le caractère /. Par exemple :
<html xsl:version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/strict">
<head>
<title>Expense Report Summary</title>
</head>
<body>
<p>Total Amount: <xsl:value-of
select="expense-report/total"/></p>
</body>
</html>
signifie la même chose que:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:template match="/">
<html>
<head>
<title>Expense Report Summary</title>
</head>
<body>
<p>Total Amount: <xsl:value-of select="expense-report/total"/></p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Quand l'élément littéral
résultat est l'élément document de la feuille de styles,
il doit avoir l'attribut xsl:version
indiquant la version de XSLT requise
par la feuille de styles. Pour la version de XSLT décrite dans ce
document, la valeur doit être 1.0; La valeur doit être
un Nombre. D'autres
éléments littéraux résultats peuvent également
recevoir l'attribut xsl:version
. Lorsque l'attribut xsl:version
n'est pas égal à 1.0,
le
traitement de compatibilité ascendante est activé (voir [2.5
Traitement de la compatibilité ascendante]).
Le contenu d'un élément littéral résultat utilisé comme feuille de styles n'est pas différent de celui autorisé lorsque ce même élément est utilisé à l'intérieur d'une feuille de styles. En conséquence, un élément littéral résultat, même utilisé comme feuille de styles, ne peut contenir d'éléments de haut niveau.
Dans certains cas, la seule manière pour qu'un système puisse déterminer qu'un document XML doit être traité par un processeur XSLT comme feuille de styles est l'examen du document XML lui-même. L'utilisation de la syntaxe simplifiée rend la tâche beaucoup plus difficile.
NOTE : Par exemple, un
autre langage XML (AXL) pourrait aussi utiliser un axl:version
pour l'élément document pour indiquer qu'il s'agit d'un document
XML devant être traité par un processeur AXL; Si le document
a en même temps les attributs axl:version
et xsl:version
, un problème
se pose pour savoir si le document doit être traité par un
processeur XSLT ou par un processeur AXL.
Par conséquent, la syntaxe simplifiée ne devrait pas être utilisée pour les feuilles de style XSLT pouvant être utilisées dans pareils cas. Cette situation peut se produire, par exemple, lorsqu'une feuille de styles XSLT est transmise par messagerie avec un type MIME associé tel que text/xml ou application/xml à un receveur qui utilisera le type MIME pour déterminer comment traiter le message.
Le nom d'un objet XSLT interne, en particulier les modèles nommés (voir [6 Modèles nommés]), un mode (voir [5.7 Modes]), un ensemble d'attributs (voir [7.1.4 Ensembles d'attributs nommés]), une clef (voir [12.2 Clés]), un format décimal (voir [12.3 Formatage de nombres]), une variable ou un paramètre (voir [11 Variables et Paramètres]) est spécifié comme étant un nom qualifié (QName). S'il dispose d'un préfixe, alors celui-là est développé en une référence d'URI en lui appliquant les déclarations d'espaces de noms applicables aux attributs dans lesquels le nom apparaît. Le nom étendu, comprenant la partie locale du nom et la possible référence vide à l'URI, est utilisé comme nom de l'objet. L'espace de noms par défaut n'est pas utilisé pour les noms sans préfixes.
Un élément active le traitement par compatibilité ascendante
pour lui-même, ses attributs, ses descendants et leurs attributs dans
le cas où c'est un élément xsl:stylesheet
dont l'attribut version
est différent de 1.0, ou c'est un
élément littéral résultat ayant un attribut xsl:version
dont la valeur est différente de 1.0, or lorsque c'est un élément
littéral résultat qui n'a pas un attribut xsl:version
et qui est l'élément document d'une feuille de styles utilisant
la syntaxe simplifiée (voir [2.3
Feuille de style sous forme d'élément littéral résultat]).
Un élément littéral résultat ayant un attribut xsl:version
dont la valeur est égale à 1.0 désactive le mode de traitement
par compatibilité ascendante pour lui-même, ses attributs, ses
descendants et leurs attributs.
Si un élément est traité en mode compatibilité ascendante alors:
s'il s'agit d'un élément de haut niveau et que XSLT 1.0 ne permet pas à cet élément d'être de haut niveau, alors il doit être ignoré ainsi que son contenu;
S'il s'agit d'un élément d'un modèle qui n'est pas autorisé comme tel par XSLT 1.0, alors, si l'élément n'est pas instancié, aucune erreur ne doit pas être signalée et si l'élément est instancié, alors XSLT doit exécuter un "recours" pour l'élément tel que spécifié dans [15 Reprise];
Si l'élément a un attribut non autorisé par XSLT 1.0 ou si l'élément a un attribut optionnel dont la valeur n'est pas autorisée par XSLT 1.0, alors l'attribut doit être ignoré.
Ainsi, bien que la feuille de styles suivante inclus des éléments de l'espace de noms XSLT non définis dans cette spécification, n'importe quel processeur XSLT 1.0 doit être capable de traiter cette feuille de styles suivante sans produire d'erreur :
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:choose>
<xsl:when test="system-property('xsl:version')
>= 1.1">
<xsl:exciting-new-1.1-feature/>
</xsl:when>
<xsl:otherwise>
<html>
<head>
<title>XSLT
1.1 required</title>
</head>
<body>
<p>Sorry,
this stylesheet requires XSLT 1.1.</p>
</body>
</html>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
NOTE : Si une feuille de styles dépend d'une manière cruciale d'un élément de haut niveau introduit dans une version de XSL postérieure à la version 1.0, alors la feuille de styles peut utiliser un élément xsl:message avec terminate="yes" (voir [13 Messages]) pour garantir que les processeurs XSLT qui implémentent les versions antérieures de XSL ne vont pas ignorer silencieusement ces éléments de haut niveau. Par exemple :
<xsl:stylesheet version="1.5"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:important-new-1.1-declaration/>
<xsl:template match="/">
<xsl:choose>
<xsl:when test="system-property('xsl:version')
< 1.1">
<xsl:message terminate="yes">
<xsl:text>Sorry,
this stylesheet requires XSLT 1.1.</xsl:text>
</xsl:message>
</xsl:when>
<xsl:otherwise>
...
</xsl:otherwise>
</xsl:choose>
</xsl:template>
... </xsl:stylesheet>
Si une expression se produit dans un attribut qui est traité en mode compatibilité ascendante, alors un processeur XSLT doit rattraper les erreurs de traitement de l'expression de la manière suivante :
Si l'expression n'est pas conforme à la syntaxe permise par la grammaire XPath, alors il ne faut pas signaler d'erreurs tant que l'expression n'est pas évaluée;
Si l'expression appelle une fonction dont le nom n'est pas préfixé et qui ne fait pas partie de la librairie XSLT, alors il ne faut pas signaler d'erreurs tant que la fonction n'est pas appelée;
Si l'expression fait un appel de fonction dont les arguments, en nombre ou en type, ne sont pas autorisés par XSLT, alors il ne faut pas signaler d'erreur tant que la fonction n'est pas appelée.
XSLT fournit deux mécanismes pour combiner des feuilles de style:
<!--
Catégorie : élément de haut niveau -->
<xsl:include
href = uri-reference />
Une feuille de styles XSLT peut inclure une autre feuille de styles
XSLT en utilisant l'élément xsl:include
. L'élément
xsl:include
a un attribut href
dont la valeur est la référence
de l'URI identifiant la feuille de styles à inclure. Une URI relative
est résolue par rapport à l'URI
base de l'élément xsl:include
(voir [3.2
URI base]).
L'élément xsl:include
n'est permis que comme
élément de haut niveau.
L'inclusion fonctionne au niveau de l'arbre XML. La ressource localisée
par la valeur de l'attribut href
est analysée comme un
document XML, et les fils de l'élément xsl:stylesheet
de ce document remplacent l'élément xsl:include
dans le document appelant. Le fait que des
règles modèle ou des définitions soient incluses n'affecte
pas la manière dont elles sont traitées.
La feuille de styles incluse peut utiliser la syntaxe simplifiée
décrite dans [2.3 Feuille
de style sous forme d'élément littéral résultat].
La feuille de styles incluse est traitée exactement
de la même manière que l'élément xsl:stylesheet
équivalent.
L'inclusion directe ou indirecte d'une feuille de styles par elle-même doit provoquer une erreur.
NOTE : L'inclusion multiple d'une feuille de styles peut générer des erreurs à cause de la duplication de définitions. De telles inclusions multiples sont moins évidentes lorsqu'elles sont indirectes. Par exemple, si une feuille de styles B inclue une feuille de styles A, une feuille de styles C inclue la feuille de styles A, et une feuille de styles D inclue les deux feuilles de style B et C, alors la feuille de styles A sera inclue indirectement deux fois par D. Si les feuilles de style B, C et D étaient utilisées comme des feuilles de style indépendantes, alors l'erreur pourrait être évitée en créant une feuille de styles B' qui contiendrait tout B sauf l'inclusion de A et en changeant B pour qu'elle ne contienne que l'inclusion de B' et de A, de même pour C, et enfin, en réécrivant D pour que cette feuille de styles ne fasse qu'inclure A, B', C'.
<xsl:import
href = uri-reference
/>
Une feuille de styles XSLT peut importer une autre feuille XSLT en utilisant l'élément xsl:import. Importer ou inclure des feuilles de style revient à faire la même chose (voir [2.6.1 Inclusion de feuilles de style]) à l'exception du fait que les règles modèles et les définitions de la feuille de styles qui importe ont une préférence sur celles de la feuille de styles importée; ceci est décrit avec plus de précision ci-après. L'élément xsl:import possède un attribut href dont la valeur est une adresse URI identifiant la feuille de styles à importer. Une URI relative est résolue en prenant comme base l'URI de l'élément xsl:import (voir [3.2 URI base]).
L'élément xsl:import n'est permis que comme un élément
de haut niveau. Les éléments fils
de l'élément xsl:import doivent précéder tous les
autres éléments fils de l'élément xsl:stylesheet
,
y compris n'importe quel élément fils de l'élément
xsl:include
. Lorsque xsl:include
est utilisé
pour inclure une feuille de styles, tous les éléments xsl:import
du document inclus sont déplacés dans le document incluant cette
feuille de styles et placés après tous les éléments
xsl:import existant dans ce document.
Par exemple :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="article.xsl"/>
<xsl:import href="bigfont.xsl"/>
<xsl:attribute-set name="note-style">
<xsl:attribute name="font-style">italic</xsl:attribute>
</xsl:attribute-set> </xsl:stylesheet>
Les éléments
xsl:stylesheet
rencontrés lors du traitement d'une feuille
de styles contenant des éléments
xsl:import sont
considérés comme constituant un arbre d'import (import
tree). Dans cet arbre,
les éléments xsl:stylesheet
ont un fils d'importation par élément
xsl:import
qu'ils contiennent.
Tout élément xsl:include
est résolu avant
construction de l'arbre d'import. Dans
l'arbre d'import, un élément xsl:stylesheet
a une
plus faible préséance d'import qu'un autre s'il est lu avant ce
dernier dans le sens de parcours réentrant de l'arbre d'import (c'est
à dire un parcours de l'arbre tel que les éléments xsl:stylesheet
soient parcourus après leurs fils importés). Chaque définition
et règle modèle ont une préséance d'import déterminée
par l'élément xsl:stylesheet
qui le contient.
Par exemple, supposons
une feuille de styles A importe les feuilles de style B et C dans cet ordre;
la feuille de styles B importe la feuille de styles D;
la feuille de styles C importe la feuille de styles E.
Alors, l'ordre de préséance d'import (faible d'abord) est D, B, E, C, A.
NOTE : Puisque les éléments xsl:import doivent apparaître avant toute définition ou règle modèle, une implémentation traitant des feuilles de style importées, au moment ou elle rencontre l'élément xsl:import va rencontrer des définitions et des règles modèle dans l'ordre croissant de préséance d'import.
En général, une définition ou règle modèle avec une préséance d'import supérieure prend la préséance sur une définition ou une règle modèle ayant une préséance d'import plus faible. Ceci est donné avec plus de détail pour chaque type de définition ou de règle modèle.
L'importation directe ou indirecte d'une feuille
de styles par elle-même est une erreur. A partir de là, le
cas où une feuille de styles avec une URI particulière est
importée à plusieurs endroits n'est pas traitée de
manière particulière.
L'arbre
d'import aura un élément
xsl:stylesheet
différent à chaque endroit où elle est importée.
NOTE : Lorsque xsl:apply-imports est utilisé (voir [5.6 Passer outre des règles modèles]), le comportement peut être différent de celui qui aurait été si la feuille de styles avait été importée simplement avec une préséance d'import supérieure.
Normalement une feuille de styles XSLT est un document XML à part entière
ayant l'élément xsl:stylesheet
comme élément
racine. Cependant, une feuille de styles XSLT peut aussi être encapsulée
dans une autre ressource. Deux types d'encapsulation sont possibles :
xsl:stylesheet
peut
survenir dans un document XML autrement que comme élément
racine.Pour faciliter la deuxième forme d'encapsulation, l'élément
xsl:stylesheet
est autorisé à avoir un attribut ID
permettant de lui attribuer un identifiant unique.
NOTE : Dans le but d'utiliser ce type d'attribut avec la fonction id de XPath, il doit être déclaré dans la DTD comme étant un ID.
L'exemple suivant montre comment l'instruction de traitement xml-stylesheet
[feuilles de style XML] peut être utilisée
pour permettre à un document de contenir sa propre feuille de styles.
L'adresse URI utilise une URI relative avec un fragment d'identification pour
localiser l'élément xsl:stylesheet
:
<?xml-stylesheet type="text/xml" href="#style1"?>
<!DOCTYPE doc SYSTEM "doc.dtd">
<doc>
<head>
<xsl:stylesheet id="style1"
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:import href="doc.xsl"/>
<xsl:template match="id('foo')">
<fo:block font-weight="bold"><xsl:apply-templates/></fo:block>
</xsl:template>
<xsl:template match="xsl:stylesheet">
<!-- ignore -->
</xsl:template>
</xsl:stylesheet>
</head>
<body>
<para id="foo"> ...
</para>
</body>
</doc>
NOTE : Une feuille de
styles encapsulée dans le document sur lequel elle s'applique ou
qui peut être incluse ou importée dans une feuille de styles
qui est, elle, encapsulée, doit typiquement contenir une règle
modèle précisant que les éléments
xsl:stylesheet
sont à ignorés.
Le modèle de données utilisé par XSLT est le même que celui utilisé par XPath avec en plus ce qui est décrit dans cette section. XSLT travaille sur les documents de type source, résultat et feuille de styles en utilisant le même modèle de données. Deux documents XML ayant le même arbre seront traités de la même manière par XSLT.
Les instructions de traitement et les commentaires de la feuille de styles sont ignorés : la feuille de styles est traitée comme si, ni les noeuds d'instructions de traitement, ni les noeuds de commentaires, n'étaient inclus dans l'arbre qui représente la feuille de styles.
Les restrictions faites sur les fils du noeud racine sont levées pour l'arbre résultat. L'arbre résultat peut avoir comme enfant n'importe quelle séquence de noeuds qu'il serait possible d'avoir pour un noeud d'élément. En particulier, il peut avoir pour enfant des noeuds textuels et n'importe quel nombre de noeuds d'éléments. Lorsqu'un arbre résultat est sauvegardé en utilisant la méthode d'écriture XML (voir [16 Sortie]), il est possible que l'arbre résultat ne soit pas un document XML bien formé; toutefois, il sera toujours une entité générale externe validée bien formée.
Lorsque l'arbre source est le résultat de l'analyse d'un document XML bien formé, alors le noeud racine de l'arbre source satisfait de facto aux restrictions normales qui sont de ne pas avoir un noeud texte comme enfant et exactement un seul élément enfant. Si l'arbre source est créé par d'autres moyens, par exemple en utilisant DOM, les restrictions habituelles sont levées pour l'arbre source comme pour l'arbre résultat.
A chaque noeud est associé une URI qu'on désigne comme étant son URI de base : elle est utilisée pour le remplacement des valeurs relatives des URI d'attributs par des URIs absolues. Si un élément ou une instruction de traitement survient dans une entité externe, alors son URI de base est l'URI de l'entité externe; autrement, l'URI de base est l'URI de base du document. L'URI de base du noeud document est l'URI de l'entité document. L'URI de base d'un noeud textuel, d'un noeud commentaire, d'un noeud d'attribut ou d'un noeud d'espace de noms est l'URI de base du parent du noeud.
Le noeud racine dispose de règles de correspondances qui fournissent l'URI de chaque entité non analysée déclarée dans la DTD de ce document. L'URI est générée à partir des identificateurs système et publique spécifiés dans la déclaration de l'entité. Le processeur XSLT peut utiliser l'identifiant publique pour générer l'URI d'une entité au lieu de celle spécifiée dans l'identifiant système. Si le processeur XSLT n'utilise pas un identifiant publique pour générer l'URI, il doit utiliser l'identifiant système; si l'identifiant système est une URI relative, il doit être résolu et transformé en une URI absolue en utilisant comme URI de base, l'URI de la ressource contenant la déclaration de l'entité [RFC2396].
Une fois l'arbre pour le document source ou la feuille de styles construit, mais avant tout autre traitement XSLT, certains noeuds textuels sont supprimés. Un noeud textuel est supprimé quand il ne contient que des caractères d'espaces blancs. Supprimer le noeud textuel revient à l'enlever de l'arbre. Le processus de suppression prend en entrée un ensemble de noms d'éléments pour lesquels les caractères d'espaces blancs doivent être préservés. Le processus de suppression est appliqué aussi bien aux feuilles de styles qu'aux documents source, cependant, les ensembles des noms d'éléments pour lesquels les caractères d'espaces blancs doivent être préservés sont déterminés différemment pour les feuilles de style et les documents source.
Un noeud textuel est préservé si l'une des conditions suivantes est vérifiée :
le nom de l'élément parent du noeud textuel fait partie de l'ensemble contenant les noms des éléments dont on veut préserver les caractères d'espaces blancs.
Le noeud textuel contient au moins un caractère différent d'un espace blanc. Comme pour XML, les espaces blancs sont les caractères dont les codes hexadécimaux sont #x20, #x9, #xD ou #xA.
Le premier des ancêtres du noeud textuel à avoir
l'attribut xml:space
renseigné en fixe la valeur à
preserve
(en d'autres termes : il n'existe aucun élément
entre cet ancêtre et le noeud textuel qui modifierait la valeur de cet
attribut pour la remettre à default
).
Autrement le noeud texte est supprimé.
Les attributs xml:space ne sont pas supprimés de l'arbre.
NOTE : Ceci sous-entend qu'un attribut xml:space
est spécifié dans un élément littéral résultat
et sera inclus dans le résultat.
Pour les feuilles de style, l'ensemble des noms d'éléments préservant les caractères d'espaces blancs est simplement xsl:text.
<!--
Catégorie : élément de haut niveau -->
<xsl:strip-space
elements
= tokens />
<!--Catégorie
: élément de haut niveau -->
<xsl:preserve-space
elements
= tokens />
Pour les documents source, l'ensemble des noms
d'éléments
préservant les caractères d'espaces
blancs est spécifié par les éléments
de haut
niveau xsl:strip-space et xsl:preserve-space. Chacun de ces
éléments a un attribut elements
dont la valeur est
une liste de
NameTests
séparés par des caractères espace. A l'origine, l'ensemble
des noms d'éléments préservant les caractères
d'espaces blancs contient tous les noms d'éléments. Si, dans
l'élément xsl:strip-space, un nom d'élément
correspond à un NameTest
alors, il est retiré de l'ensemble de noms d'éléments
préservant les caractères d'espaces blancs. Si un nom d'élément
correspond à un NameTest
dans l'élément xsl:preserve-space, alors il est ajouté
à l'ensemble des noms d'éléments
préservant
les caractères d'espaces blancs. Un élément correspond
à un NameTest
si et seulement si
son NameTest
est vérifié par le test
de noeud XPath. Les conflits de correspondances entre les éléments
xsl:strip-space
and xsl:preserve-space sont résolus de la même manière
que les conflits entre les règles modèle (voir [5.5
Résolution de conflits des règles modèle]).
Ainsi, la correspondance applicable pour nom d'élément particulier
est déterminée de la manière suivante:
Premièrement, toute correspondance avec une préséance d'import plus faible qu'une autre est ignorée.
Deuxièmement, toute correspondance avec un NameTest ayant une priorité par défaut plus faible que celle du NameTest d'une autre correspondance est ignorée.
S'il reste plus d'une correspondance, c'est une erreur. Un processeur XSLT peut signaler l'erreur; s'il ne signale pas l'erreur, il doit la rattraper en choisissant, parmi les correspondances restantes, celle utilisée en dernier dans la feuille de styles.
XSLT utilise le langage d'expression défini par XPath [XPath]. Les expressions sont utilisées dans XSLT pour une variété de possibilités incluant :
Une expression doit correspondre à la règle de production Expr de XPath.
Les expressions interviennent comme valeurs de certains attributs d'éléments XSLT et entre accolades dans des modèles de valeurs d'attributs.
Dans XSLT, une expression autonome (c'est à dire : une expression qui ne fait partie d'aucune autre expression) prend son contexte comme suit :
Le noeud contextuel est le noeud courant
la position contextuelle vient de la position du noeud courant dans la liste courante de noeuds; la première position est 1
la dimension contextuelle est issue de la dimension de la liste courante de noeuds
les liens variables sont ceux dans le périmètre de l'élément ayant un attribut dans lequel l'expression se produit (voir [11 Variables et Paramètres])
l'ensemble de déclarations d'espace de noms sont celles dans le champ de l'élément ayant l'attribut dans lequel l'expression se produit ; ceci inclus la déclaration implicite du préfixe xml exigé par la Recommandation des espaces de noms [Noms XML] ; l'espace de noms par défaut (comme déclaré par xmlns) n'appartient pas à cet ensemble.
la librairie de fonctions est représentée par la librairie de fonctions de base augmentée des fonctions additionnelles définies dans [12 Fonctions additionnelles] et des fonctions d'extension décrites dans [14 Extensions]; Lorsqu'une expression appelle une quelconque autre fonction, une erreur doit être générée.
Une liste de noeuds sources est traitée pour créer un fragment de l'arbre résultat. L'arbre résultat est construit par traitement d'une liste contenant juste le noeud racine. Une liste de noeuds sources est traitée par rajout successif des arbres résultants du traitement successif de chaque noeud de la liste. Un noeud est traité en trouvant toutes les règles modèle dont les motifs correspondent au noeud, et en choisissant le meilleur parmi elles; la règle modèle retenue est alors instanciée en considérant le noeud comme noeud courant et la liste de noeuds source comme liste courante de noeuds. Typiquement, un modèle contient des instructions traitant une liste de noeuds source sélectionnés. Le processus de correspondance, instanciation et sélection se poursuit récursivement et se termine lorsque aucun nouveau noeud source n'est sélectionné pour traitement.
Les outils sont libres de traiter le document source par n'importe quel moyen du moment ou le résultat produit est le même que s'il était traité par ce modèle de traitement.
Les règles modèle identifient les noeuds auxquels elles s'appliquent en utilisant un motif. Les motifs sont aussi bien utilisés dans des règles modèle que pour la numérotation (voir [7.7 Numérotation]) ou la déclaration de clés (voir [12.2 Clés]). Un motif spécifie un ensemble de conditions sur un noeud. Un noeud satisfaisant les conditions correspond au motif; un noeud qui ne satisfait pas les conditions ne correspond pas au motif. La syntaxe pour les motifs est un sous-ensemble de la syntaxe pour les expressions. En particulier, les chemins de localisation soumis à certaines restrictions peuvent être utilisés comme des motifs. Une expression, qui est aussi un motif, donne toujours comme résultat un objet qui est un ensemble de noeuds. Un noeud correspond à un motif si le noeud est membre du résultat de l'évaluation du motif, considéré alors comme expression respectant un certain contexte; ce cas se produit quand le noeud contextuel est le noeud en train d'être mis en correspondance ou l'un de ses ancêtres.
Voici quelques exemples de motifs:
para
correspond à n'importe quel élément
para
* correspond à n'importe quel élément
chapter|appendix
trouve tous les éléments chapter
et appendix
olist/item
trouve tous les éléments item
ayant olist
comme parent
appendix//para
correspond à n'importe quel élément para
dont
un ancêtre est appendix
/ correspond au noeud racine
text()
correspond à n'importe quel noeud
textuel
processing-instruction()
correspond à n'importe
quel instruction de traitement
node()
correspond à n'importe quel noeud
autre qu'un noeud attribut et que le noeud racine
id("W11")
correspond à l'élément
ayant l'identifiant unique W11
para[1]
correspond au premier des éléments
para d'un parent
*[position()=1 and self::para]
correspond à
n'importe quel élément para
qui est le premier élément
fils de son parent
para[last()=1]
correspond à n'importe quel
élément para
qui est l'unique élément
para
de son élément parent
items/item[position()>1]
correspond à tous
les éléments item
, autres que le premier, et dont
le parent est items
item[position() mod 2 = 1]
serait vrai pour tous
les fils item
de numéro d'ordre impair par rapport à
leur parent.
div[@class="appendix"]//p
correspond à
tous les éléments p
ayant un ancêtre div
pour lequel l'attribut class
prend la valeur appendix
@class
correspond à tous les attributs
class
(pas à tous les éléments ayant
l'attribut class)
@*
correspond à n'importe quel attribut
Un motif doit concorder avec la grammaire des motifs (Pattern).
Un motif est un ensemble de motifs de chemins de localisation séparés
par |. Un motif de chemin de localisation est un chemin de localisation dont
les étapes n'utilisent que les axes child
ou attribute
.
Bien que les motifs ne doivent pas utiliser l'axe descendant-or-self
,
ils peuvent utiliser l'opérateur //
tout aussi bien que
l'opérateur /
. Les motifs de chemins de localisation peuvent
aussi commencer par un appel de fonction id
ou key
avec un argument littéral. Les prédicats d'un motif peuvent utiliser
n'importe quelle expression exactement comme ceux des chemins de localisation.
[1] | Pattern | ::= | LocationPathPattern | |
| Pattern '|' LocationPathPattern | ||||
[2] | LocationPathPattern | ::= | '/' RelativePathPattern? | |
| IdKeyPattern (('/' | '//') RelativePathPattern)? | ||||
| '//'? RelativePathPattern | ||||
[3] | IdKeyPattern | ::= | 'id' '(' Literal ')' | |
| 'key' '(' Literal ',' Literal ')' | ||||
[4] | RelativePathPattern | ::= | StepPattern | |
| RelativePathPattern '/' StepPattern | ||||
| RelativePathPattern '//' StepPattern | ||||
[5] | StepPattern | ::= | ChildOrAttributeAxisSpecifierNodeTestPredicate* | |
[6] | ChildOrAttributeAxisSpecifier | ::= | AbbreviatedAxisSpecifier | |
| ('child' | 'attribute') '::' |
Un motif est conçu pour concorder avec un noeud si et seulement s'il existe un contexte tel que lorsque le motif est évalué comme une expression dans ce contexte, le noeud appartient à l'ensemble de noeuds résultat. Lorsqu'une correspondance est en train d'être établie pour un noeud, les contextes possibles ont un noeud contextuel qui est le noeud en train d'être mis en correspondance ou un de ses ancêtres, et une liste de noeuds contextuels réduite au seul noeud contextuel.
Par exemple, p
concorde avec n'importe quel élément
p
, parce que pour tout p
, si l'expression p
est évaluée dans le contexte de son élément parent,
alors cet élément p
appartiendra à l'ensemble
des noeuds résultat.
NOTE : Cela correspond même à un élément p qui serait l'élément document puisque la racine du document est le parent de l'élément document.
Bien que la sémantique des motifs soit indirectement spécifiée en terme d'évaluation d'expressions, il est facile de comprendre directement la signification des motifs sans devoir les considérer comme des évaluations d'expression. Dans un motif, | indique les alternatives; un motif avec un ou plusieurs | séparant différentes alternatives concorde si l'une des alternatives concorde. La correspondance pour un motif composé d'une séquence d'étapes (StepPatterns) séparés par / ou // est faite de droite vers la gauche. La concordance du motif ne se produit que si l'étape la plus à droite concorde et qu'un élément approprié concorde avec le reste du motif; si le séparateur est / alors seul le parent est un élément approprié; si le séparateur est //, alors tout élément ancêtre peut être un élément approprié. Une séquence d'étape (StepPatterns) qui utilise l'axe fils concorde si le test de noeud (NodeTest) est vrai pour le noeud et si le noeud n'est pas un noeud d'attribut. Une séquence d'étapes (StepPattern) qui utilise l'axe des attributs concorde si le test de noeud (NodeTest) est vrai pour le noeud et si le noeud est un noeud attribut. Si [] est présent, alors la première expression du prédicat (PredicateExpr) dans une séquence d'étapes (StepPattern est évalué en considérant que le noeud pour lequel une concordance est en train d'être établie est le noeud contextuel et que ses suivants correspondant au test de noeud (NodeTest) forment la liste des noeuds contextuels, à moins que le noeud en train d'être recherché ne soit un noeud d'attribut, auquel cas, la liste des noeuds contextuels correspond à tous les attributs ayant le même parent que l'attribut en train d'être recherché et qui concorde avec le test de nom (NameTest).
Par exemple :
appendix//ulist/item[position()=1]
correspond à un noeud si et seulement si tout ce qui suit est vrai:
le test de noeud (NodeTest) item est vrai pour le noeud et le noeud n'est pas un attribut; en d'autres termes, le noeud est un élément item
L'évaluation du prédicat (PredicateExpr)
position()=1
est vraie en considérant le noeud comme noeud
contextuel et les suivants du noeud (qui sont des éléments item
)
comme liste de noeuds contextuels
Le noeud a un parent
qui concorde avec le motif appendix//ulist
; Ceci est vrai si le
parent est un élément ulist
dont un des ancêtres
est l'élément appendix
.
<!--Catégorie
: élément de haut niveau -->
<xsl:template
match = pattern
name = qname
priority =
number
mode = qname>
<!-- Contenu
: (xsl:param*,
template)-->
</xsl:template>
Une règle modèle est spécifiée en utilisant l'élément
xsl:template. L'attribut match
est un motif (Pattern)
qui identifie le noeud source ou les noeuds pour lesquels la règle s'applique.
L'attribut match
est exigé à moins que l'élément
xsl:template ait un attribut name
(voir [6
Modèles nommés]). Si la valeur de l'attribut match
contient une expression de type VariableReference
c'est une erreur. Le contenu de l'élément xsl:template est le
modèle qui est instancié lorsque la règle modèle
est appliquée.
Par exemple, un document XML peut contenir:
This is an <emph>important</emph> point.
La règle modèle suivante concorde avec les éléments
emph
et produit un objet de formatage fo:inline-sequence
avec la propriété font-weight
valant bold
.
<xsl:template match="emph">
<fo:inline-sequence font-weight="bold">
<xsl:apply-templates/>
</fo:inline-sequence>
</xsl:template>
NOTE : Les exemples de ce document utilisent le préfixe
fo:
pour l'espace de noms http://www.w3.org/1999/XSL/Format
qui est l'espace de noms des objets de formatage défini dans [XSL].
Comme décrit dans ce qui suit, l'élément xsl:apply-templates
traite d'une manière récursive les fils de l'élément
source.
<!--Catégorie
: instruction -->
<xsl:apply-templates
select = node-set-expression
mode = qname>
<!-- Contenu
: (xsl:sort | xsl:with-param)*-->
</xsl:apply-templates>
L'exemple suivant crée un bloc pour l'élément chapter
et traite ses fils directs.
<xsl:template match="chapter">
<fo:block>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
En l'absence de l'attribut select
, l'instruction
xsl:apply-templates
traite tous les fils du noeud courant, y compris les noeuds textuels. Cependant,
tous les noeuds textuels supprimés conformément à[3.4
Suppression des espaces blancs] ne sont pas traités. Si
la suppression des espaces blancs est désactivée pour un
élément, alors tous les espaces blancs du contenu de cet
élément sont traités comme du texte; et ainsi, les
espaces blancs entre les éléments fils compteront pour déterminer
la position d'un élément fils comme le retourne la fonction
position.
Un attribut select
peut être utilisé
pour traiter les noeuds sélectionnés par une expression au
lieu de traiter tous les éléments. La valeur de l'attribut
select est une expression. L'expression
doit retourner un ensemble de noeuds. L'ensemble des noeuds sélectionnés
est traité dans l'ordre du document, à moins qu'une spécification
d'ordonnancement ne soit présente (voir
[10
Ordonnancement]).
L'exemple suivant traite tous les fils author
de author-group
:
<xsl:template match="author-group">
<fo:inline-sequence>
<xsl:apply-templates
select="author"/>
</fo:inline-sequence>
</xsl:template>
L'exemple suivant traite tous les éléments given-name
des éléments authors
, eux-mêmes étant
des fils de author-group
:
<xsl:template match="author-group">
<fo:inline-sequence>
<xsl:apply-templates
select="author/given-name"/>
</fo:inline-sequence>
</xsl:template>
Cet exemple traite tous les éléments heading
descendant
de l'éléments book
.
<xsl:template match="book">
<fo:block>
<xsl:apply-templates
select=".//heading"/>
</fo:block>
</xsl:template>
Il est aussi possible de traiter des éléments qui ne soient pas
des descendants du noeud courant. Dans cet exemple, on suppose qu'un élément
department
a des enfants group
et des descendants
employee
. Il trouve le service (department
)
d'un employé (employee
) puis les enfants group
du service (department
).
<xsl:template match="employee">
<fo:block>
Employee <xsl:apply-templates select="name"/>
belongs to group
<xsl:apply-templates select="ancestor::department/group"/>
</fo:block>
</xsl:template>
Plusieurs éléments xsl:apply-templates
peuvent
être utilisés dans un seul modèle pour faire des
réordonnancements simples. L'exemple suivant crée deux tables
HTML. La première table est remplie avec les ventes
intérieures
et la deuxième avec les ventes à l'exportation.
<xsl:template match="product">
<table>
<xsl:apply-templates
select="sales/domestic"/>
</table>
<table>
<xsl:apply-templates
select="sales/foreign"/>
</table>
</xsl:template>
NOTE : A ce stade, il est possible d'avoir deux descendants qui concordent dont l'un est descendant de l'autre. Ce cas n'est pas traité d'une manière spécifique; les deux descendants seront traités comme d'habitude. Par exemple, pour le document source :
<doc><div><div></div></div></doc>
la règle
<xsl:template match="doc">
<xsl:apply-templates select=".//div"/>
</xsl:template>
traite aussi bien les éléments externes à div
que les éléments interne à div
.
NOTE : Typiquement,
xsl:apply-templates
est utilisé pour traiter uniquement les noeuds qui sont des descendants
du noeud courant. Une telle utilisation de xsl:apply-templates
ne peut engendrer une boucle de traitement infinie. Cependant, lorsque
xsl:apply-templates
est utilisé pour traiter les éléments qui ne sont
pas des descendants du noeud courant, il y a une possibilité de
boucle infinie. Par exemple :
<xsl:template match="foo">
<xsl:apply-templates select="."/>
</xsl:template>
Les outils peuvent, dans certains cas, être capables de détecter de pareilles boucles, mais la possibilité qu'une feuille de styles entre dans une boucle infinie sans que le programme ne la détecte persiste.
Il est possible qu'un noeud source concorde avec plusieurs règles modèle. La règle à utiliser est déterminée de la manière suivante:
Premièrement, toutes les règles concordantes ayant une préséance d'import plus faible que la règle considérée ou que celles qui ont la préséance d'import plus forte sont éliminées.
Ensuite, toutes les règles ayant une plus faible priorité
que la règle considérée ou que les règles ayant
la priorité la plus forte sont éliminées. La priorité
d'une règle modèle est spécifiée par l'attribut
priority
de la règle. Sa valeur doit être un nombre
réel (négatif ou positif), conforme à la règle de
production Number avec un
signe moins (-) optionnel au début du nombre. La
priorité par défaut est calculée comme suit :
Si le motif contient plusieurs alternatives séparées par |, alors il est traité comme si c'était un ensemble de règles modèle, une pour chaque alternative.
Si le motif a la forme d'un nom qualifié (QName) précédé par un ChildOrAttributeAxisSpecifier ou a la forme d'une instruction de traitement processing-instruction(Literal) précédé par un ChildOrAttributeAxisSpecifier, alors la priorité est 0.
Si le motif a la forme d'un nom sans deux points (NCName):* précédé d'un ChildOrAttributeAxisSpecifier, alors la priorité est -0.25.
Autrement, si le pattern consiste uniquement en un test de noeud NodeTest précédé par un ChildOrAttributeAxisSpecifier, alors la priorité est -0.5.
Sinon, la priorité est 0.5.
Ainsi le plus commun des types de motifs (un motif qui teste un type particulier de noeuds avec un nom étendu particulier) a une priorité 0. Ensuite, le type de motif le moins spécifique (un motif qui teste un type particulier de noeuds et un nom étendu avec une URI particulière indiquant son espace de noms) a une priorité de -0.25. Les motifs les moins spécifiques (motifs permettant de tester un type particulier de noeuds) ont une priorité de -0.5. Les motifs les plus spécifiques que le motif le plus commun ont une priorité de 0.5.
Si après vérification des conditions ci-dessus il reste plus qu'une seule règle modèle qui concorde alors il y a une erreur. Un processeur XSLT peut signaler l'erreur; s'il ne le fait pas, il doit la rattraper en choisissant, parmi les règles concordantes restantes, celle qui arrive en dernière dans la feuille de styles.
<!--
Catégorie : instruction -->
<xsl:apply-imports />
Une règle modèle en train d'être utilisée pour passer
outre une règle modèle dans une feuille de styles importée
(voir [5.5 Résolution de conflits des règles
modèle]) peut utiliser l'élément xsl:apply-imports
pour invoquer la règle outrepassée.
A chaque étape du traitement
de la feuille de styles correspond une règle modèle courante.
Dès qu'une règle est retenue par un motif de concordance, elle
devient la règle modèle courante pour l'instanciation de la règle
modèle. Lorsqu'un élément xsl:for-each
est
instancié, la règle courante devient nulle pour l'instanciation
du contenu de l'élément xsl:for-each
.
xsl:apply-imports
traite le noeud courant en utilisant uniquement
les règles modèle qui étaient importées dans l'élément
de la feuille de styles contenant la règle modèle courante; le
noeud est traité dans le mode de la règle modèle courante.
Si xsl:apply-imports
est instancié alors que la règle
modèle courante est nulle alors c'est une erreur.
Par exemple, supposons que la feuille de styles doc.xsl
contienne
une règle modèle pour les éléments example
:
<xsl:template match="example">
<pre><xsl:apply-templates/></pre>
</xsl:template>
Une autre feuille de styles pourrait importer doc.xsl et modifier le traitement
des éléments example
de la manière suivante:
<xsl:import href="doc.xsl"/>
<xsl:template match="example">
<div style="border: solid red">
<xsl:apply-imports/>
</div>
</xsl:template>
L'effet combiné transformerait un élément example
dans un élément de la forme :
<div style="border: solid red"><pre>...</pre></div>
Les modes permettent à un élément d'être traité plusieurs fois, en produisant un résultat différent à chaque fois.
Les éléments xsl:template
et xsl:apply-templates
ont tous les deux l'attribut optionnel
mode
. La valeur de l'attribut
mode
est un nom
qualifié (QName),
pouvant être développé comme décrit dans [2.4
Noms qualifiés ]. Si xsl:template n'a pas d'attribut
match
,
il ne doit pas avoir non plus un attribut
mode. Si un élément
xsl:apply-templates
a un attribut mode
, alors il s'applique uniquement aux règles
modèle des éléments xsl:template ayant un
attribut mode
avec la même valeur; si un élément
xsl:apply-templates
n'a pas d'attribut mode
, alors il ne s'applique qu'aux règles
modèle des éléments
xsl:template qui n'ont
pas d'attribut
mode.
Il existe une règle modèle interne permettant à un traitement récursif de continuer même en cas de non-concordance de motif par une règle modèle explicite de la feuille de styles. Cette règle modèle s'applique aussi bien aux noeuds d'éléments qu'au noeud racine. Ce qui suit montre ce qui équivaut à cette règle interne :
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
Il existe aussi une règle modèle interne pour chaque mode, permettant à un traitement récursif de continuer dans le même mode en cas d'absence d'une correspondance de motif avec une règle modèle explicite delta feuille de styles. Cette règle modèle s'applique tant aux noeuds d'éléments qu'au noeud racine. Ce qui suit montre ce qui équivaut à cette règle modèle interne pour un mode m.
<xsl:template match="*|/" mode="m">
<xsl:apply-templates mode="m"/>
</xsl:template>
Il existe aussi une règle modèle interne pour les noeuds textuels et les noeuds d'attribut qui sert à en recopier le texte :
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
La règle modèle interne pour le traitement des instructions et des commentaires ne fait rien.
<xsl:template match="processing-instruction()|comment()"/>
La règle modèle interne pour les noeuds d'espaces de noms ne fait rien non plus. Il n'existe aucun motif pouvant concorder avec un noeud d'espace de noms; dans ce cas, la règle modèle interne est la seule règle modèle appliquée aux noeuds d'espace de noms.
Les règles modèle internes sont traitées comme si elles étaient importées implicitement avant la feuille de styles et, par conséquent, ont une préséance d'import plus faible que toutes les autres règles modèle. Ainsi, l'auteur peut remplacer une règle modèle interne en écrivant explicitement une règle modèle.
<!--Catégorie
: instruction -->
<xsl:call-template
name = qname>
<!-- Contenu : xsl:with-param*-->
</xsl:call-template>
Les modèles peuvent être invoqués par leur nom. L'utilisation
de l'attribut name
de l'élément xsl:template
permet de spécifier un nom de modèle. La valeur de l'attribut
name
est un nom
qualifié (QName),
qui est développé tel que décrit au chapitre [2.4
Noms qualifiés]. Quand l'élément xsl:template
est qualifié par l'attribut name
, il peut, sans que cela
soit obligatoire, avoir également un attribut match
. L'élément
xsl:call-template
permet d'appeler un modèle par son nom;
il a un attribut obligatoire name qui identifie le modèle à appeler.
Au contraire de l'élément xsl:apply-templates
, xsl:call-template
ne modifie pas le noeud courant ou la liste courante de noeuds.
Les attributs match
, mode
et priority
d'un élément xsl:template
n'ont pas d'effet si le
modèle est invoqué par un élément xsl:call-template
.
De même, l'attribut name
d'un élément xsl:template
n'a pas d'effet si le modèle est invoqué par un élément
xsl:apply-templates
.
Une erreur est produite si une même feuille
de styles contient plus d'un modèle ayant à la fois le même
nom et la même préséance
d'import.
Cette section décrit les instructions qui créent directement des noeuds dans l'arbre résultant.
Dans un modèle, un élément d'une feuille de style qui n'appartient pas à l'espace de noms XSLT et n'est pas un élément extension (voir [14.1 Eléments extension]) est instancié pour créer un noeud élément avec le même nom étendu. le contenu de l'élément est un template qui est instancié pour donner le contenu de l'élément noeud créé. L'élément noeud créé aura les noeuds attributs qui étaient présents sur le noeud élément dans l'arbre de la feuille de style, plutôt que les attributs avec les noms dans l'espace de noms XSLT.
Le noeud élément créé aura aussi une copie de l'espace
de noms des noeuds qui étaient présents sur l'élément
noeuds dans la feuille de style avec l'exception que tout espace de noms dont
la valeur textuelle est l'espace de noms XSLT URI (http://www.w3.org/1999/XSL/Transform),un
nom d'espace URI déclaré a une extension d'espace de noms (voir
[14.1 Éléments extension]) ou
un espace de noms URI désigné comme un espace de noms exclu. Un
espace de noms URI est désigné comme un espace de noms exclu en
utilisant un attribut exclude-result-prefixes
sur un élément
xsl:stylesheet
ou un attribut xsl:exclude-result-prefixes
sur un élément résultat littéral. La valeur de ces
deux attributs est une liste de préfixes d'espace de noms séparés
par un espace blanc. L'espace de nom relié à chacun des préfixes
est désigné comme un espace de noms exclu. C'est une erreur s'il
n'y a pas d'espace de noms relié au préfixe sur un élément
supportant l'attribut exclude-result-prefixes
ou xsl:exclude-result-prefixes
.
L'espace de noms par défaut (comme déclaré par xmlns
)
peut-être désigné comme un espace de noms exclu en incluant
#default
dans la liste des préfixes d'espace de noms. La
désignation d'un espace de noms comme par exemple un espace de noms exclu
est effectif dans un sous arbre de la feuille de style relié à
l'élément supportant l'attribut exclude-result-prefixes
ou xsl:exclude-result-prefixes
; un sous arbre relié à
un élément xsl:stylesheet
n'inclue pas toutes les
feuilles de style importées ou inclues par les enfants de cet élément.
NOTE: Quand une feuille de style utilise une déclaration
d'espace de noms seulement dans le but d'adresser un arbre source, en spécifiant
le préfixe dans l'attribut exclude-result-prefixes
, cela
n'empêche pas les déclarations superflues d'espaces de noms dans
l'arbre résultant.
La valeur d'un attribut d'un élément résultat littéral
est interprétée comme la
valeur de l'attribut template
: il peut contenir des expressions
contenues entre accolades ({}).
Un espace de noms URI dans l'arbre d'une feuille de style est utilisé pour spécifier un espace de noms URI dans l'arbre résultant est appelé espace de noms URI littéral. Cela s'applique à:
l'espace de noms URI est un nom étendu d'un élément résultat littéral dans la feuille de style
l'espace de noms URI dans le nom étendu d'un attribut spécifié dans un élément résultat littéral dans la feuille de style
la valeur textuelle d'un noeud d'espace de noms sur un élément résultat littéral d'une feuille de style
<!--
Category: top-level-element -->
<xsl:namespace-alias
stylesheet-prefix = prefix | "#default"
result-prefix = prefix | "#default" />
Une feuille de style peut utiliser l'élément
xsl:namespace-alias
pour déclarer qu'un espace de noms URI
est un alias pour un autre espace de noms URI. Quand un espace
de noms URI littéral a été déclaré comme
étant un alias pour un autre espace de noms URI, alors l'espace de noms
URI dans l'arbre résultat sera l'espace de noms que l'espace de noms
littéral URI est son alias, au lieu de l'espace de noms URI littéral
lui-même. L'élément xsl:namespace-alias
déclare
que l'espace de noms relié au préfixe spécifié par
l'attribut stylesheet-prefix
est un alias pour l'espace de noms
URI relié au préfixe spécifié par l'attribut result-prefix
.
Donc, l'attribut stylesheet-prefix
spécifie l'espace
de noms URI qui apparaîtra dans la feuille de style, et l'attribut result-prefix
spécifie l'espace de noms URI correspondant qui apparaîtra dans
l'arbre résultant. L'espace de noms par défaut (comme déclaré
par xmlns) peut-être spécifié en utilisant #default
au lieu d'un préfixe. Si un espace de noms URI est déclaré
être un alias pour plusieurs espaces de noms URIs différents, alors
la déclaration avec la plus haute précédence
d'importation est utilisée. C'est une erreur s'il y a plus d'une
déclaration de ce type. Un processeur XSLT peut signaler une erreur,
s'il ne provoque pas d'erreur, il faut récupérer en choisissant,
parmi les déclarations ayant l'importation de la plus haute préséance,
celle de la dernière feuille de style.
Quand des éléments résultats littéral sont utilisés pour créer un élément, un attribut ou un noeud d'espace de noms déjà utilisé par l'espace de noms de l'URI de XSLT, la feuille de style doit être un alias. Par exemple, la feuille de style :
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias">
<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>
<xsl:template match="/">
<axsl:stylesheet>
<xsl:apply-templates/>
</axsl:stylesheet>
</xsl:template>
<xsl:template match="block">
<axsl:template match="{.}">
<fo:block><axsl:apply-templates/></fo:block>
</axsl:template>
</xsl:template>
</xsl:stylesheet>
génèrera une feuille de style XSLT à partir d'un document de la forme :
<elements>
<block>p</block>
<block>h1</block>
<block>h2</block>
<block>h3</block>
<block>h4</block>
</elements>
NOTE: Il peut être aussi nécessaire d'utiliser des alias pour les espaces de noms plutôt que les espaces de noms XSLT URI. Par exemple, les éléments résultats littéraux appartenant à un espace de noms qui comportent des signatures digitales peuvent faire qu'une feuille de style XSLT soit mal comprise par un programme sécuritaire, en utilisant un alias pour l'espace de noms l'on peut éviter une telle confusion.
xsl:element
<!-- Category: instruction
-->
<xsl:element
name = { qname }
namespace = { uri-reference }
use-attribute-sets = qnames>
<!-- Content: template -->
</xsl:element>
L'élément xsl:element
permet la création
d'un élément ayant un nom calculé. Le nom
étendu de l'élément à créer est spécifié
par l'attribut obligatoire name
et un attribut optionnel namespace
.
Le contenu de l'élément xsl:element
est le modèle
des attributs et enfants de l'élément créé.
L'attribut name
est interprété comme une
valeur d'attribut modèle. C'est une erreur si la chaîne résultant
de l'instanciation de la valeur de l'attribut modèle n'est pas un QName.
Un processeur XSLT peut signaler l'erreur, s'il ne le fait pas, alors il doit
la rattraper en faisant que le résultat de l'instanciation de l'élément
xsl:element
soit la séquence de noeuds créée
en instanciant le contenu de l'élément xsl:element
,
excluant tout noeud attribut initial. Si l'attribut de l'espace de noms n'est
pas présent, alors le QName
est étendu en nom étendu en utilisant les déclarations
des espaces de noms en cours pour l'élément xsl:element
,
incluant toute déclaration d'espace de noms par défaut.
Si l'attribut namespace
est présent, alors il est interprété
comme valeur d'attribut modèle.
La chaîne de caractères résultant de l'instanciation de
la valeur d'attribut modèle devrait être une référence
URI. Ce n'est pas une erreur si la chaîne n'est pas syntaxiquement une
référence URI correcte. Si la chaîne est vide, alors le
nom étendu de l'élément à un espace de noms URI
nul. Sinon, la chaîne est utilisée comme un espace de noms URI
du nom étendu de l'élément créé. La partie
locale du QName
spécifiée par l'attribut name
est utilisée
comme partie locale au nom étendu de l'élément créé.
Les processeurs XSLT peuvent utiliser le préfixe du QName
spécifié dans l'attribut name
au moment de choisir
le préfixe utilisé pour produire l'élément créé
comme XML ; toutefois, ils ne sont pas obligé de le faire.
xsl:attribute
<!--
Category: instruction -->
<xsl:attribute
name = { qname }
namespace = { uri-reference }>
<!-- Content: template -->
</xsl:attribute>
L'élément xsl:attribute
peut être utilisé
pour ajouter des attributs aux éléments résultats qui sont
créés soit par un élément résultat littéral
dans la feuille de style soit par des instructions telles que xsl:element
.
Le nom étendu
de l'attribut à créer est spécifié par l'attribut
obligatoire name
et un attribut optionnel namespace
. Instancier un élément xsl:attribute
ajoute un noeud
attribut à l'élément noeud résultat. le contenu
de l'élément xsl:attribute
est un modèle de
la valeur de l'attribut créé.
l'attribut name
est interprété comme une valeur
d'attribut modèle. C'est une erreur si la chaîne résultante
de l'intanciation de la valeur de l'attribut modèle n'est pas un QName
ou est la chaîne xmlns
. Un processeur XSLT peut provoquer
une erreur, s'il ne le fait pas, il faut la rattraper en n'ajoutant pas l'attribut
à l'arbre résultant. Si l'attribut de l'espace de noms n'est pas
présent, alors le QName
est éténdu en un nom étendu en utilisant les déclarations
d'un espace de noms en cours pour l'élément xsl:attribute
,
n' incluant aucune déclaration d'espace de noms par défaut.
Si l'attribut namespace
est présent, alors il est
aussi interprété comme une valeur
d'attribut modèle. La chaîne résultante de l'intanciation
devrait être une référence URI. Ce n'est pasune erreur si
la chaîne n'est pas une référence URI syntaxiquement correcte.
Si c'est une chaîne vide, alors le nom étendu de l'attribut à
créer a une URI d'espace de noms nulle. Sinon, la chaîne de caractères
est utilisée comme URI espace de noms du nom étendu de l'attribut
à créer. La partie locale de QName
specifiée par l'attribut name
est utilisée comme
partie locale du nom étendu de l'attribut à créer.
Les processeurs XSLT peuvent utilser le préfixe du QName
specifié dans l'attribut name
au moment de choisir le préfixe
utilisé pour produire l'attribut créer en XML ; par contre, ils
ne sont pas obligés de le faire et, si le préfix est xmlns
,
ils ne faut pas le faire. Par conséquent, ce n'est pas une erreur que
d'écrire :
<xsl:attribute name="xmlns:xsl" namespace="whatever">http://www.w3.org/1999/XSL/Transform</xsl:attribute>
le résultat ne sera pas la déclaration d'un espace de noms.
En ajoutant un attribut à un élément remplace l'attribut existant de cet élément avec le même nom étendu.
Les opération suivantes sont des erreurs:
xsl:attribute
; les implémentations
peuvent signaler l'erreur ou ignorer l'attribut.NOTE: Quand un xsl:attribute
contient un noeud de texte avec un saut de ligne, alors la sortie XML doit contenir
une référence de caractère. Par exemple,
<xsl:attribute name="a">x
y</xsl:attribute>
donnera comme résultat :
a="x
y"
(ou tout autre référence de caractère équivalente). La sortie XML peut être
a="x
y"
C'est parceque XML 1.0 demande que les retours à la ligne dans les valeurs d'attributs soient traités comme des espaces, mais ne l'exige pas des références de caractère de retour à la ligne. Les valeurs d'attributs du modèle de données représentent la valeur de l'attribut après normalisation. Si un retour à la ligne se trouvant dans une valeur d'attribut de l'arbre était sorti comme un caractère de retour à la ligne plutôt que comme une référence de caractère, alors la valeur de l'attribut dans l'arbre créé en reparsant le fichier XML contiendrait un espace et nom un saut de ligne, ce qui signifirait que l'arbre n'a pas été produit correctement.
<!--
Category: top-level-element -->
<xsl:attribute-set
name = qname
use-attribute-sets = qnames>
<!-- Content: xsl:attribute*
-->
</xsl:attribute-set>
L'élément xsl:attribute-set
défini un ensemble
d'attributs nommés.L'attribut name spécifie le nom de l'ensemble
d'attributs. La valeur de l'attribut name est un QName,
qui est expansé comme décrit dans [2.4
Noms qualifiés]. Le contenu de l'élément xsl:attribute-set
consiste en zéro ou plus éléments xsl:attribute
spécifiant les attributs de l'ensemble.
Les ensembles d'attributs sont utilisés en spécifiant un attribut
use-attribute-sets
sur les éléments xsl:element,
xsl:copy
(voir [7.5 Copier]) ou xsl:attribute-set
.
La valeur de l'attribut use-attribute-sets
est une liste de noms
d'ensemble d'attributs séparés par des espaces. Chaque nom est
spécifié comme étant un QName,
lequel s'expand comme décrit dans [2.4 Noms qualifiés].
Spécifier un attribut use-attribute-sets
est équivalent
à ajouter des éléments xsl:attribute
à
chaque attribut de chacun des ensembles d'attributs nommés au début
du contenu de l'élément ayant l'attribut use-attribute-sets
,
dans le même ordre que celui avec lequel les noms des ensembles d'attributs
sont spécifiés dans l'attribut use-attribute-sets
.
C'est une erreur si l'utilisation des attributs use-attribute-sets
avec des éléments xsl:attribute-set
fait qu'un ensemble
d'attribut s'utilise lui-même directement ou indirectement.
Les ensembles d'attributs peuvent être utilisés en spécifiant
l'attribut xsl:use-attribute-sets
dans un élément
résultat littéral. La valeur de l'attribut xsl:use-attribute-sets
est une liste de noms d'ensembles d'attributs séparés par un espace.
L'attribut xsl:use-attribute-sets
a le même effet que l'attribut
use-attribute-sets
de xsl:element
mais avec une règle
supplémentaire qui spécifie que les attribues de l'élément
résultat littéral lui-même sont traités comme s'ils
étaient spécifiés par des éléments xsl:attribute
avant tout élément xsl:attribute
courant mais après
tout élément xsl:attribute
induit par l'attribut
xsl:use-attribute-sets
. Alors, pour un élément résulat
littéral, les attributs d'un ensemble d'attributs nommé dans un
attribut xsl:use-attribute-sets
sera ajouté en premier,
dans l'odre listé dans l'attribut ; puis, les attributs spécifiés
sur un élément résutat littéral seront ajoutés
; finalement, tout attribut spécifié par l'élément
xsl:attribute
seront ajoutés. Puisque le fait de
rajouter un attribut à un élément provoque le remplacement
de tout attribut de même nom déjà existant sur l'élément,
cela signifie que les attributs spécifiés dans les ensembles d'attributs
peuvent être écrasés par les attributs spécifiés
sur l'élément résultat littéral lui-même.
Le modèle contenu à l'intérieur de chaque élément
xsl:attribute
d'un élément xsl:attribute-set
est instancié chaque fois que l'ensemble d'attributs est utilisé
; Il est instancié en utilisant le même noeud courrant et la même
liste de moeuds qui ceux utilisés pour instancier un élément
supportant l'attribut use-attribute-sets
ou xsl:use-attribute-sets
.
Cependant, c'est la position dans la feuille de style de l'élément
xsl:attribute
plutôt que l'élément supportant
l'attribut use-attribute-sets
ou xsl:use-attribute-sets
qui détermine quelles sont les associations de variables visibles (voir
[11 Variables et paramètres]); Donc, seuls les
variables et paramètres déclarés par les éléments
top-level xsl:variable
et xsl:param
sont visibles
L'exemple suivant crée un ensemble d'attributs title-style
et l'utilise dans une règle modèle.
<xsl:template match="chapter/heading">
<fo:block quadding="start" xsl:use-attribute-sets="title-style">
<xsl:apply-templates/>
</fo:block>
</xsl:template>
<xsl:attribute-set name="title-style">
<xsl:attribute
name="font-size">12pt</xsl:attribute>
<xsl:attribute name="font-weight">bold</xsl:attribute>
</xsl:attribute-set>
Des définitions multiples d'un ensemble d'attributs ayant le même nom étendu sont fusionnées. Un attribut d'une définition qui possède une préséance d'import plus élevée passe avant l'attribut d'une définition qui en aurait une plus faible. C'est une erreur quand il y a deux ensembles d'attributs ayant un même nom étendu et une même préséance d'import et que les deux contiennent le même attribut, à moins que ne soit précisé une définition de l'ensemble d'attribut qui confère à l'un d'eux une plus haute préséance d'import Un processeur XSLT peut signaler l'erreur, si il ne le fait pas, il doit rattraper l'erreur en choisissant parmi les définittions qui spécifient l'attribut que celle qui a la plus haute préséance d'import est la dernière à avoir été spécifiée dans la feuille de style. L'emplacement où les attributs d'un ensemble d'attributs sont spécifiés est significatif uniquement en fusionnant les attributs dans un ensemble d'attributs ; cela ne fait aucune différence de savoir quand l'ensemble d'attributs est utilisé .
Un modèle peut aussi contenir des noeuds textuels. Chaque noeud textuel du modèle restant après que les espaces blancs aient été filtrés conformément à ce qui est spécifié au chapitre [3.4 Suppression d'espaces] créera un noeud textuel de même valeur textuelle dans l'arbre résultant. Les noeuds textuels adjacents d'un arbre résultat seront automatiquement fusionnés.
Noter que le texte est traité au niveau de l'arbre. Donc, le balisage
de <
dans le modèle sera représenté
dans l'arbre de la feuille de style par un noeud textuel incluant le caractère
<. Cela créera un noeud textuel dans l'arbre résultat qui contiendra
<, lequel sera représenté par l'entité <
(ou une référence de caractère équivalente) quand
l'arbre résultat est mis sous la forme d'un document XML (à moins
que la méthode de sortie XML soit désactivée comme décrit
dans [16.4 Désactivation de la production
littérale des caractères en sortie]).
<!-- Category:
instruction -->
<xsl:text
disable-output-escaping = "yes" | "no">
<!-- Content: #PCDATA -->
</xsl:text>
Les caractères de données littérales peuvent être
enveloppés dans un élément xsl:text
. L'enveloppement
des ces caractères peut changer la façon dont est géré
le filtrage des caractères d'espacement (voir [3.4 Suppression
d'espaces]) mais n'affecte pas la façon dont sont gérés
les caractères par le processeur XSLT après cela.
NOTE: Les attributs xml:lang
et xml:space
ne sont pas traités de manière particulière par XSLT. En
particulier, il est de la reponsabilité de l'auteur de la feuille de
style que de mettre tous les attributs xml:lang
ou xml:space
nécessaires dans le résultat; spécifier un attribut
xml:lang
ou xml:space
sur un élément
de l'espace de noms XSLT ne provoquera pas l'affichage des ces attributs.
<!--
Category: instruction -->
<xsl:processing-instruction
name = { ncname }>
<!-- Content: template -->
</xsl:processing-instruction>
L'élément xsl:processing-instruction
sert à
créer un noeud instruction de traitement . Le contenu de l'élément
xsl:processing-instruction
sert de modèle pour la valeur
textuelle du noeud intruction de traitement. L'élément xsl:processing-instruction
possède un attribut obligatoire name
qui spécifie
le nom du noeud instruction de traitement. La valeur de l'attribut name
est interprétée comme une valeur
d'attribut modèle.
Par exemple;
<xsl:processing-instruction name="xml-stylesheet">href="book.css" type="text/css"</xsl:processing-instruction>
créera l'instruction de traitement
<?xml-stylesheet href="book.css" type="text/css"?>
Ce n'est pas une erreur quand le résultat de l'intanciation n'est ni un NCName ni un PITarget. Un processeur XSLT peut signaler l'erreur ; si il ne le fait pas, il doit la rattraper en supprimant l'instruction de traitement de l'arbre résultant.
NOTE: Cela signifie que l'élément
xsl:processing-instruction
ne peut pas être utilisé
pour produire une déclaration XML. L'élément xsl:output
devra être utilisé à la place (voir [16
Sorties]).
C'est une erreur quand l'intanciation du contenu de xsl:processing-instruction
crée un noeud autre qu'un noeud textuel. Un processeur XSLT peut signaler
l'erreur mais si il ne le fait pas, il doit ignorer les noeuds posant problème
ainsi que leur contenu.
C'est une erreur si l'intanciation du contenu de xsl:processing-instruction
contient la chaîne ?>
. Un processeur XSLT peut signaler
l'erreur ; si il ne le fait pas, il doit rattraper l'erreur en insérant
un espace après toute occurence de ?
qui est suivie par
un >
.
<!-- Category:
instruction -->
<xsl:comment>
<!-- Content: template -->
</xsl:comment>
L'élément commentaire xsl:comment
sert à
créer un noeud commentaire dans l'abre résultant. Le contenu de
l'élément xsl:comment
sert de modèle pour
la valeur textuelle du noeud commentaire.
Par exemple :
<xsl:comment>This file is automatically generated. Do not edit!</xsl:comment>
Créera ce commentaire :
<!--This file is automatically generated. Do not edit!-->
C'est une erreur si l'instanciation du contenu de xsl:comment
crée des noeuds autres que des noeuds textuels. Un processeur XSLT
peut signaler l'erreur, si'l ne le fait pas, il doit la rattraper en ignorant
le noeud posant problème ainsi que son contenu.
C'est une erreur si le contenu résultant de l'instanciation de xsl:comment
contient la chaîne --
ou si elle finit par -
.
Un processeur XSLT peut signaler l'erreur ; si il ne le fait pas, il doit rattraper
l'erreur en insérant un espace après toute occurence de -
suivie d'un autre carcatère -
ou qui se trouve être
à la fin du commmentaire.
<!-- Catégorie
: instruction -->
<xsl:copy
use-attribute-sets = qnames>
<!-- Content: template
-->
</xsl:copy>
L'élément xsl:copy
fournit un moyen simple pour
copier le noeud courant. L'instanciation de l'élément xsl:copy
crée une copie du noeud courant. Les noeuds espace de noms du noeud courant
sont également copiés automatiquement, mais les attributs et les
enfants du noeud ne sont pas copiés automatiquement. Le contenu de l'élément
xsl:copy
est le modèle des attributs et enfants à
créer sur le noeud résultant ; le contenu est instancié
uniquement pour les noeuds dont le type leur permet d'avoir des attributs ou
des enfants (par exmple les noeuds racines et les noeuds d'éléments).
L'élément xsl:copy
peut recevoir l'attribut use-attribute-sets
(voir [7.1.4 Les ensembles d'attributs nommés]).
Cela n'est utilisé que pour la copie de noeuds éléments.
Le noeud racine est un cas particulier parce que le noeud racine de l'arbre
résultat est créé implicitement. Quand le noeud courant
est le noeud racine, xsl:copy
ne créera pas un noeud racine,
seul son modèle de contenu sera utilisé.
Par exemple, la transformation identité peut être écrite
en utilisant xsl:copy
comme suit:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Quand le noeud courant est un attribut, c'est une erreur que d'utiliser xsl:attribute
pour créer un attribut du même nom que le noeud courant, il en
est également de même avec xsl:copy
(voir [7.1.3
Créer des attributs avec xsl:attribute
]).
L'exemple suivant montre comment l'attribut xml:lang
peut être
facilement copié de l'arbre source à l'arbre résultat.
Si une feuille de style définit le modèle nommé suivant
:
<xsl:template name="apply-templates-copy-lang">
<xsl:for-each select="@xml:lang">
<xsl:copy/>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:template>
Alors, il est possible d'utiliser simplement :
<xsl:call-template name="apply-templates-copy-lang"/>
au lieu de :
<xsl:apply-templates/>
quand il est nécessaire de copier l'attribut xml:lang
.
A l'intérieur d'un modèle, l'élément xsl:value-of
peut être utilisé pour calculer le texte généré,
par exemple en extrayant du texte de l'arbre source ou en insérant
le contenu d'une variable. L'élément xsl:value-of
permet de faire cela par utilisation d'une expression
spécifiée comme étant la valeur de l'attribut select.
Les expressions peuvent également être utilisées à
l'intérieur de valeurs d'attributs d'éléments résultats
littéraux en entourant l'expression d'accolades ({}).
xsl:value-of
<!--
Catégorie : instruction -->
<xsl:value-of
select = string-expression
disable-output-escaping = "yes" | "no" />
L'élément xsl:value-of
est instancié pour
créer un noeud textuel de l'arbre résultant. L'attribut obligatoire
select
est une expression ; cette
expression est évaluée et l'objet résultant est converti
en une chaîne de caractères comme l'aurait fait la fonction string.
La chaîne de caractères spécifie la valeur textuelle du
noeud textuel créé. Si la chaîne est vide, le noeud textuel
ne sera pas créé. Le noeud textuel créé sera fusionné
avec tout autre noeud textuel adjacent.
L'élément xsl:copy-of
peut être utilisé
pour copier un ensemble de noeuds vers l'arbre résultat sans les convertir
en chaîne. Voir [11.3 Utiliser des valeurs de variables
et de paramètres avec xsl:copy-of
].
Par exemple, les déclarations suivantes créent un paragraphe
HTML à partir de l'élément person
et de ses
attributs given-name
et family-name
. Le paragraphe
contiendra la valeur de l'attribut given-name
du noeud courant
suivie d'un espace et de la valeur de l'attribut family-name
du
noeud courant.
<xsl:template match="person">
<p>
<xsl:value-of select="@given-name"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="@family-name"/>
</p>
</xsl:template>
Dans cet autre exemple, un paragraphe HTML est créé à
partir de l'élément person
et des ses éléments
enfants given-name
et family-name
. Le paragraphe contiendra
la valeur textuelle du premier élément enfant given-name
suivie d'un espace et de la valeur textuelle de l'élément family-name
.
<xsl:template match="person">
<p>
<xsl:value-of select="given-name"/>
<xsl:text> </xsl:text>
<xsl:value-of select="family-name"/>
</p>
</xsl:template>
Le code suivant crée avant chaque élément procedure
un paragraphe contenant le niveau de sécurité de la procédure.
Il garantit que le niveau de sécurité qui s'applique à
une procédure est déterminé par l'attribut security
de l'élément procedure
ou de l'un de ses ancêtres.
Il garantit également que si plus d'un élément a un attribut
security
alors le niveau de sécurité est déterminé
par l'élément qui est le plus près de l'élément
procedure
.
<xsl:template match="procedure">
<fo:block>
<xsl:value-of select="ancestor-or-self::*[@security][1]/@security"/>
</fo:block>
<xsl:apply-templates/>
</xsl:template>
Dans une valeur d'attribut qui est
interprétée comme modèle de valeur d'attribut, comme par
exemple une valeur d'attribut d'un élément résultat, une
expression peut être utilisée à
condition de l'encadrer par des accolades ({}
). Le modèle
de valeur d'attribut est instancié en remplaçant l'expression
et les accolades qui la délimitent par le résultat de l'évaluation
de l'expression et la conversion de ce résultat en chaîne de caractères
à l'identique de la fonction string.
Les accolades ne sont pas reconnues dans une valeur d'attribut d'une feuille
de styles XSLT à moins que l'attribut n'ait été spécialement
déclaré comme étant un modèle de valeur d'attribut
; dans la syntaxe résumée des éléments, la valeur
de tels attributs est présentée entre accolades.
NOTE : Tous les attributs ne sont pas interprétés
comme des modèles. Les attributs dont la valeur est une expression ou
un motif, les attributs d'éléments de haut
niveau et les attributs qui font références à des objets
XSLT nommés ne sont pas interprétés comme des modèles
de valeurs d'attributs. De plus, les attributs xmlns
ne sont pas
interprétés comme des modèles de valeurs d'attributs ;
Il ne serait pas conforme à la Recommandation XML des Espaces de Noms
de le faire.
L'exemple suivant crée un élément résultat img
à partir de l'élément source photograph
;
la valeur de l'attribut src
de l'élément img
est calculée à partir de la valeur de la variable image-dir
et de la valeur textuelle de l'enfant href
de l'élément
photograph
; la valeur de l'attribut width
de l'élément
img
est calculée à partir de la valeur de l'attribut
width
de l'enfant size
de l'élément
photograph
:
<xsl:variable name="image-dir">/images</xsl:variable>
<xsl:template match="photograph">
<img src="{$image-dir}/{href}" width="{size/@width}"/>
</xsl:template>
Avec le source :
<photograph>
<href>headquarters.jpg</href>
<size width="300"/>
</photograph>
Le résultat serait :
<img src="/images/headquarters.jpg" width="300"/>
Quand un modèle de valeur d'attribut est instancié, la présence d'une accolade double (droite ou gauche) en dehors d'une expression entraînera la production d'une accolade simple (droite ou gauche). Quand une accolade droite simple apparaît dans un modèle d'attribut à l'extérieur d'une expression, c'est une erreur. Une accolade droite à l'intérieur d'un Littéral d'une expression n'est pas reconnue comme terminant l'expression.
Les accolades ne sont pas reconnues récursivement à l'intérieur des expressions. Par exemple :
<a href="#{id({@ref})/title}">
n'est pas autorisée. A la place, utiliser simplement :
<a href="#{id(@ref)/title}">
<!-- Catégorie
: instruction -->
<xsl:number
level = "single" | "multiple" | "any"
count = pattern
from = pattern
value = number-expression
format = { string }
lang = { nmtoken }
letter-value = { "alphabetic" | "traditional" }
grouping-separator = { char }
grouping-size = { number } />
L'élément xsl:number
est utilisé pour produire
un nombre formaté dans l'arbre résultat. Le nombre à insérer
peut être spécifié par une expression. L'attribut value
contient une expression. L'expression est évaluée
et l'objet résultant est converti en un nombre comme avec la fonction
number. Le nombre est
arrondi à un entier puis converti en chaîne de caractères
en utilisant les attributs spécifiés au chapitre [7.7.1
Attributs de conversion de nombres en chaînes de caractères] ;
dans ce contexte, la valeur de chacun de ces attributs est interprétée
comme un modèle de valeur d'attribut.
Au terme de la conversion, la chaîne résultante est insérée
dans l'arbre résultant. Par exemple, l'exemple suivant numérote
une liste triée :
<xsl:template match="items">
<xsl:for-each select="item">
<xsl:sort select="."/>
<p>
<xsl:number value="position()" format="1. "/>
<xsl:value-of select="."/>
</p>
</xsl:for-each>
</xsl:template>
Si aucun attribut value n'est spécifié, alors l'élément
xsl:number
insère un nombre basé sur la position
du noeud courant dans l'arbre source. Les attributs suivants contrôlent
la manière dont le noeud courant doit être numéroté
:
L'attribut level
spécifie les niveaux de
l'arbre source qui doivent être considérés ; les valeurs possibles sont single
, multiple
ou any
.
La valeur par défaut est single
.
L'attribut count
est un motif qui spécifie
les noeuds à comptabiliser dans les niveaux spécifiés.
Si l'attribut count
n'est pas spécifié, alors sa
valeur par défaut est le motif qui correspond à tous les noeuds
de même type que le noeud courant et, si le noeud courant a un nom expansé,
ayant le même nom expansé que le noeud courant.
L'attribut from
est un motif qui spécifie
où commence l'énumération.
De plus, les attributs décrits au chapitre [7.7.1
Attributs de conversion de nombres en chaînes de caractères]
sont utilisés dans les conversions de nombres en chaînes de caractères,
comme lorsque l'attribut value
est spécifié.
L'élément xsl:number
commence par construire une
liste d'entiers positifs en utilisant les attributs level
, count
et from
selon les règles suivantes :
Quand level="single"
, le premier des ancêtres
dans l'axe ancêtre-ou-réflexif (ancestor-or-self
)
correspondant au motif spécifié par l'attribut count
est recherché puis une liste contenant cet ancêtre et tous ses
prédécesseurs correspondant eux-mêmes au motif précisé
par l'attribut count est construite. Si le premier ancêtre n'existe pas,
la liste construite est vide. Si l'attribut from est spécifié,
alors, les seuls ancêtres recherchés sont ceux qui sont des descendants
de l'ancêtre le plus proche correspondant au motif from. Les prédécesseurs
ont ici la même signification que dans l'axe des prédécesseurs
(preceding-sibling
axis).
Quand level="multiple"
, une liste de tous les
ancêtres du noeud courant dans l'ordre du document est construite terminée
par le noeud courant lui-même; ensuite, les noeuds correspondant au motif
count
sont extraits de cette liste et chacun d'eux provoque la
création d'une liste composée du noeud et de l'ensemble de ses
prédécesseurs correspondant au motif count
. Si l'attribut
from
est spécifié, alors les seuls ancêtres
à être recherchés sont ceux qui sont des descendants de
l'ancêtre le plus proche correspondant au motif from
. Les
prédécesseurs ont ici la même signification que dans l'axe
des prédécesseurs (preceding-sibling
axis).
Quand level="any"
, une liste à un élément
est constituée contenant le nombre de noeuds qui correspondent au motif
count
et appartiennent à l'ensemble formé du noeud
courant et de tous les noeuds du document, quel que soit leur niveau, qui se
trouvent avant le noeud courant dans l'ordre du document, à l'exclusion
des noeuds d'espace de noms et d'attribut (en d'autres termes, il s'agit de
l'union des membres des axes prédécesseurs (preceding
)
et ancêtres-ou-réflexif (ancestor-or-self
). Si l'attribut
from
est spécifié, alors seuls les noeuds qui se
trouvent après le premier noeud précédant le noeud courant
et correspondant au motif from
sont pris en considération.
La liste des nombres est ensuite convertie en une chaîne de caractères en utilisant les attributs décrits au chapitre [7.7.1 Attributs de conversion de nombres en chaînes de caractères] ;dans ce contexte, la valeur de chacun de ces attributs est interprétée comme un modèle de valeur d'attribut. Après conversion, la chaîne de caractères résultante est insérée dans l'arbre résultat.
Les lignes suivantes calculent le nombre d'items d'une liste ordonnée :
<xsl:template match="ol/item">
<fo:block>
<xsl:number/>
<xsl:text>. </xsl:text>
<xsl:apply-templates/>
</fo:block>
<xsl:template>
Les deux règles suivantes calculent le nombre d'éléments title. Cela s'entend pour un document contenant une série de chapitres suivis par une série d'annexes, où les chapitres ainsi que les annexes contiennent des sections, qui, à leur tour, contiennent des sous-sections. Les chapitres sont numérotés 1, 2, 3; les annexes sont numérotées A, B, C; les sections des chapitres sont numérotées 1.1, 1.2, 1.3; les sections des annexes sont numérotées A.1, A.2, A.3.
<xsl:template match="title">
<fo:block>
<xsl:number level="multiple"
count="chapter|section|subsection"
format="1.1 "/>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
<xsl:template match="appendix//title" priority="1">
<fo:block>
<xsl:number level="multiple"
count="appendix|section|subsection"
format="A.1 "/>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
L'exemple suivant numérote séquentiellement les notes d'un chapitre :
<xsl:template match="note">
<fo:block>
<xsl:number level="any" from="chapter" format="(1) "/>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
L'exemple suivant numérote les éléments HTML H4 avec un préfixe composé de 3 parties :
<xsl:template match="H4">
<fo:block>
<xsl:number level="any" from="H1" count="H2"/>
<xsl:text>.</xsl:text>
<xsl:number level="any" from="H2" count="H3"/>
<xsl:text>.</xsl:text>
<xsl:number level="any" from="H3" count="H4"/>
<xsl:text> </xsl:text>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
Les attributs suivants sont utilisés pour contrôler la conversion d'une liste de nombre en une chaîne de caractères. Les nombres sont des entiers supérieurs à 0. Les attributs sont tous optionnels.
L'attribut principal est format
. La valeur par défaut de
l'attribut format
est 1. La valeur de l'attribut format
est découpée
en une séquence de marques dont chacune est soit la séquence la
plus longue possible de caractères alphanumériques soit la séquence
la plus longue possible de caractère non-alphanumériques. Alphanumérique
se rapporte aux caractères dont la catégorie Unicode est de type
Nd, Nl, No, Lu, Ll, Lt, Lm ou Lo. Les marques alphanumériques (marques
de formatage) spécifient le format à utiliser pour chaque nombre
de la liste. Si la première marque n'est pas alphanumérique, alors
la chaîne de caractères construite commencera avec cette marque;
si la dernière marque n'est pas alphanumérique, alors la chaîne
de caractères produite finira par cette marque. Les marques non-alphanumérique
qui interviennent entre 2 marques de formatage sont des séparateurs qui
sont utilisés pour joindre les nombres de la liste. La marque de formatage
nth est utilisée pour formatter le n-ième nombre
de la liste. S'il y a plus de nombre que de marques de formatage, alors la
dernière marque de formatage sera utilisée pour formatter les
nombres restants. S'il n'y a pas de marque de formatage, alors la marque de
formatage valant 1 est utilisée pour formatter tous les nombres de la
liste. La marque de formatage spécifie la chaîne de caractères
à utiliser pour représenter le nombre 1. Chaque nombre après
le premier sera séparé de son prédécesseur par le
séparateur précédent la marque de formatage utilisée
pour formatter ce nombre, ou, s'il n'y a pas de séparateur, par un .
(le caractère point).
Les marques de formatage sont un sur ensemble des valeurs autorisées de l'attribut type de l'élément OL de HTML 4.0 et qui sont interprétées comme suit :
Toute marque de formatage composée du caractère dont la représentation numérique est 1 (tel que spécifié dans la base de propriétés des caractères Unicode), lui-même précédé de caractères dont la valeur Unicode lui est inférieure de 1 (typiquement le caractère zéro : 0) génère une représentation des nombres dans laquelle chaque nombre a une longueur au moins égale à celle de la marque de formatage. Aussi, la marque de formatage 1 génère la séquence 1 2 ... 10 11 12 ..., et la marque de formatage 01 génère la séquence 01 02 ... 09 10 11 12 ... 99 100 101.
Une marque de formatage A produit la séquence A B C ... Z AA AB AC....
Une marque de formatage a produit la séquence a b c ... z aa ab ac....
Une marque de formatage i produit la séquence i ii iii iv v vi vii viii ix x ....
Une marque de formatage I produit la séquence I II III IV V VI VII VIII IX X ....
Toute autre marque de formatage indique une séquence de numérotation qui commence par cette marque. Si une implémentation ne supporte pas une numérotation qui commençerait par cette marque, elle doit alors lui substituer la marque 1.
Quand on numérote avec une séquence alphabétique, l'attribut lang spécifie quel alphabet de langue doit être utilisé; il a la même gamme de valeurs que xml:lang[XML]; si aucune valeur lang n'est spécifiée, la langage doit être déterminé de l'environnement système. Les développeurs de logiciels doivent documenter les langages supportés par leur implémentation de la numérotation.
NOTE : les développeurs de logiciels ne doivent faire aucune supposition concernant la manière dont la numérotation fonctionne dans des cas particuliers de langages et doivent correctement étudier les langages qu'ils se proposent de supporter. Les conventions de numérotations étant différentes de l'anglais dans de nombreux langages.
L'attribut letter-value
permet de lever les ambiguïtés
concernant les séquences de numérotation reposant sur des lettres.
Dans de nombreux langages, il y a deux séquences communément utilisées
de numérotations à base de lettres. L'une attribue des valeurs
numériques aux lettres ordonnées selon l'alphabet, et l'autre
attribue des valeurs numériques aux lettres selon d'autres critères
traditionnels propre au langage. En anglais, cela correspondrait aux règles
de numérotation a et i. Dans d'autres langages, le premier membre de
chaque séquence est le même, faisant que la seule marque de formatage
serait ambïgue. La valeur alphabetic
permet de spécifier
qu'il s'agit d'une séquence alphabétique; La valeur traditional
permet de préciser une autre séquence. Si l'attribut letter-value
n'est pas précisé, alors la levée de l'ambiguïté
dépend de l'implémentation.
NOTE : Il est possible que deux processeurs XSLT conformes
ne convertissent pas tout à fait un même nombre en une chaîne
de caractères strictement identique. Il se peut que des processeurs XSLT
ne supportent pas certains lanagages. De plus, il peut y avoir des variations
dans la manière dont les conversions sont effectuées pour des
langages spécifiques qui ne soient pas contrôlables par les attributs
de xsl:number. Les futures versions de XSLT pourront fournir des attributs additionnels
pour pouvoir contrôler ces variations. Les implémentations peuvent
également utiliser sur l'élément xsl:number
des attributs issus d'espaces de noms spécifiques à l'implémentation.
L'attribut grouping-separator
donne le séparateur utilisé
comme séparateur de groupes (par exemple les milliers) des séquences
numériques, et l'attribut optionnel grouping-size
spécifie
la taille (habituellement 3) du regrouppement. Par exmple, grouping-separator=","
et grouping-size="3"
produiraient des nombres de la forme 1,000,000.
Si un seul des deux attributs grouping-separator
et grouping-size
est spécifié, alors il est ignoré.
Voici quelques exemples de spécifications de conversion :
format="ア"
spécifie une numérotation
en Katakana
format="イ"
spécifie une numérotation
Katakana dans l'ordre "iroha"
format="๑"
spécifie une numérotation
en chiffres Thai
format="א"
letter-value="traditional"
spécifie une numérotation traditionnelle en Hébreu
format="ა"
letter-value="traditional"
spécifie une numérotation en Géorgien
format="α"
letter-value="traditional"
spécifie une numérotation en Grec "classique"
format="а"
letter-value="traditional"
spécifie une numérotation en vieux Slave
<!-- Category: instruction -->
<xsl:for-each
select = node-set-expression>
<!-- Content: (xsl:sort*,
template) -->
</xsl:for-each>
Il est utile de pouvoir spécifier directement le modèle pour
les noeuds sélectionnés lorsque le résultat est une structure
régulière connue. L'instruction xsl:for-each
contient
un modèle qui est instancié pour chaque noeud sélectionné
par l'expression spécifiée en tant
que valeur de l'attribut select
. L'attribut select
est obligatoire. Le résultat de l'évaluation de l'expression doit
être un ensemble de noeuds. Le modèle est instancié avec
le noeud sélectionné identifié comme le noeud
courant, et avec la liste de tous les noeuds sélectionnés
identifiée comme la liste courante de
noeuds. À moins qu'une spécification d'ordre ne soit présente,
les noeuds sont traités dans l'ordre induit par le document (voir [10
Tri]).
Par exemple, Considérons un document XML avec la structure suivante :
<customers>
<customer>
<name>...</name>
<order>...</order>
<order>...</order>
</customer>
<customer>
<name>...</name>
<order>...</order>
<order>...</order>
</customer>
</customers>
ce qui suit permet de créer un document HTML contenant une table contenant
une ligne pour chaque élément customer
<xsl:template match="/">
<html>
<head>
<title>Customers</title>
</head>
<body>
<table>
<tbody>
<xsl:for-each select="customers/customer">
<tr>
<th>
<xsl:apply-templates select="name"/>
</th>
<xsl:for-each select="order">
<td>
<xsl:apply-templates/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>
XSLT propose deux instructions qui pemettent le traitement conditionnel dans un
modèle : xsl:if
et xsl:choose
. L'instruction xsl:if
sert à exprimer la condition simple si-alors ; L'instruction xsl:choose
permet quant à elle un choix parmi plusieurs possibilités.
xsl:if
<!-- Category: instruction -->
<xsl:if
test = boolean-expression>
<!-- Content: template -->
</xsl:if>
L'élément xsl:if
a un attribut test qui spécifie
une expression. Le contenu est un modèle.
Après évaluation de l'expression, le résultat est converti
en booléen comme si elle avait été évaluée
par la fonction boolean.
Si le résultat est vrai alors le contenu du modèle est instancié,
sinon rien n'est créé . Dans l'exemple suivant, les noms dans
un groupe de noms sont formatés sous la forme d'une liste de noms séparés
par des virgules :
<xsl:template match="namelist/name">
<xsl:apply-templates/>
<xsl:if test="not(position()=last())">, </xsl:if>
</xsl:template>
L'exemple suivant colore en jaune une ligne de tableau sur 2 (les lignes de rang pair) :
<xsl:template match="item">
<tr>
<xsl:if test="position() mod 2 = 0">
<xsl:attribute name="bgcolor">yellow</xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</tr>
</xsl:template>
xsl:choose
<!-- Category: instruction -->
<xsl:choose>
<!-- Content: (xsl:when+, xsl:otherwise?)
-->
</xsl:choose>
<xsl:when
test = boolean-expression>
<!-- Content: template -->
</xsl:when>
<xsl:otherwise>
<!-- Content: template -->
</xsl:otherwise>
L'élément xsl:choose
permet de faire un choix parmi
plusieurs alternatives. Il consiste en une séquence d'éléments
xsl:when
suivis par un élément xsl:otherwise
optionnel. Chacun des éléments xsl:when
possède
un attribut test unique qui spécifie une expression.
Le contenu des éléments xsl:when
et xsl:otherwise
est un modèle. Le traitement d'une instruction xsl:choose
,
consiste à tester à tour de rôle chacun des éléments
xsl:when
en évaluant l'expression et en convertissant l'objet
résultant en un booléen comme si'il avait été évalué
par la fonction l'exécution de la fonction boolean.
Seul le contenu du premier élément xsl:when
évalulé
à vrai est instancié. Si aucun des éléments xsl:when
n'est évalué à vrai, c'est le contenu de l'élément
xsl:otherwise
qui est instancié. Si aucun des éléments
xsl:when
n'est évalué à vrai et qu'il n'y
a pas d'élément xsl:otherwise
alors rien n'est créé.
L'exemple suivant énumère des items d'une liste ordonnée en utilisant les chiffres arabes, les lettres et les chiffres romains en fonction de la profondeur d'imbrication des listes.
<xsl:template match="orderedlist/listitem">
<fo:list-item indent-start='2pi'>
<fo:list-item-label>
<xsl:variable name="level"
select="count(ancestor::orderedlist) mod 3"/>
<xsl:choose>
<xsl:when test='$level=1'>
<xsl:number format="i"/>
</xsl:when>
<xsl:when test='$level=2'>
<xsl:number format="a"/>
</xsl:when>
<xsl:otherwise>
<xsl:number format="1"/>
</xsl:otherwise>
</xsl:choose>
<xsl:text>. </xsl:text>
</fo:list-item-label>
<fo:list-item-body>
<xsl:apply-templates/>
</fo:list-item-body>
</fo:list-item>
</xsl:template>
<xsl:sort
select = string-expression
lang = { nmtoken }
data-type = { "text" | "number" | qname-but-not-ncname
}
order = { "ascending" | "descending" }
case-order = { "upper-first" | "lower-first" } />
Le tri est spécifié en ajoutant des éléments xsl:sort
comme fils d'un élément xsl:apply-templates
ou d'un
élément xsl:for-each
. Le premier fils xsl:sort
spécifie la clé primaire de tri, le deuxième fils xsl:sort
spécifie la clé de tri secondaire et ainsi de suite. Lorsqu'un
élément xsl:apply-templates
ou un élément
xsl:for-each
a un un ou plusieurs fils xsl:sort
, au
lieu de traiter les noeuds sélectionnés dans l'ordre où
ils apparaissent dans le document, ces derniers sont triés en fonction
des clés de tri spécifiés et traités dans l'ordre
induit par ce tri. Lorsque des éléments xsl:sort
sont utilisés dans xsl:for-each
, ils doivent apparaître
en premier. Lorsqu'un modèle est instancié par xsl:apply-templates
et xsl:for-each
, la liste de noeuds
courante consiste en la liste complète des noeuds en cours de traitement
dans l'ordre spécifié par le tri.
xsl:sort
possède un attribut select dont la valeur est
une expression. Pour chaque noeud à traiter,
l'expression est évaluée avec ce noeud pris comme le noeud courant
et avec la liste complète non triée des noeuds en cours de traitement
prise comme la liste courante de noeuds. L'objet résultant est convertit
en une chaîne de caractères comme s'il avait été
le résultat de l'éxécution de la fonction string;
cette chaîne de caractères résultat est utilisée
comme clé de tri pour ce noeud. La valeur par défaut de l'attribut
select est le caractère point "." dont l'occurrence induit
l'utilisation comme clé de tri de la représentation sous forme
de chaîne de caractères, du noeud courant.
Cette chaîne de caractères sert de clé de tri pour le noeud. Les attributs optionnels suivants de xsl:sort contrôlent comment les clés de tri de la liste sont ordonnées; les valeurs de tous ces attributs sont interprétées comme de modèles de valeur d'attribut (attribute value templates).
order
indique si les chaînes de caractères devraient
être triées dans un ordre ascendant ou descendant; la valeur
ascending
spécifie un ordre ascendant; la valeur descending
spécifie un ordre descendant; par défaut, l'ordre est ascendingNOTE:Le groupe de travail XSL prévoit que les versions futures de XSLT auront un impact sur les Schémas XML afin d'attribuer davantage de valeurs pour cet attribut.
NOTE: Deux processeurs XSLT conformes peuvent ne pas
faire exactement le même tri. Certains processeurs XSLT peuvent ne
pas supporter certaines langues. Il peut aussi y avoir des variations possibles
lors d'un tri dans n'importe quelle langue particulière qui n'est
pas spécifiée par l'attribut de xsl:sort, par exemple,
lorsque Hiragana ou Katakana est trié en Japonais dans un premier
temps. Les versions de XSLT peuvent fournir des attributs additionnels
afin de permettre un contrôle sur ces variations. Pour cela, les
réalisations peuvent aussi utiliser des attributs appartenant à
des espaces de noms spécifiques à l'implémentation
en question pour xsl:sort
.
NOTE: Il est recommandé aux développeurs de consulter [UNICODE TR10] pour des informations sur le tri internationalisé.
Le tri doit être stable: dans une liste de noeuds triée, n'importe quel sous-liste ayant des clés de tri égales doit être ordonnée dans l'ordre du document.
Considérons par exemple, une base de données répertoriant des employés et ayant la forme
<employees>
<employee>
<name>
<given>James</given>
<family>Clark</family>
</name>
...
</employee>
</employees>
Alors, une liste d'employés triée par le nom peut être générée en utilisant
<xsl:template match="employees">
<ul>
<xsl:apply-templates select="employee">
<xsl:sort select="name/family"/>
<xsl:sort select="name/given"/>
</xsl:apply-templates>
</ul>
</xsl:template>
<xsl:template match="employee">
<li>
<xsl:value-of select="name/given"/>
<xsl:text> </xsl:text>
<xsl:value-of select="name/family"/>
</li>
</xsl:template>
<!-- Category: top-level-element -->
<!-- Category:
top-level-element -->
<xsl:param
name = qname
select = expression>
<!-- Content: template -->
</xsl:param>
Une variable est un nom pouvant être rattaché à une valeur. La valeur à laquelle est rattachée la variable (la valeur de la variable) peut être un objet de n'importe quel type que les expressions peuvent retourner. Il y a deux éléments qui peuvent être rattachés à des variables: xsl:variable et xsl:param. La différence est que la valeur spécifiée pour la variable de xsl:param est seulement une valeur de lien par défaut; lorsque le modèle ou la feuille de style dans lequel l'élément xsl:param se produit est invoqué, des paramètres peuvent être passés pour être utilisés à la place des valeurs par défaut.
xsl:variable et xsl:param ont un attribut name obligatoire qui indique le nom de la variable. La valeur de l'attribut name est un QName, qui est étendu comme indiqué dans [2.4 Noms Qualifiés].
Pour toute utilisation de ces éléments de liens de variables, il y a une région dans l'arbre de la feuille de style dans laquelle le lien est visible; tout lien d'une variable, visible dans l'élément de lien, est caché dans cette région. Ainsi, n'est visible que le lien le plus profond d'une variable. L'ensemble de liens d'une variable dans la portée d'une expression consiste en tous les liens qui sont visibles à l'endroit de la feuille de style où l'expression se produit.
Les variables introduisent un type de données additionnel dans le langage d'expression. Ce type de données est appelé fragment d'arbre résultat. Une variable peut être liée un fragment d'arbre résultat au lieu d'être liée à l'un des quatre types de base de XPath (string, number, boolean, node-set). Un fragment d'arbre résultat est un fragment de l'arbre résultat. Il est traité de la même manière qu'un ensemble de noeuds contenant uniquement un un simple noeud racine. Les opérations autorisées sur un fragment d'arbre résultat ne sont, cependant, qu'un sous ensemble des opérations permises sur un ensemble de noeuds. Une opération n'est permise sur un fragment d'arbre résultat que si elle pouvait l'être sur une chaîne de caractères (L'opération sur la chaîne de caractères peut entraîner sa conversion en un nombre ou en un booléen en premier lieu). Il n'est particulièrement pas autorisé d'utiliser les opérateurs /, //, et [] sur les fragments d'arbre résultat. L'exécution d'une opération valide sur un fragment d'arbre résultat se déroule de la même manière que si cette opération est exécutée sur un ensemble de noeuds équivalent au fragment d'arbre résultat.
Lors de la copie d'un fragment d'arbre résultat dans l'arbre
résultat (voir
[11.3 Utilisation des valeurs
des variables et des paramètres avec xsl:copy-of
]),
tous les noeuds fils du noeud racine de l'ensemble des noeuds équivalent
au fragment d'arbre résultat sont ajoutés en séquence
à l'arbre résultat.
Les expressions ne peuvent retourner des valeurs de type fragment d'arbre résultat que par des références à des variables de type fragment d'arbre résultat ou en appelant des fonctions d'extension retournant un fragment d'arbre résultat ou récupérant les propriétés système dont les valeurs sont des fragments d'arbre résultat.
Un élément de lien de variable peut spécifier la valeur de la variable selon trois alternatives.
Si un membre de la séquence de noeuds créés par l'instanciation du modèle est un noeud attribut ou un noeud espace de noms, alors il y a une erreur. Un noeud racine ne peut avoir pour fils un noeud attribut ou un noeud espace de noms. Un processeur XSLT peut signaler l'erreur, s'il ne le fait pas, il doit récupérer l'erreur et il ne doit pas ajouter le noeud attribut ou le noeud espace de noms.
<xsl:variable name="x"/>
est équivalent à
<xsl:variable name="x" select="''"/>
NOTE: Lorsqu'une variable est utilisée pour sélectionner des noeuds par position, éviter de faire:
<xsl:variable name="n">2</xsl:variable>
...
<xsl:value-of select="item[$n]"/>
<xsl:variable name="n" select="2"/>
...
<xsl:value-of select="item[$n]"/>
<xsl:variable name="n">2</xsl:variable>
...
<xsl:value-of select="item[position()=$n]"/>
NOTE: Un moyen pratique pour fixer la valeur d'un paramètre à l'ensemble de noeuds vide est :
<xsl:param name="x" select="/.."/>
xsl:copy-of
<!-- Category: instruction -->
L'élément xsl:copy-of
, contrairement à
xsl:value-of
(voir [7.6.1 Generating Text with xsl:value-of
]),
peut être utilisé pour insérer un fragment d'arbre
résultat dans un arbre résultat, sans avoir à commencer
par le convertir en une chaîne de caractères. L'attribut select
exigé contient une expression. Lorsque
le résultat de l'évaluation de l'expression est fragment
d'arbre résultat, alors le fragment complet est copié dans
l'arbre résultat. Lorsque le résultat est un ensemble de
noeuds, alors tous les noeuds de cet ensemble sont copiés dans l'arbre
résultat dans le même ordre où ils apparaissent dans
le document; la copie d'un élément noeud copie les noeuds
attributs, les noeuds espaces de noms et les enfants de l'élément
noeud ainsi que l'élément noeud lui-même; la copie
d'un noeud racine se fait par la copie de ses enfants. Si le résultat
n'est ni un ensemble de noeuds ni un fragment d'arbre résultat,
alors il est doit être convertit en une chaîne de caractères
et ensuite inséré dans l'arbre résultat de la même
manière qu'avec xsl:value-of
.
Les éléments xsl:variable et xsl:param sont tous deux autorisés à être utilisés comme éléments de haut niveau (top-level). Un élément lien de variable de haut niveau déclare une variable globale visible partout. Un élément xsl:param de haut niveau déclare un paramètre pour la feuille de style; XSLT ne définit pas le mécanisme permettant de transmettre les paramètres à la feuille de style. Une feuille de style ne peut contenir plus d'un lien à une variable de haut niveau ayant le même nom et la même préséance d'import. Au niveau le plus haut, l'expression ou le modèle spécifiant la valeur d'une variable est évalué dans le même contexte le traitement du noeud racine d'un document source : le noeud courant est le noeud racine du document source et la liste courante de noeuds est une liste contenant uniquement le noeud racine du document source. Si le modèle ou l'expression spécifiant la valeur d'une variable globale x fait référence à une variable globale y, alors la valeur de y doit être calculée avant la valeur de x. S'il était impossible de traiter toutes les variables globales de la sorte alors c'est une erreur; en d'autres termes, si la définition est circulaire alors c'est une erreur.
L'exemple suivant montre la déclaration d'une variable globale para-font-size, qui est référencée dans la valeur d'un attribut modèle.
<xsl:variable name="para-font-size">12pt</xsl:variable>
<xsl:template match="para">
<fo:block font-size="{$para-font-size}">
<xsl:apply-templates/>
</fo:block>
</xsl:template>
De même qu'il est possible d'utiliser dans les élément de haut niveau, xsl:variable et xsl:param sont aussi permis dans les modèles. Dans un modèle, xsl:variable est autorisé partout où une instruction l'est. Dans ce cas, le lien est visible pour tous les frères suivant ainsi que leurs descendants. Notez bien que le lien n'est pas visible par l'élément xsl:variable lui-même. xsl:param est permis lorsqu'il est fils au début d'un élément xsl:template. Dans ce cas précis, le lien est visible pour tous les frères suivant et à leurs descendants. Notez que le lien n'est pas visible par l'élément xsl:param lui-même.
Un lien inhibe un autre lien si le lien se produit à un point où l'autre lien est visible, et les deux liens doivent avoir le même nom. Si un lien établit par un élément xsl:variable ou un élément xsl:param dans un modèle inhibe un autre lien établit aussi dans un modèle par un élément xsl:variable ou un élément xsl:param alors c'est une erreur. Par contre, lien un établit par un élément xsl:variable ou un élément xsl:param dans un modèle peut inhiber un autre lien établit par un élément de haut niveau xsl:variable ou un élément de haut niveau xsl:param. Ainsi, ce qui suit est erroné :
<xsl:template name="foo"> <xsl:param name="x" select="1"/> <xsl:variable name="x" select="2"/> </xsl:template>
Cependant ce qui suit est autorisé :
<xsl:param name="x" select="1"/>
<xsl:template name="foo">
<xsl:variable name="x" select="2"/>
</xsl:template>
NOTE: L'équivalent Java le plus proche d'un élément xsl:variable dans un modèle est la déclaration avec initialisation d'une variable locale terminale. Par exemple,
<xsl:variable name="x" select="'value'"/>
a la même sémantique que
final Object x = "value";
XSLT ne fournit pas un équivalent à l'opérateur d'initialisation de Java
x = "value";
car ceci rend plus difficile une implémentation qui traite un document d'une manière autre que la manière de traitement par lots, partant du début jusqu'à la fin.<xsl:with-param
name = qname
select = expression>
<!-- Content: template -->
</xsl:with-param>
Le passage de paramètres aux modèle se fait par le moyen de l'élément
xsl:with-param. L'attribut name
obligatoire indique le nom
du paramètre (la variable dont la valeur doit être remplacée).
La valeur de l'attribut name
est un QName,
qui est résolu comme décrit dans [2.4 Noms
qualifiés]. xsl:with-param est permis aussi bien dans
xsl:call-template que dans xsl:apply-templates
. La valeur
du paramètre est spécifiée de la même manière
que pour xsl:variable et xsl:param. Le noeud courant et la
liste courante de noeuds utilisés pour calculer la valeur spécifiée
par l'élément xsl:with-param sont les mêmes que
ceux utilisés pour l'élément xsl:apply-templates
ou pour l'élément xsl:call-template dans lequel il se
apparaît. Ce n'est pas une erreur de passer un paramètre x
à un modèle qui n'a pas d'élément xsl:param
pour le paramètre x ; dans ce cas là, le paramètre
x est tout simplement ignoré.
L'exemple suivant défini un modèle nommé pour un numbered-block avec un argument pour contrôler le format du nombre.
<xsl:template name="numbered-block">
<xsl:param name="format">1. </xsl:param>
<fo:block>
<xsl:number format="{$format}"/>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
<xsl:template match="ol//ol/li">
<xsl:call-template name="numbered-block">
<xsl:with-param name="format">a. </xsl:with-param>
</xsl:call-template>
</xsl:template>
Cette section décrit les mécanismes d'ajout de fonctions spécifiques à la librairie des fonctions du noyau de XPath. Certaines de ces fonctions additionnelles se servent d'informations spécifiées par des éléments de premier niveau dans la feuille de style; cette section décrit aussi ces éléments.
La fonction document permet d'accéder aux documents XML autres que le document source principal.
Lorsque la fonction document a exactement un argument et que cet argument est un ensemble de noeuds alors, le résultat est l'union, pour chaque noeud de l'ensemble de noeuds reçu en argument, du résultat de l'exécution de la fonction document avec comme premier argument la string-value du noeud, et comme deuxième argument un ensemble de noeuds dont l'unique élément est le noeud lui-même. Lorsque la fonction document a deux arguments et que le premier argument est un ensemble de noeuds alors, le résultat est la réunion, pour chaque noeud de l'ensemble de noeuds reçu en argument, du résultat de l'exécution de la fonction document avec comme premier argument la string-value du noeud et, comme deuxième argument, le deuxième argument passé à la fonction document.
Si le premier argument de la fonction document n'est pas un ensemble de noeuds alors il sera convertit en une chaîne de caractères comme par l'exécution de la fonction string. Cette chaîne de caractères est traitée comme une référence à un URI; la ressource identifiée par l'URI est extraite. Les données résultant de la fonction d'extraction sont analysées comme un document XML et un arbre est construit en concordance avec le modèle de données (voir [3 Modèle de données]). Si l'extraction de la ressource se solde par une erreur alors, le processeur XSLT peut signaler l'erreur; s'il ne le fait pas, il doit récupérer sur l'erreur en retournant un ensemble vide de noeuds. Une erreur pouvant se produire à l'extraction résulte du fait que le processeur XSLT ne supporte pas le schéma utilisé par l'URI. Un processeur XSLT n'est sensé supporter aucun schéma particulier d'URI. Les schémas d'URI supportés par un processeur XSLT doivent être clairement indiqués dans sa documentation.
Si la référence à l'URI ne contient pas un identificateur de fragment alors, la fonction retourne l'ensemble de noeuds contenant uniquement le noeud racine du document. Si la référence à l'URI contient un identificateur de fragment alors, la fonction retourne un ensemble de noeuds contenant les noeuds de l'arbre identifiés par l'identificateur du fragment de la référence à l'URI. La sémantique de l'identificateur de fragment dépend du type de média du résultat de l'extraction de l'URI. Si lors du traitement de l'identificateur de fragment, une erreur se produisait, alors le processeur XSLT peut signaler cette erreur; dans le cas contraire, il doit récupérer l'erreur en retournant un ensemble vide de noeuds. Les erreurs possibles comportent :
Les données résultant de l'action d'extraction sont analysées comme un document XML sans tenir compte du type de média du résultat de l'extraction; si le type média de haut niveau est text, alors il est analysé comme si le type média était text/xml; autrement, il est analysé comme si le type média était application/xml.
NOTE: Puisqu'il n'y a pas de type média xml de haut niveau, les données avec un type média autre que text/xml ou application/xml peuvent être XML.
La référence à l'URI peut être relative. L'URI de base (voir [3.2 URI base]) du noeud qui apparaît le premier dans le document et qui appartient à l'ensemble de noeuds du deuxième argument est utilisé comme URI de base pour résoudre les URI relatives et les transformer en URI absolues. Lorsque le deuxième argument est omis, le noeud de la feuille de style qui contient l'expression incluant un appel à la fonction document est utilisé comme noeud de substitution par défaut. Notez qu'une référence à une URI de taille nulle est une référence au document dont l'URI qui lui est relative est en cours de résolution; ainsi document("") fait référence au noeud racine de la feuille de style; la représentation en arbre de la feuille de style est exactement la même que si le document XML contenant la feuille de style était le document source initial.
Deux documents sont traités comme le même document s'ils sont identifiés par le même URI. L'URI absolue est utilisé pour la comparaison dans laquelle chaque URI relative a été résolue et ne contient aucun identificateur de fragment. Un noeud racine est traité comme si c'était le même noeud qu'un autre noeud racine si les deux noeuds sont tous deux du même document. Ainsi, l'expression suivante est toujours vrai:
generate-id(document("foo.xml"))=generate-id(document("foo.xml"))
La fonction document augmente la possibilité qu'un ensemble de noeuds puisse contenir des noeuds provenant de plusieurs documents. Avec un tel ensemble de noeuds, l'ordre du document relatif pour deux noeuds dans un même document est l'ordre du document normal définit par XPath [XPath]. L'ordre de deux noeuds relatif au document dans deux documents différents est déterminé un ordre dépendant de l'implémentation des documents contenant les deux noeuds. Il n'y a pas de contraintes sur la manière selon laquelle l'implémentation ordonne les documents autres que le fait que l'ordonnancement doit se faire du'une manière consistante: une implémentation doit toujours utiliser le même ordre pour le même ensemble de documents.
Les clés procurent le moyen de travailler avec des documents contenant une structure implicite de références croisées. Les types d'attributs ID, IDREF et IDREFS dans XML fournissent un mécanisme permettant les documents XML de rendre explicites leurs références croisées. La fonction id de XPath permet à XSLT de supporter ce mécanisme. Cela dit, ce mécanisme a un certain nombre de limitations :
À cause ces limitations, les documents XML peuvent parfois contenir une structure de références croisées qui n'est pas explicitement déclarée par les attributs ID/IDREF/IDREFS.
Une clé est un triplet contenant :
Pour chaque document, une feuille de style déclare un ensemble de clé à l'aide de l'élément xsl:key. Pour un élément de cet ensemble de clés ayant un noeud x, un nom y et une valeur z, nous disons que le noeud x a une clé dont le nom est y et la valeur est z.
Ainsi, une clé est une sorte de ID généralisé qui n'est pas contraint par les mêmes limitations qu'un ID XML:
<!-- Category: top-level-element -->
L'élément xsl:key sert à la déclaration
de clés. Le nom de la clé est spécifié dans
l'attribut name
. La valeur de l'attribut
name est un
QName, qui est
étendu comme indiqué dans [2.4 Noms qualifiés].
L'attribut match
est un Pattern; un
élément xsl:key informe sur les clés de n'importe
quel noeud et qui concordent avec un motif spécifié par l'attribut
match
. L'attribut use est une expression
spécifiant la valeur de la clé; cette expression est évaluée
une fois pour chaque noeud concordant avec le motif. Si le résultat
est un ensemble de noeuds alors, pour chaque noeud de cet ensemble, le
noeud concordant avec le motif a une clé dont le nom est celui spécifié
et dont la valeur est celle de la chaîne de caractères du
noeud de l'ensemble de noeuds; autrement le résultat est convertit
en une chaîne de caractères et le noeud qui concorde avec
le motif a une clé dont le nom est celui spécifié
et dont dont la valeur est égale à cette chaîne de
caractères. Ainsi, un noeud x a une clé dont le nom
est y et dont la valeur est z si et seulement s'il existe
un élément xsl:key tel que :
match
de l'élément xsl:key;name
de l'élément xsl:key
est égale à y; etNotez bien aussi qu'il est possible d'avoir plus d'un élément xsl:key concordant un noeud donné; tous les éléments xsl:key concordants sont utilisés, même si leurs préséance d'import n'est pas la même.
Si l'un des attributs use ou match
contenait une
VariableReference
alors c'est une erreur.
Fonction: node-setkey(string, object)
La fonction key joue le même rôle pour les clés que celui de la fonction id pour les IDs. Le premier argument spécifie le nom de la clé. La valeur de cet argument doit être un QName, qui est étendu comme c'est décrit dans [2.4 Noms qualifiés]. Lorsque le type du deuxième argument de la fonction key est un ensemble de noeuds alors, le résultat est la réunion des résultats de l'application de la fonction key à la valeur de la chaîne de caractères de chacun des noeuds de l'ensemble de noeuds reçu en deuxième argument par la fonction. Si le type du deuxième argument de la fonction key n'est pas un ensemble de noeuds alors l'argument est converti en une chaîne de caractères de la même manière que par l'appel de la fonction string; elle retourne, sous forme d'un ensemble de noeuds contenant les noeuds du même document, un noeud contexte dont la valeur de la clé nommée est égale à cette chaîne de caractères.
Étant donné, par exemple, la déclaration suivante :
<xsl:key name="idkey" match="div" use="@id"/>
l'expression key("idkey",@ref)
retourne le même ensemble
de noeuds que id(@ref)
, à condition que le seul attribut
ID déclaré dans le document source XML est :
<!ATTLIST div id ID #IMPLIED>
et que l'attribut ref
du noeud courant ne contient pas d'espaces.
Considérons un document décrivant une librairie de fonction et utilisant un élément prototype pour définir les fonctions
<prototype name="key" return-type="node-set">
<arg type="string"/>
<arg type="object"/>
</prototype>
ainsi qu'un élément function
pour faire référence
aux noms des fonctions
<function>key</function>
La feuille de style peut alors générer des hyperliens entre les références et les définition comme suit :
<xsl:key name="func" match="prototype" use="@name"/>
<xsl:template match="function">
<b>
<a href="#{generate-id(key('func',.))}">
<xsl:apply-templates/>
</a>
</b>
</xsl:template>
<xsl:template match="prototype">
<p><a name="{generate-id()}">
<b>Function: </b>
...
</a></p>
</xsl:template>
La fonction key peut être utilisée pour récupérer une clé à partir d'un document autre que le document contenant le noeud contexte. Supposons par exemple, un document contenant des références bibliographiques sous la forme <bibref>XSLT</bibref>, et qu'il y ait un document XML séparé bib.xml contenant la base de données bibliographiques dont les entrées sous de la forme :
<entry name="XSLT">...</entry>
Alors, pour la transformation des éléments bibref la feuille de style peut contenir ce qui suit :
<xsl:key name="bib" match="entry" use="@name"/>
<xsl:template match="bibref">
<xsl:variable name="name" select="."/>
<xsl:for-each select="document('bib.xml')">
<xsl:apply-templates select="key('bib',$name)"/>
</xsl:for-each>
</xsl:template>
Fonction: stringformat-number(number, string, string?)
La fonction format-number converti son premier argument en une chaîne de caractères en utilisant comme format de conversion, la chaîne de caractères motif spécifiée par le deuxième argument et le format décimal indiqué par le troisième argument, ou le format décimal par défaut en cas d'absence du troisième argument. La chaîne de caractères motif de conversion doit respecter la syntaxe spécifiée par la classe DecimalFormat de JDK 1.1. La chaîne de caractères motif doit être une chaîne localisée : le format décimal détermine quels sont les caractères ayant une signification particulière dans le motif (à l'exception du caractère guillemet qui n'est pas localisé). Le motif de format ne doit pas contenir le symbole monétaire (#x00A4); le support de cette caractéristique a été ajouté après la release initiale de JDK 1.1. Le nom du format5 décimal doit être un QName, qui est étendu comme décrit dans [2.4 Noms qualifiés]. Si la feuille de style ne contient pas une déclaration du format décimal avec expanded-name spécifié alors c'est une erreur.
NOTE: Les implémentations ne doivent pas forcément utiliser l'implémentation de JDK 1.1 implémentation, et les implémentation ne doivent pas être forcément réalisées en Java.
NOTE: Les feuilles de style peuvent utiliser d'autres moyens de XPath pour contrôler l'arrondissement des nombres.
<!-- Category: top-level-element -->
L'élément xsl:decimal-format déclare un format décimal qui contrôle l'interprétation d'un motif de format utilisé par la fonction format-number. S'il y a un attribut name alors, l'élément déclare un format décimal nommé; autrement, il déclare le format décimal par défaut. La valeur de l'attribut name est un QName, qui est étendu comme décrit dans [2.4 Noms qualifiés]. A moins qu'un format décimal ne soit déclaré chaque fois avec la même valeur pour tous les attributs (en tenant compte de n'importes quelles valeurs par défaut), la déclaration multiple (même avec des préséances d'import différentes), du format décimal par défaut ou d'un format décimal nommé est une erreur.
Les autres attributs de l'élément xsl:decimal-format correspondent aux méthodes de la classe DecimalFormatSymbols de JDK 1.1. Pour chaque paire de méthodes get/set il existe un attribut défini pour l'élément xsl:decimal-format .
Les attributs suivants permettent de contrôler aussi bien l'interprétation des caractères dans le motif de format que de spécifier les caractères pouvant apparaître dans le résultat de formatage du nombre :
Les attributs suivants contrôlent l'interprétation des caractères dans le motif de format:
Les attributs suivants indiquent les caractères ou les chaînes de caractères pouvant apparaître dans le résultat de formatage d'un nombre :
La fonction current retourne un ensemble de noeuds ayant pour seul élément le noeud courant. Pour une expression indépendante (ne se produisant pas dans une autre expression), le noeud courant est toujours le même que le noeud contexte. Ainsi,
<xsl:value-of select="current()"/>
a la même signification que
<xsl:value-of select="."/>
Cependant dans des crochets, le noeud courant est habituellement différent du noeud contexte. Par exemple,
<xsl:apply-templates select="//glossary/item[@name=current()/@ref]"/>
traite tous les éléments item qui ont un élément
glossary parent et qui ont un attribut name
dont la valeur est
égale à la valeur de l'attribut ref
du noeud courant.
Ceci est différent de
<xsl:apply-templates select="//glossary/item[@name=./@ref]"/>
qui signifie la même chose que
<xsl:apply-templates select="//glossary/item[@name=@ref]"/>
permettant de traiter tous les éléments item ayant un élément
glossary parent et ayant un attribut name et un attribut ref
ayant
la même valeur.
L'utilisation de la fonction current dans un motif est une erreur.
Fonction: stringunparsed-entity-uri(string)
La fonction unparsed-entity-uri retourne l'URI de l'entité non valide avec un nom spécifié dans le même document que le noeud contexte (voir [3.3 Entités non valides]). Si une pareille entité n'existe pas alors la fonction retourne une chaîne de caractères vide.
Fonction: stringgenerate-id(node-set?)
La fonction generate-id retourne une chaîne de caractères qui identifie d'une manière unique le noeud dans l'ensemble de noeuds reçu en argument qui est le premier selon l'ordre du document. L'identificateur unique doit être composé de caractères ASCII alphanumériques et doit commencer par un caractère alphabétique. Ainsi, la chaîne de caractères est syntaxiquement parlant un nom XML. Une implémentation est libre de générer un identificateur de la façon qui lui est la plus appropriée de telle manière qu'un même identificateur est toujours généré pour le même noeud et différents identificateurs sont toujours générés à partir de noeuds différents. Une implémentation n'est pas obligée de générer les mêmes identificateurs chaque fois qu'un document subi une transformation. Rien ne garanti identificateur unique généré sera est distinct de n'importe quel IDs unique spécifié dans le document source. Si l'ensemble de noeuds reçu en argument est vide la fonction retourne la chaîne de caractères vide. Si l'argument est omis, il est remplacé par le noeud contexte.
Fonction: objectsystem-property(string)
L'argument de cette fonction doit être évalué par une chaîne de caractères de type QName. Le QName est étendu en un nom utilisant la déclaration de l'espace de noms dans la portée de l'expression. La fonction system-property retourne un objet représentant la valeur de la propriété système identifiée par le nom. Si une telle propriété système n'existe pas alors la chaîne de caractères vide est retournée.
Les implémentations doivent fournir les propriétés système suivantes qui sont toutes dans l'espace de noms XSLT :
xsl:version
, il s'agit d'un nombre qui indique la version de XSLT
supportée par le processeur; Cette valeur est 1.0 pour les processeurs
XSLT implémentant la version de XSLT spécifiée dans
ce document<!-- Category: instruction -->
L'instruction xsl:message permet d'envoyer un message d'une manière qui dépend du processeur XSLT. Le contenu de l'instruction xsl:message est un modèle. L'instruction xsl:message est instanciée par l'instanciation du contenu afin de créer un fragment XML. Le fragment XML est le contenu du message.
NOTE: xsl:message peut être implémenté par un processeur XSLT de telle sorte qu'il déclenche une dialogue popup d'alerte, ou en écrivant dans un fichier log.
Si la valeur de l'attribut terminate est yes alors, le processeur XSLT doit terminer son traitement après l'envoi du message. La valeur par défaut est no.
Pour la localisation des messages, un moyen pratique consiste à stocker l'information localisée (texte des messages, etc.) dans un document XML qui devient un fichier d'entrée additionnel pour la feuille de style. Supposons par exemple que les messages pour une langue L sont stockés dans un fichier XML resources/L.xml sous la forme :
<messages>
<message name="problem">A problem was detected.</message>
<message name="error">An error was detected.</message>
</messages>
La feuille de style doit alors utiliser l'approche suivante pour localiser les messages :
<xsl:param name="lang" select="en"/>
<xsl:variable name="messages"
select="document(concat('resources/', $lang, '.xml'))/messages"/>
<xsl:template name="localized-message">
<xsl:param name="name"/>
<xsl:message>
<xsl:value-of select="$messages/message[@name=$name]"/>
</xsl:message>
</xsl:template>
<xsl:template name="problem">
<xsl:call-template name="localized-message"/>
<xsl:with-param name="name">problem</xsl:with-param>
</xsl:call-template>
</xsl:template>
XSLT autorise 2 sortes d'extension, l'une s'applique aux éléments, l'autre aux fonctions.
Cette version de XSLT ne fournit aucun mécanisme de définition des implémentations d'extension. Aussi, une feuille de styles XSLT qui se veut portable entre différentes implémentations de XSLT ne peut-elle pas dépendre d'extensions spécifiques. XSLT fournit des mécanismes qui permettent à une feuille de styles XSLT de déterminer si le processeur XSLT qui la traite est capable de traiter des extensions particulières, et de spécifier ce qui doit arriver quand les extensions ne sont pas disponibles. Si une feuille de styles XSLT est écrite en faisant attention à l'utilisation de ces mécanismes, alors il lui est possible de tirer partie des extensions tout en restant portable sur n'importe quelle implémentation de XSLT.
Le mécanisme d'extension d'éléments permet de désigner des espaces de noms comme étant des espaces de noms d'extension. Lorsqu'un espace de noms est qualifié d'espace de noms d'extension, et qu'un élément dont le nom fait partie de cet espace est utilisé dans un modèle, alors cet élément est traité comme une instruction plutôt que comme un élément résultat littéral. L'espace de nom détermine alors la sémantique de l'instruction.
NOTE : Puisqu'un
élément fils d'un élément xsl:stylesheet
n'apparaît pas dans le modèle, les éléments
de haut niveau non-XSLT ne sont pas des extensions d'éléments
telles que définies ici, et rien dans cette section ne s'applique à
eux.
On qualifie un espace de noms d'espace de noms d'extension en utilisant soit
l'attribut extension-element-prefixes de l'élément xsl:stylesheet
soit l'attribut xsl:extension-element-prefixes sur un élément
résultat littéral ou un élément extension. La valeur
de ces attributs est une liste de préfixes d'espaces de noms séparés
par des espaces. L'espace de nom lié à chacun de ces préfixes
se nomme espace de noms d'extension. Une erreur doit être signalée
si aucun espace de noms n'est rattaché au préfixe utilisé
par l'élément porteur de l'attribut extension-element-prefixes
ou xsl:extension-element-prefixes. L'espace de noms par défaut (tel que
déclaré par xmlns) peut être désigné comme
un espace de noms d'extension, en incluant #default dans la liste des préfixes
d'espaces de noms. La désignation d'un espace de noms comme espace de
noms d'extension est effective à l'intérieur du sous arbre de
la feuille de styles dont la racine est l'élément porteur de l'attribut
extension-element-prefixes ou de l'attribut xsl:extension-element-prefixes.
Les sous-arbres qui ont pout racine l'élément xsl:stylesheet
,
alors il n'inclue aucune des feuilles de style importées ou incluses
de cet élément xsl:stylesheet
.
Si le processeur XSLT ne dispose pas d'implémentation pour un élément extension particulier, alors la fonction element-available doit retourner la valeur faux pour le nom de l'élément. Quand un tel élément extension est instancié, le processeur XSLT doit exécuter un retour pour l'élément tel que spécifié en [15 Reprise]. Un processeur XSLT ne doit pas signaler d'erreur simplement parce qu'un modèle contient une extension d'élément pour laquelle il n'y aurait aucune implémentation disponible.
Si le processeur XSLT dispose d'une implémentation pour un élément extension particulier, alors la fonction element-available doit retourner la valeur vraie pour le nom de l'élément.
Si, dans une expression d'appel de fonction (FunctionCall), un nom de fonction (FunctionName) n'est pas conforme à un sans deux points (NCName) (c'est à dire s'il contient le caractère deux points), alors il est traité comme un appel à une fonction d'extension. Le nom de la fonction (FunctionName) est étendu en un nom utilisant la déclaration d'espace de noms trouvé dans son contexte d'évaluation.
Si le processeur XSLT n'a pas d'implémentation particulière pour un nom d'fonction d'extension, alors la fonction "fonctions disponibles" (function-available) doit retourner la valeur faux pour ce nom de fonction. Si une telle fonction d'extension survient dans une expression et si l'fonction d'extension est en cours d'appel, le processeur XSLT doit signaler une erreur. Un processeur XSLT ne doit pas signaler d'erreur simplement parce qu'une expression contient une fonction extension inconnue.
Si le processeur XSLT dispose de l'implémentation d'une fonction d'extension particulière, alors la fonction function-available (fonction-disponible) doit retourner la valeur vrai pour ce nom de fonction. Lorsque cette extension est appelée, alors le processeur XSLT doit exécuter l'implémentation correspondante en lui passant les arguments effectifs. Le résultat retourné par l'implémentation est renvoyé comme résultat de l'appel de la fonction.
<!--Catégorie:
instruction -->
<xsl:fallback>
<!-- Contenu: modèle -->
</xsl:fallback>
Théoriquement, l'instanciation de l'élément xsl:fallback ne fait rien. Cependant, quand un processeur XSLT exécute un reprise sur un élément d'instructions, si l'élément d'instruction a un ou plusieurs éléments fils xsl:fallback, alors le contenu de chacun de ces fils xsl:fallback doit être instancié séquentiellement ; sinon une erreur doit être signalée. Le contenu d'un élément xsl:fallback est un modèle.
Les fonctions suivantes peuvent être utilisées avec les instructions
xsl:choose
et xsl:if
pour contrôler explicitement le
comportement de la feuille de styles dans son traitement du cas particulier
des éléments et fonctions indisponibles.
Fonction: booléen element-available (chaîne de caractère)
La chaîne de caractères passée en argument doit être un nom qualifié (QName). Le nom qualifié (QName) est expansé pour donner un nom expansé (expanded-name) utilisant les déclarations d'espaces de noms dans le champ de l'expression. La fonction element-available retourne la valeur vraie si et seulement si le nom expansé est le nom d'une instruction. Si le nom expansé a une URI d'espace de noms égale à l'URI de l'espace de noms de XSLT, alors il référence un élément défini par XSLT. Autrement, il référence un élément extension. Si l'URI de l'espace de nom du nom expansé est nulle, la fonction element-available doit retourner la valeur faux.
Fonction : booléen function-available(chaîne de caractères)
L'argument doit s'évaluer en une chaîne de caractères de type nom qualifié. Le nom qualifié est résolu en un nom expansé utilisant les déclarations d'espaces de noms pour l'expression. La fonction function-available retourne la valeur vraie si et seulement si le nom expansé est celui d'une fonction de la bibliothèque de fonctions. Si l'URI de l'espace de noms du nom expansé n'est pas une chaîne vide, alors il s'agit d'une fonction d'extension ; sinon, il s'agit d'une fonction définie par XPath ou XSLT.
<!-- 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 />
Un processeur XSLT peut produire l'arbre résultat comme une séquence d'octets, bien que cette fonctionnalité ne soit pas obligatoire (voir [17 Conformité]). L'élément xsl:output permet aux auteurs de feuilles de styles de spécifier la manière dont ils souhaitent produire l'arbre résultat. Si un processeur XSLT produit un arbre résultat, il doit le faire conformément à ce qui est spécifié avec l'élément xsl:output; Toutefois, il n'est pas demandé de le faire ainsi.
L'élément xsl:output est uniquement autorisé comme élément de haut niveau.
L'attribut method de l'élément xsl:output identifie la méthode générale qui doit être utilisée pour produire l'arbre résultat. Sa valeur doit être un nom qualifié. Si ce nom qualifié n'est pas préfixé, alors il identifie une méthode spécifiée dans ce document et doit prendre l'une des valeurs suivantes : xml, html ou text. Si le nom qualifié est préfixé, alors il est résolu en un nom expansé tel que décrit au chapitre [2.4 Noms qualifiés]; Le nom expansé identifie la méthode de sortie; le comportement, dans ce cas, n'est pas spécifié dans ce document.
La valeur par défaut de l'attribut method est choisie comme suit :
Si
l'élément racine de l'arbre résultat a un élément enfant
le nom expansé du premier élément enfant du noeud racine (par exemple l'élément document) de l'arbre résultat a une partie locale html (quelques soient les combinaisons majuscule/minuscule) et une URI d'espace de nom nulle
tout noeud textuel précédent le premier élément enfant de l'élément racine de l'arbre résultat ne contient que des caractères d'espaces blancs
alors la méthode de sortie par défaut est html;
Sinon, la méthode est xml.
La méthode de sortie par défaut doit être utilisée s'il n'y a pas d'élément xsl:output ou si aucun des éléments xsl:output ne spécifie une valeur pour l'attribut method.
Les autres attributs de l'élément xsl:output sont des paramètres de la méthode de sortie qui sont :
version spécifie la version de la méthode de sortie.
indent spécifie si le processeur XSLT est autorisé à rajouter des espaces blancs additionnels pendant qu'il génère l'arbre résultat; la valeur ne peut être que yesou no.
encoding spécifie le système de codage de caractères préférentiel que le processeur XSLT doit utiliser pour représenter des séquences de caractères en tant que séquences d'octets; la valeur de cet attribut doit être traîtée sans tenir compte de la casse; la valeur ne peut contenir que des caractères compris entre #x21 et #x7E (c'est à dire les caractères imprimables de l'ASCII); la valeur doit soit être un jeu de caractères charset enregistré auprès de l'IANA [IANA], [RFC2278] soit commencer par X-.
media-type spécifie le type de support (type de contenu MIME) des données issues de l'arbre résultat; le paramètre charset ne doit pas être spécifié explicitement; au lieu de cela, quand le type de support de plus haut niveau est text, un paramètre charset doit être rajouté en conformité avec le codage des caractères en vigueur pour la méthode de sortie.
doctype-system spécifie l'identifiant système qui doit être utilisé dans la déclaration de type de document.
doctype-public spécifie l'identifiant public qui doit être utilisé dans la déclaration de type de document.
omit-xml-declaration spécifie si le processeur XSLT doit produire une déclaration XML; la valeur est obligatoirement yes ou no
standalone spécifie si le processeur XSLT doit générer une déclaration de document autonome; la valeur doit être yes ou no
cdata-section-elements spécifie une liste de noms d'éléments dont les fils de type noeud texte doivent être produit en tant que section CDATA dans l'arbre résultat.
Le sémantique détaillée de chaque attribut sera décrite séparemment pour chaque méthode de sortie à laquelle l'attribut est applicable. Si la sémantique de l'attribut n'est pas décrite pour une méthode de sortie, alors cela signifie que cette méthode ne lui est pas applicable.
Une feuille de styles peut contenir plusieurs éléments xsl:output et peut inclure ou importer des feuilles de style qui contiennent aussi des éléments xsl:output. Tous les éléments xsl:output intervenant dans une feuille de styles sont fusionnés au sein d'un seul élément effectif xsl:output. La valeur effective de l'attribut cdata-section-elements est l'union des valeurs spécifiées. Pour les autres attributs, la valeur effective est la valeur spécifiée ayant la plus grande priorité d'importation. La présence de plus d'une telle valeur pour un attribut est une erreur. Un processeur XSLT peut signaler l'erreur; s'il ne le fait pas, il doit traiter l'erreur en utilisant la valeur qui apparaît en dernier dans la feuille de styles. Les valeurs des attributs sont prises par défaut après que les éléments xsl:output aient été fusionnés; différentes méthodes de sortie peuvent avoir différentes valeur par défaut pour un attribut.
La méthode de sortie xml produit l'arbre résultat sous la forme d'une entité générale XML bien formée et correcte. Si le noeud racine de l'arbre résultat a un unique fils et aucun autre fils de type texte, alors l'entité devrait aussi être bien formée. Si l'entité est référencée dans un document XML simple comme dans l'exemple suivant,
<!DOCTYPE doc [
<!ENTITY e SYSTEM "entity-URI">
]>
<doc>&e;</doc>
dans lequel entity-URI est l'URI de l'entité, alors le document englobant doit être globalement un document XML bien formé conforme aux Recommandations des Espaces de Noms XML [Noms XML]. De plus, le résultatdoit être tel que si un nouvel arbre était produit à partir du document englobant pris comme document XML conformément aux spécifications faites en [3 Modèle de données], puis en enlevant l'élément document et en faisant de ses enfants des enfants de l'élément racine, alors le nouvel arbre serait le même que l'arbre résultat, aux possibles exceptions suivantes près :
L'ordre des attributs pourrait être différent dans les deux arbres.
Le nouvel arbre pourrait contenir des noeuds d'espaces de noms qui n'étaient pas présents dans l'arbre résultat initial.
NOTE : Un processeur XSLT pourrait avoir besoin de rajouter des déclarations d'espaces de noms pendant la génération au format XML, de l'arbre résultat.
Si le processeur XSLT avait généré une déclaration de type de document à cause de l'attribut doctype-system, alors les conditions ci-dessus s'appliquent à l'entité dans laquelle la déclaration de type de document générée aura été enlevée.
L'attribut version
spécifie la version de XML à
considérer pour produire l'arbre résultat. Si le processeur
XSLT ne supporte pas cette version de XML, il doit utiliser une version
de XML qu'il supporte. La version mentionnée dans la déclaration
XML (si la déclaration XML est produite) doit correspondre à
la version de XML que le processeur aura utilisé pour produire l'arbre
résultat. La valeur de l'attribut version
doit être
conforme à la règle de production VersionNum
définie dans les Recommandations XML (XML Recommendation [XML]).
La valeur par défaut est 1.0.
L'attribut encoding spécifie le codage préférentiel à utiliser pour produire l'arbre résultat. Des processeurs XSLT sont requis pour respecter les valeurs de UTF-8 et UTF-16. Pour les autres valeurs, si le processeur XSLT ne supporte pas le codage spécifié il peut généré une erreur; s'il ne signale pas d'erreur il doit utiliser UTF-8 ou UTF-16 à la place. Le processeur XSLT ne doit pas utiliser d'encodage dont le nom n'est pas conforme à la règle de production des noms d'encodage (EncName) de la Recommandation XML (XML Recommendation [XML]). Si aucun attribut encoding n'est spécifié, alors le processeur XSLT doit utiliser soit UTF-8 soit UTF-16. l est possible que l'arbre résultat contienne un caractère qui ne puisse pas être représenté dans le système d'encodage que le processeur XSLT utilise. Dans ce cas, si le caractère apparaît dans un contexte où XML reconnaît les références de caractères (c'est à dire dans la valeur d'un noeud d'attribut ou d'un noeud textuel), alors le caractère produit devra l'être sous la forme d'une référence de caractère; sinon (par exemple, si le caractère se produit dans le nom d'un élément) le processeur XSLT doit signaler une erreur.
Si la valeur de l'attribut indent est Yes, alors la méthode de sortie xml peut produire des espaces blancs en plus de ceux de l'arbre résultat (peut-être basé sur les espaces blancs épurés soit du document source soit de la feuille de styles) dans le but d'indenter le résultat proprement; si l'attribut indent a la valeur no, il ne doit produire aucun espace blanc additionnel. La valeur par défaut est no. La méthode de sortie xml doit utiliser un algorithme pour rajouter les espaces blancs additionnels qui garantisse que le résultat, si les espaces blancs venaient à être supprimé de la sortie en utilisant le processus décrit en [3.4 Suppression des espaces blancs] et en réduisant l'ensemble des éléments conservant les espaces blancs au seul cas xsl:text, serait le même, que les espaces blancs additionnels soit mis dans la sortie ou qu'ils ne le soient pas.
NOTE : Il n'est normalement pas fiable d'utiliser indent="yes" avec des types de documents qui contiennent des types d'éléments à contenu mixte.
L'attribut cdata-section-elements contient une liste de noms qualifiés séparés par des espaces blancs. Chaque nom qualifié est expansé pour former un nom expansé en utilisant les déclarations d'espaces de noms en vigueur sur l'élément xsl:output dans lequel le nom qualifié apparaît; s'il existe un espace de noms par défaut, il sera utilisé pour les noms qualifiés qui n'ont pas de préfixe. L'expansion est réalisée avant que la fusion des éléments multiples xsl:output en un seul élément xsl:output ait lieu. Si le nom expansé d'un parent d'un noeud textuel est un membre de la liste, alors le noeud textuel doit être sorti en tant que paragraphe de type CDATA. Par exemple,
<xsl:output cdata-section-elements="example"/>
appliqué à un élément résultat littéral écrit dans la feuille de styles comme ceci :
<example><foo></example>
ou comme :
<example><![CDATA[<foo></example>
donnerait en sortie le même résultat que :
<example><![CDATA[<foo></example>
Si le noeud textuel contient la séquence de caractères, alors la section CDATA actuellement ouverte devrait être fermée après le ]] et une nouvelle section CDATA ouverte avant le >. Par exemple, un élément résultat littéral écrit dans la feuille de style de cette manière :
<example>]]></example>
serait sorti comme
<example><![CDATA[]]<![CDATA[></example>
Si le noeud de type texte contient un caractère qui n'appartient pas au jeu de caractères en cours d'utilisation pour la génération de l'arbre résultat, alors la section CDATA courante doit être fermée juste avant la génération dudit caractère ; le caratère doit alors être généré en tant qu'une référence de caractère ou une référence d'entité, et une nouvelle section CDATA doit être ouverte pour la génération des caractères restant du noeud de type texte.
Les sections CDATA doivent être utilisées exclusivement pour les noeuds de type texte dont l'attribut cdata-section-elements spécifie explicitement qu'ils doivent être généré en utilisant des sections CDATA.
La méthode de sortie xml doit produire une déclaration XML à moins que l'attribut omit-xml-declaration a la valeur yes. La déclaration XML doit inclure aussi bien une information de version qu'une déclaration d'encodage. Si l'attribut standalone est spécifié, la sortie doit comporter une déclaration pour un document autonome dont la valeur est la même que celle spécifiée dans l'attribut standalone. Sinon, elle ne doit pas inclure de déclaration pour un document autonome ; Ceci garantit que c'est à la fois une déclaration XML (autorisée au début d'une entité document) et une déclaration textuelle (autorisée au début d'une entité générale externe valide).
Si l'attribut doctype-system est spécifié, la méthode de sortie xml doit générer une déclaration de type de document immédiatement avant le premier élément. Le nom suivant <!DOCTYPE doit être celui du premier élément. Si l'attribut doctype-public est également spécifié, alors la méthode de sortie xml doit générer la chaîne de caractères PUBLIC suivie de l'identifiant public et de l'identifiant système; sinon, la méthode doit générer la chaîne de caractères SYSTEM suivie de l'identifiant système. Le sous ensemble local de déclaration doit être vide. L'attribut doctype-public doit être ignoré à moins que l'attribut doctype-system soit renseigné.
L'attribut media-type est applicable à la méthode de sortie xml. La valeur par défaut de l'attribut media-type est text/xml.
La méthode de sortie html produit un arbre résultat conforme à HTML; par exemple,
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
...
</xsl:stylesheet>
L'attribut version
indique la version d'HTML. La valeur par
défaut est 4.0, ce qui spécifie que le résultat
doit être conforme aux recommandations de HTML 4.0 [HTML].
La méthode de sortie html ne devrait pas sortir les éléments différemment de la méthode xml sauf si l'URI du nom expansé de l'élément a un espace de nom nul; un élément dont le nom expansé a une URI d'espace de nom non nulle doit être sorti comme pour XML. Si le nom expansé de l'élément a une URI d'espace de nom nulle, et que la partie locale du nom expansé n'est pas reconnue comme étant le nom d'un élément HTML, alors l'élément doit être sorti de la même manière qu'un élément non vide, en ligne, tel que span.
La méthode de sortie html ne devrait pas produire de balise fermante pour les éléments vides. En HTML 4.0, les éléments vides sont area, base, basefont, br, col, frame, hr, img, input, isindex, link, meta et param. Par exemple, un élément écrit <br/> ou <br></br> dans la feuille de styles est généré sous la forme <br> en sortie.
La méthode de sortie html devrait reconnaître les noms des éléments HTML indépendamment de leur casse. Par exemple, les éléments nommés br, BR ou Br doivent tous être reconnus comme étant l'élément HTML br, et sorti sans balise de fin.
La méthode de sortie html ne doit pas masquer le contenu des éléments script et style. Par exemple, un élément résultat littéral écrit dans la feuille de styles de la manière suivante :
<script>if (a < b) foo()</script>
ou
<script><![CDATA[if (a < b) foo()</script>
doit produire le résultat suivant :
<script>if (a < b) foo()</script>
La méthode de sortie html ne doit pas masquer les caractères < qui apparaissent dans les valeurs d'attributs.
Si l'attribut indent a la valeur yes, alors la méthode de sortie html peut rajouter ou retirer des espaces blancs pendant la sortie de l'arbre résultat, tant que cela ne change pas comment un agent utilisateur de HTML interpréterait la sortie. La valeur par défaut est yes.
La méthode de sortie html doit traiter les caractères non-ASCII dans les valeurs d'attribut d'URI en utilisant la méthode recommandée à la section B.2.1 des recommandations de HTML 4.0.
La méthode de sortie html peut utiliser une référence d'entité caractère pour produire un caractère, si une telle entitté est définie pour ce caractère dans la version de HTML que la méthode de sortie utilise.
La méthode de sortie html devrait clore les instructions de traitement en utilisant le caractère > plutôt que ?>.
La méthode de sortie html devrait générer les attributs de type booléen (les attributs qui ne peuvent prendre qu'une seule valeur possible : leur propre nom) sous une forme minimale. Par exemple, une balise ouvrante écrite dans la feuille de styles de la manière suivante :
<OPTION selected="selected">
doit produire le résultat suivant :
<OPTION selected>
La méthode de sortie html doit tenir compte du caractère & quand il apparaît dans une valeur d'attribut et qu'il est suivi du caractère{ (voir Section B.7.1 de la recommandation 4.0). Par exemple, une balise ouvrante écrite dans la feuille de styles de la manière suivante
<BODY bgcolor='&{{randomrbg}};'>
doit être sorti comme ceci :
<BODY bgcolor='&{randomrbg};'>
L'attribut encoding spécifie le codage de caractères à utiliser de préférence. S'il y a un élément HEAD, alors la méthode de sortie de html doit rajouter immédiatement après, un élément META spécifiant le codage utilisé. Par exemple,
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
...
Il est possible que l'arbre résultat contienne un caractère qui ne puisse pas être représenté dans le codage que le processeur XSLT utilise pour la sortie. Dans ce cas, si le caractère apparaît dans un contexte où HTML reconnaît les références de caractères, alors le caractère doit être généré en tant qu'entité caractère ou en tant qu'une référence numérique décimale de caractère ; sinon (par exemple, cas des éléments script ou style et des commentaires), le processeur XSLT doit signaler une erreur.
Si les attributs doctype-public ou doctype-system sont précisés, alors la méthode de sortie html doit produire un déclaration de type de document immédiatement avant le premier élément. Le nom suivant <!DOCTYPE doit être HTML ou html. Si l'attribut doctype-public est spécifié, alors la méthode de sortie doit produire le mot PUBLIC suivi de l'identifiant public spécifié; si l'attribut doctype-system est également spécifié, la méthode devra également sortir l'identifiant système spécifié suivi de l'identifiant public. Si l'attribut doctype-system est spécifié mais que l'attribut doctype-public ne l'est pas, alors la méthode de sortie doit produire le mot SYSTEM suivi par l'identifiant système.
L'attribut media-type n'est applicable qu'à la méthode de sortie html. La valeur par défaut est text/html.
La méthode de sortie text produit l'arbre résultat en sortant les valeurs textuelles de chaque noeud de l'arbre résultat, dans l'ordre du document sans exception.
L'attribut media-type est applicable à cette méthode de sortie. Sa valeur par défaut est text/plain.
L'attribut encoding spécifie le codage que la méthode de sortie doit utiliser pour convertir les séquences de caractères en séquences d'octets. La valeur par défaut dépend du système. Si l'arbre résultat contient un caractère qui ne peut pas être représenté avec le codage choisi, alors le processeur XSLT doit signaler une erreur.
Normalement, la méthode de sortie xml conserve tel quel
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 qui soit globalement bien formée
XML sans toutefois l'être complètement; par exemple, la sortie
peut inclure des sections pas bien formées mais qui le deviendront
par un traitement ultérieur indépendant de toute syntaxe
XML. 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 <.
Désactiver la production littérale des caractères
sur un noeud textuel utilisé à autre chose (qu'un noeud textuel)
dans l'arbre de sortie est une erreur. Aussi, désactiver la production
littérale sur l'élément
xsl:value-of
ou xsl:text
qui est utilisé pour produire un commentaire, une instruction de
traitement ou un noeud d'attribut est une erreur; c'est également
une erreur que de convertir un fragment
de l'arbre résultat en un nombre ou une chaîne si ce fragment
contient un noeud textuel pour lequel la production littérale a
été désactivée. Dans les deux cas, un processeur
XSLT peut signaler une erreur; s'il ne le fait pas, il doit la rattraper
en ignorant l'attribut disable-output-escaping.
L'attribut disable-output-escaping peut être aussi bien utilisé avec la méthode de sortie html qu'avec la méthode de sortie xml. La méthode de sortie text ignore l'attribut disable-output-escaping, puisque cette méthode ne fait, de base, aucune interprétation.
Un processeur XSLT ne sera capable de désactiver la production
littérale de sortie que s'il contrôle la manière dont
l'arbre résultat est sorti. Cela n'est pas obligatoirement le cas.
Par exemple, l'arbre résultat peut être utilisé comme
arbre source pour une autre transformation XSLT. Un processeur XSLT n'est
pas obligé de supporter la fonction de désactivation de la
production littérale de caractères en sortie. Si un élément
xsl:value-of
ou xsl:text spécifie que la production littérale
doit être désactivée et que le processeur XSLT ne le
supporte pas, alors le processeur XSLT peut signaler une erreur; s'il
ne le fait pas, il doit la rattraper en ne désactivant pas l'interprétation
de sortie.
Si la production littérale de sortie est désactivée pour un caractère qui n'a pas de représentation dans le codage XSLT utilisé par le processeur en sortie, alors le processeur XSLT peut signaler une erreur; s'il ne le fait pas, il doit la rattraper en ne désactivant pas la production littérale en sortie.
Since disabling output escaping may not work with all XSLT processors and can result in XML that is not well-formed, it should be used only when there is no alternative.
Un processeur XSLT conforme doit être capable d'utiliser une feuille de styles pour transformer un arbre source en un arbre résultat d'après les spécifications écrites dans ce document. Un processeur XSLT conforme n'a pas besoin d'être capable de produire le résultat en XML où toute autre forme.
NOTE : Les vendeurs de processeurs XSLT sont fortement encouragés à fournir un moyen de vérifier que leurs processeurs ont un comportement conforme en permettant que l'arbre résultat soit sorti sous forme XML ou en fournissant un accès à l'arbre résultat au travers d'une API standard telle que DOM ou SAX.
Un processeur XSLT doit signaler toute erreur à l'exception de celles qui dans ce document, sont explicitement autorisées à ne pas être signalées. un processeur XSLT n'est pas obligé de récupérer toutes les erreurs bien que cela puisse se réveler nécessaire.
Un processeur XSLT conforme peut imposer des limites sur les ressources de traitement consommées par le traitement d'une feuille de styles.
La spécification de chaque type d'élément défini pour XSLT est précédée par un résumé de sa syntaxe sous la forme d'un modèle pour les éléments de ce type d'élément. La signification de la notation syntaxique résumée est comme suit :
Un attribut est requis si et seulement si son nom est en gras.
La chaîne de caractères écrite à la place de la valeur d'attribut spécifie les valeurs d'attributs autorisées pour l'attribut. Si cette chaîne est encadrée par des accolades, elle représente alors une forme architecturale de la valeur d'attribut, et les valeurs d'attributs autorisées sont celles obtenues lors de l'instanciation de cette forme architecturale. Le connecteur | représente le ou, les valeurs listées séparées par ce connecteur sont mutuellement exclusive. Une chaîne entre cotes signifie que la valeur de l'attribut doit être égale à cette chaîne spécifique. Un nom sans cote, en italique est une spécification d'un type particulier de valeur d'attribut.
Si l'élément ne doit pas avoir un contenu vide, alors il contient un commentaire spécifiant le contenu autorisé. Le contenu autorisé est spécifié de la même manière pour une déclaration de type d'élément en XML ; template signifie que n'importe quel combinaison de noeuds textuels, éléments résultat littéraux, éléments d'extension, et des éléments XSLT de la catégorie instruction est autorisée ; top-level-element signifie que toute combinaison d'éléments XSLT de la catégorie top-level-element est autorisée.
L'élément est préfacé par des commentaires indiquant s'il appartient à la catégorie instruction ou top-level-element ou aux deux. La catégorie d'un élément ne fait que signaler s'il est autorisé dans les contenus dont les modèles de contenus sont du type modèle ou éléments de hauts niveaux.
<!-- Catégorie : instruction-->
<xsl:apply-imports />
<!-- Catégorie : instruction-->
<xsl:apply-templates
select = node-set-expression
mode = qname>
<!-- Contenu : (xsl:sort
| xsl:with-param)* -->
</xsl:apply-templates>
<!-- Catégorie : instruction-->
<xsl:attribute
name = { qname }
namespace = { uri-reference }>
<!-- Contenu : modèle -->
</xsl:attribute>
<!-- Catégorie : élémentde
haut niveau -->
<xsl:attribute-set
name = qname
use-attribute-sets = qnames>
<!-- Contenu : xsl:attribute*-->
</xsl:attribute-set>
<!-- Catégorie : instruction-->
<xsl:call-template
name = qname>
<!-- Contenu : xsl:with-param*-->
</xsl:call-template>
<!-- Catégorie : instruction-->
<xsl:choose>
<!-- Contenu : (xsl:when+,
xsl:otherwise?) -->
</xsl:choose>
<!-- Catégorie : instruction-->
<xsl:comment>
<!-- Contenu : modèle -->
</xsl:comment>
<!-- Catégorie : instruction-->
<xsl:copy
use-attribute-sets = qnames>
<!-- Contenu : modèle -->
</xsl:copy>
<!-- Catégorie : instruction-->
<xsl:copy-of
select = expression />
<!-- Catégorie : élément
de haut niveau -->
<xsl:decimal-format
name = qname
decimal-separator = char
grouping-separator = char
infinity = string
minus-sign = char
NaN = string
percent = char
per-mille = char
zero-digit = char
digit = char
pattern-separator = char />
<!-- Catégorie : instruction-->
<xsl:element
name = { qname }
namespace = { uri-reference }
use-attribute-sets = qnames>
<!-- Contenu : modèle -->
</xsl:element>
<!-- Catégorie : instruction-->
<xsl:fallback>
<!-- Contenu : modèle -->
</xsl:fallback>
<!-- Catégorie : instruction-->
<xsl:for-each
select = node-set-expression>
<!-- Contenu : (xsl:sort*,
modèle) -->
</xsl:for-each>
<!-- Catégorie : instruction-->
<xsl:if
test = boolean-expression>
<!-- Contenu : modèle -->
</xsl:if>
<xsl:import
href = uri-reference />
<!-- Catégorie : élément
de haut niveau -->
<xsl:include
href = uri-reference />
<!-- Catégorie : élément
de haut niveau -->
<xsl:key
name = qname
match = pattern
use = expression />
<!-- Catégorie : instruction-->
<xsl:message
terminate = "yes" | "no">
<!-- Contenu : modèle -->
</xsl:message>
<!-- Catégorie : élément
de haut niveau -->
<xsl:namespace-alias
stylesheet-prefix = prefix | "#default"
result-prefix = prefix | "#default" />
<!-- Catégorie : instruction-->
<xsl:number
level = "single" | "multiple" | "any"
count = pattern
from = pattern
value = number-expression
format = { string }
lang = { nmtoken }
letter-value = { "alphabetic" | "traditional" }
grouping-separator = { char }
grouping-size = { number } />
<xsl:otherwise>
<!-- Contenu : modèle -->
</xsl:otherwise>
<!-- 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 />
<!-- Catégorie : élément
de haut niveau -->
<xsl:param
name = qname
select = expression>
<!-- Contenu : modèle -->
</xsl:param>
<!-- Catégorie : élément
de haut niveau -->
<xsl:preserve-space
elements = tokens />
<!-- Catégorie : instruction-->
<xsl:processing-instruction
name = { ncname }>
<!-- Contenu : modèle -->
</xsl:processing-instruction>
<xsl:sort
select = string-expression
lang = { nmtoken }
data-type = { "text" | "number" | qname-but-not-ncname
}
order = { "ascending" | "descending" }
case-order = { "upper-first" | "lower-first" } />
<!-- Catégorie : élément
de haut niveau -->
<xsl:strip-space
elements = tokens />
<xsl:stylesheet
id = id
extension-element-prefixes = tokens
exclude-result-prefixes = tokens
version = number>
<!-- Contenu : (xsl:import*,
top-level-elements)
-->
</xsl:stylesheet>
<!-- Catégorie : élément
de haut niveau -->
<xsl:template
match = pattern
name = qname
priority = number
mode = qname>
<!-- Contenu : (xsl:param*,
modèle) -->
</xsl:template>
<!-- Catégorie : instruction-->
<xsl:text
disable-output-escaping = "yes" | "no">
<!-- Contenu : #PCDATA -->
</xsl:text>
<xsl:transform
id = id
extension-element-prefixes = tokens
exclude-result-prefixes = tokens
version = number>
<!-- Contenu : (xsl:import*,
top-level-elements)
-->
</xsl:transform>
<!-- Catégorie : instruction-->
<xsl:value-of
select = string-expression
disable-output-escaping = "yes" | "no" />
<!-- Catégorie : élément
de haut niveau -->
<!-- Catégorie : instruction -->
<xsl:variable
name = qname
select = expression>
<!-- Contenu : modèle -->
</xsl:variable>
<xsl:when
test = boolean-expression>
<!-- Contenu : modèle -->
</xsl:when>
<xsl:with-param
name = qname
select = expression>
<!-- Contenu : modèle -->
</xsl:with-param>
NOTE : Ce fragment de DTD n'est pas normatif parce que les DTDs de XML 1.0 ne supportent pas les espaces de noms XML et donc ne peuvent pas décrire correctement la structure autorisée d'une feuille de styles XSLT.
L'entité suivante peut être autorisée pour construire une DTD pour des feuilles de style XSLT qui crée des instances d'une DTD résultat particulière. Avant de référencer l'entité, la DTD de la feuille de styles doit définir une entité paramètre result-elements qui liste les types d'éléments résultat autorisés. Par exemple :
<!ENTITY % result-elements "
| fo:inline-sequence
| fo:block
">
De tels éléments résultat doivent être déclarés de manière à pouvoir être qualifiés par les attributs xsl:use-attribute-sets eet xsl:extension-element-prefixes. L'entité suivante déclare le paramètre result-element-atts à cette fin. Le contenu que XSLT autorise pour les éléments résultat est le même que celui autorisé pour les éléments XSLT déclarés dans l'entité suivante et dont le modèle de contenu est %template;. La DTD peut utiliser un modèle de contenu plus restrictif que %template; pour faire apparaître les contraintes de la DTD résultat.
La DTD peut définir l'entité paramètre non-xsl-top-level pour autoriser l'utilisation d'autres éléments de haut niveau que ceux pré-défini dans l'espace de noms XSLT
L'utilisation du préfixe xsl: dans cette DTD n'implique pas que les feuilles de styles XSLT doivent utiliser ce préfixe. Tout élément déclaré dans cette DTD peut avoir des attributs dont le nom commence par xmlns: ou être égal à xmlns en plus des attributs déclarés dans cette DTD.
<!ENTITY % char-instructions "
| xsl:apply-templates
| xsl:call-template
| xsl:apply-imports
| xsl:for-each
| xsl:value-of
| xsl:copy-of
| xsl:number
| xsl:choose
| xsl:if
| xsl:text
| xsl:copy
| xsl:variable
| xsl:message
| xsl:fallback
">
<!ENTITY % instructions "
%char-instructions;
| xsl:processing-instruction
| xsl:comment
| xsl:element
| xsl:attribute
">
<!ENTITY % char-template "
(#PCDATA
%char-instructions;)*
">
<!ENTITY % template "
(#PCDATA
%instructions;
%result-elements;)*
">
<!-- Utilisé pour le type d'un attribut qui est une référence
d'URI.-->
<!ENTITY % URI "CDATA">
<!-- Utilisé pour le type d'un attribut qui est un motif.-->
<!ENTITY % pattern "CDATA">
<!-- Utilisé pour le type d'un attribut qui est un modèle
de valeur d'attribut.-->
<!ENTITY % avt "CDATA">
<!-- Utilisé pour le type d'un attribut qui est un nom
qualifié; le préfixe est expansé par le processeur
XSLT. -->
<!ENTITY % qname "NMTOKEN">
<!-- Comme qname mais il s'agit d'une liste de noms
qualifiés séparés par des espaces blancs. -->
<!ENTITY % qnames "NMTOKENS">
<!-- Utilisé pour un type de valeur d'attribut qui est
une expression.-->
<!ENTITY % expr "CDATA">
<!-- Utilisé pour un type de valeur d'attribut qui est
formé d'un seul caractère.-->
<!ENTITY % char "CDATA">
<!-- Utilisé pour un type de valeur d'attribut qui est
une priorité. -->
<!ENTITY % priority "NMTOKEN">
<!ENTITY % space-att "xml:space (default|preserve) #IMPLIED">
<!-- Ceci peut être modifié pour personnaliser l'ensemble
des éléments de haut niveau autorisés. -->
<!ENTITY % non-xsl-top-level "">
<!ENTITY % top-level "
(xsl:import*,
(xsl:include
| xsl:strip-space
| xsl:preserve-space
| xsl:output
| xsl:key
| xsl:decimal-format
| xsl:attribute-set
| xsl:variable
| xsl:param
| xsl:template
| xsl:namespace-alias
%non-xsl-top-level;)*) ">
<!ENTITY % top-level-atts '
extension-element-prefixes CDATA #IMPLIED
exclude-result-prefixes CDATA #IMPLIED
id ID #IMPLIED
version NMTOKEN #REQUIRED
xmlns:xsl CDATA #FIXED "http://www.w3.org/1999/XSL/Transform"
%space-att; '>
<!-- Cette entité est définie pour être utilisée
dans une déclaration ATTLIST pour les éléments résultat.
-->
<!ENTITY % result-element-atts '
xsl:extension-element-prefixes CDATA #IMPLIED
xsl:exclude-result-prefixes CDATA #IMPLIED
xsl:use-attribute-sets %qnames; #IMPLIED
xsl:version NMTOKEN #IMPLIED '>
<!ELEMENT xsl:stylesheet %top-level;>
<!ATTLIST xsl:stylesheet %top-level-atts;>
<!ELEMENT xsl:transform %top-level;>
<!ATTLIST xsl:transform %top-level-atts;>
<!ELEMENT xsl:import EMPTY>
<!ATTLIST xsl:import href %URI; #REQUIRED>
<!ELEMENT xsl:include EMPTY>
<!ATTLIST xsl:include href %URI; #REQUIRED>
<!ELEMENT xsl:strip-space EMPTY>
<!ATTLIST xsl:strip-space elements CDATA #REQUIRED>
<!ELEMENT xsl:preserve-space EMPTY>
<!ATTLIST xsl:preserve-space elements CDATA #REQUIRED>
<!ELEMENT xsl:output EMPTY>
<!ATTLIST xsl:output
method %qname; #IMPLIED
version NMTOKEN #IMPLIED
encoding CDATA #IMPLIED
omit-xml-declaration (yes|no) #IMPLIED
standalone (yes|no) #IMPLIED
doctype-public CDATA #IMPLIED
doctype-system CDATA #IMPLIED
cdata-section-elements %qnames; #IMPLIED
indent (yes|no) #IMPLIED
media-type CDATA #IMPLIED >
<!ELEMENT xsl:key EMPTY>
<!ATTLIST xsl:key
name %qname; #REQUIRED
match %pattern; #REQUIRED
use %expr; #REQUIRED >
<!ELEMENT xsl:decimal-format EMPTY>
<!ATTLIST xsl:decimal-format
name %qname; #IMPLIED
decimal-separator %char; "."
grouping-separator %char; ","
infinity CDATA "Infinity"
minus-sign %char; "-"
NaN CDATA "NaN"
percent %char; "%"
per-mille %char; "‰"
zero-digit %char; "0"
digit %char; "#"
pattern-separator %char; ";" >
<!ELEMENT xsl:namespace-alias EMPTY>
<!ATTLIST xsl:namespace-alias
stylesheet-prefix CDATA #REQUIRED
result-prefix CDATA #REQUIRED >
<!ELEMENT xsl:template
(#PCDATA
%instructions;
%result-elements;
| xsl:param)* >
<!ATTLIST xsl:template
match %pattern; #IMPLIED
name %qname; #IMPLIED
priority %priority; #IMPLIED
mode %qname; #IMPLIED
%space-att; >
<!ELEMENT xsl:value-of EMPTY>
<!ATTLIST xsl:value-of
select %expr; #REQUIRED
disable-output-escaping (yes|no) "no" >
<!ELEMENT xsl:copy-of EMPTY>
<!ATTLIST xsl:copy-of select %expr; #REQUIRED>
<!ELEMENT xsl:number EMPTY>
<!ATTLIST xsl:number
level (single|multiple|any) "single"
count %pattern; #IMPLIED
from %pattern; #IMPLIED
value %expr; #IMPLIED
format %avt; '1'
lang %avt; #IMPLIED
letter-value %avt; #IMPLIED
grouping-separator %avt; #IMPLIED
grouping-size %avt; #IMPLIED >
<!ELEMENT xsl:apply-templates (xsl:sort|xsl:with-param)*>
<!ATTLIST xsl:apply-templates
select %expr; "node()"
mode %qname; #IMPLIED >
<!ELEMENT xsl:apply-imports EMPTY>
<!-- xsl:sort ne peut pas apparaître après un quelconque
autre élément ou caractère autre qu'un espace blanc
-->
<!ELEMENT xsl:for-each
(#PCDATA
%instructions;
%result-elements;
| xsl:sort)* >
<!ATTLIST xsl:for-each
select %expr; #REQUIRED
%space-att; >
<!ELEMENT xsl:sort EMPTY>
<!ATTLIST xsl:sort
select %expr; "."
lang %avt; #IMPLIED
data-type %avt; "text"
order %avt; "ascending"
case-order %avt; #IMPLIED >
<!ELEMENT xsl:if %template;>
<!ATTLIST xsl:if
test %expr; #REQUIRED
%space-att; >
<!ELEMENT xsl:choose (xsl:when+, xsl:otherwise?)>
<!ATTLIST xsl:choose %space-att;>
<!ELEMENT xsl:when %template;>
<!ATTLIST xsl:when
test %expr; #REQUIRED
%space-att; >
<!ELEMENT xsl:otherwise %template;>
<!ATTLIST xsl:otherwise %space-att;>
<!ELEMENT xsl:attribute-set (xsl:attribute)*>
<!ATTLIST xsl:attribute-set
name %qname; #REQUIRED
use-attribute-sets %qnames; #IMPLIED >
<!ELEMENT xsl:call-template (xsl:with-param)*>
<!ATTLIST xsl:call-template
name %qname; #REQUIRED >
<!ELEMENT xsl:with-param %template;>
<!ATTLIST xsl:with-param
name %qname; #REQUIRED
select %expr; #IMPLIED >
<!ELEMENT xsl:variable %template;>
<!ATTLIST xsl:variable
name %qname; #REQUIRED
select %expr; #IMPLIED >
<!ELEMENT xsl:param %template;>
<!ATTLIST xsl:param
name %qname; #REQUIRED
select %expr; #IMPLIED >
<!ELEMENT xsl:text (#PCDATA)>
<!ATTLIST xsl:text
disable-output-escaping (yes|no) "no" >
<!ELEMENT xsl:processing-instruction %char-template;>
<!ATTLIST xsl:processing-instruction
name %avt; #REQUIRED
%space-att; >
<!ELEMENT xsl:element %template;>
<!ATTLIST xsl:element
name %avt; #REQUIRED
namespace %avt; #IMPLIED
use-attribute-sets %qnames; #IMPLIED
%space-att; >
<!ELEMENT xsl:attribute %char-template;>
<!ATTLIST xsl:attribute
name %avt; #REQUIRED
namespace %avt; #IMPLIED
%space-att; >
<!ELEMENT xsl:comment %char-template;>
<!ATTLIST xsl:comment %space-att;>
<!ELEMENT xsl:copy %template;>
<!ATTLIST xsl:copy
%space-att;
use-attribute-sets %qnames; #IMPLIED >
<!ELEMENT xsl:message %template;>
<!ATTLIST xsl:message
%space-att;
terminate (yes|no) "no" >
<!ELEMENT xsl:fallback %template;>
<!ATTLIST xsl:fallback %space-att;>
Cet exemple est une feuille de style qui transforme des documents conformes à une DTD simple en XHTML [XHTML].
La DTD est :
<!ELEMENT doc (title, chapter*)>
<!ELEMENT chapter (title, (para|note)*, section*)>
<!ELEMENT section (title, (para|note)*)>
<!ELEMENT title (#PCDATA|emph)*>
<!ELEMENT para (#PCDATA|emph)*>
<!ELEMENT note (#PCDATA|emph)*>
<!ELEMENT emph (#PCDATA|emph)*>
La feuille de style est :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:strip-space elements="doc chapter section"/>
<xsl:output
method="xml"
indent="yes"
encoding="iso-8859-1"/>
<xsl:template match="doc">
<html>
<head>
<title>
<xsl:value-of select="title"/>
</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="doc/title">
<h1>
<xsl:apply-templates/>
</h1>
</xsl:template>
<xsl:template match="chapter/title">
<h2>
<xsl:apply-templates/>
</h2>
</xsl:template>
<xsl:template match="section/title">
<h3>
<xsl:apply-templates/>
</h3>
</xsl:template>
<xsl:template match="para">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="note">
<p class="note">
<b>NOTE : </b>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="emph">
<em>
<xsl:apply-templates/>
</em>
</xsl:template>
</xsl:stylesheet>
Avec comme document d'entrée :
<!DOCTYPE doc SYSTEM "doc.dtd">
<doc>
<title>Document Title</title>
<chapter>
<title>Chapter Title</title>
<section>
<title>Section Title</title>
<para>This is a test.</para>
<note>This is a note.</note>
</section>
<section>
<title>Another Section Title</title>
<para>This is <emph>another</emph> test.</para>
<note>This is another note.</note>
</section>
</chapter>
</doc>
le résultat serait :
<?xml version="1.0" encoding="iso-8859-1"?>
<html xmlns="http://www.w3.org/TR/xhtml1/strict">
<head>
<title>Document Title</title>
</head>
<body>
<h1>Document Title</h1>
<h2>Chapter Title</h2>
<h3>Section Title</h3>
<p>This is a test.</p>
<p class="note">
<b>NOTE : </b>This is a note.</p>
<h3>Another Section Title</h3>
<p>This is <em>another</em> test.</p>
<p class="note">
<b>NOTE : </b>This is another note.</p>
</body>
</html>
Ceci est un exemple de transformation de données représentées en XML en utilisant 3 feuilles de styles XSLT différentes pour produire 3 représentations des données : en HTML, SVG et VRML.
Les données d'entrée sont :
<sales>
<division id="North">
<revenue>10</revenue>
<growth>9</growth>
<bonus>7</bonus>
</division>
<division id="South">
<revenue>4</revenue>
<growth>3</growth>
<bonus>4</bonus>
</division>
<division id="West">
<revenue>6</revenue>
<growth>-1.5</growth>
<bonus>2</bonus>
</division>
</sales>
La feuille de style suivante, qui utilise la syntaxe simplifiée décrite en [2.3 Feuille de style sous la forme d'un élément littéral résultat], transforme les données en HTML :
<html xsl:version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
lang="en">
<head>
<title>Sales Results
By Division</title>
</head>
<body>
<table border="1">
<tr>
<th>Division</th>
<th>Revenue</th>
<th>Growth</th>
<th>Bonus</th>
</tr>
<xsl:for-each select="sales/division">
<!-- order the result by revenue -->
<xsl:sort select="revenue"
data-type="number"
order="descending"/>
<tr>
<td>
<em><xsl:value-of select="@id"/></em>
</td>
<td>
<xsl:value-of select="revenue"/>
</td>
<td>
<!-- met en valeur par du rouge la croissance négative -->
<xsl:if test="growth < 0">
<xsl:attribute name="style">
<xsl:text>color:red</xsl:text>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="growth"/>
</td>
<td>
<xsl:value-of select="bonus"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
La sortie HTML est :
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Sales Results By Division</title>
</head>
<body>
<table border="1">
<tr>
<th>Division</th><th>Revenue</th><th>Growth</th><th>Bonus</th>
</tr>
<tr>
<td><em>North</em></td><td>10</td><td>9</td><td>7</td>
</tr>
<tr>
<td><em>West</em></td><td>6</td><td style="color:red">-1.5</td><td>2</td>
</tr>
<tr>
<td><em>South</em></td><td>4</td><td>3</td><td>4</td>
</tr>
</table>
</body>
</html>
La feuille de style suivante transforme les données en SVG :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/Graphics/SVG/SVG-19990812.dtd">
<xsl:output method="xml" indent="yes" media-type="image/svg"/>
<xsl:template match="/">
<svg width = "3in" height="3in">
<g style = "stroke: #000000">
<!-- draw the axes
-->
<line x1="0" x2="150"
y1="150" y2="150"/>
<line x1="0" x2="0"
y1="0" y2="150"/>
<text x="0" y="10">Revenue</text>
<text x="150" y="165">Division</text>
<xsl:for-each select="sales/division">
<!-- define some useful variables -->
<!-- the bar's x position -->
<xsl:variable name="pos"
select="(position()*40)-30"/>
<!-- the bar's height -->
<xsl:variable name="height"
select="revenue*10"/>
<!-- the rectangle -->
<rect x="{$pos}" y="{150-$height}"
width="20" height="{$height}"/>
<!-- the text label -->
<text x="{$pos}" y="165">
<xsl:value-of select="@id"/>
</text>
<!-- the bar value -->
<text x="{$pos}" y="{145-$height}">
<xsl:value-of select="revenue"/>
</text>
</xsl:for-each>
</g>
</svg>
</xsl:template>
</xsl:stylesheet>
La sortie SVG est :
<svg width="3in" height="3in"
xmlns="http://www.w3.org/Graphics/SVG/svg-19990412.dtd">
<g style="stroke: #000000">
<line x1="0" x2="150"
y1="150" y2="150"/>
<line x1="0" x2="0"
y1="0" y2="150"/>
<text x="0" y="10">Revenue</text>
<text x="150" y="165">Division</text>
<rect x="10" y="50"
width="20" height="100"/>
<text x="10" y="165">North</text>
<text x="10" y="45">10</text>
<rect x="50" y="110"
width="20" height="40"/>
<text x="50" y="165">South</text>
<text x="50" y="105">4</text>
<rect x="90" y="90"
width="20" height="60"/>
<text x="90" y="165">West</text>
<text x="90" y="85">6</text>
</g>
</svg>
La feuille de style suivante produit les données en VRML :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- gébère le texte en sortie avec l'extensoin
mime model/vrml, en utilisant un jeu de caractères par défaut
-->
<xsl:output method="text" encoding="UTF-8" media-type="model/vrml"/>
<xsl:template match="/">#VRML
V2.0 utf8
# externproto definition d'un élément barre
EXTERNPROTO bar [
field SFInt32 x
field SFInt32 y
field SFInt32 z
field SFString name
]
"http://www.vrml.org/WorkingGroups/dbwork/barProto.wrl"
# inline contenant les axes du graphique Inline {
url "http://www.vrml.org/WorkingGroups/dbwork/barAxes.wrl"
}
<xsl:for-each select="sales/division"> bar {
x <xsl:value-of select="revenue"/>
y <xsl:value-of select="growth"/>
z <xsl:value-of select="bonus"/>
name "<xsl:value-of
select="@id"/>"
}
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
La sortie VRML est :
#VRML V2.0 utf8
# externproto definition d'un élément barre
EXTERNPROTO bar [
field SFInt32 x
field SFInt32 y
field SFInt32 z
field SFString name
]
"http://www.vrml.org/WorkingGroups/dbwork/barProto.wrl"
# inline contenant les axes du graphique Inline {
url "http://www.vrml.org/WorkingGroups/dbwork/barAxes.wrl"
}
bar {
x 10
y 9
z 7
name "North"
}
bar {
x 4
y 3
z 4
name "South"
}
bar {
x 6
y -1.5
z 2
name "West"
}
Les personnes suivantes ont contribué à la rédaction de cette épreuve :
Cette spécification a été développée et
approuvée pour publication par le groupe de travail du W3C sur XSL (W3C
XSL Working Group). L'approbation de cette spécification par le groupe
de travail n'implique pas nécessairement que tous les membres du groupe
de travail aient votés en faveur de cette approbation. Les membres actuels
de ce groupe de travail sont :
Sharon Adler, IBM (Co-Chair); Anders Berglund, IBM; Perin Blanchard, Novell;
Scott Boag, Lotus; Larry Cable, Sun; Jeff Caruso, Bitstream; James Clark; Peter
Danielsen, Bell Labs; Don Day, IBM; Stephen Deach, Adobe; Dwayne Dicks, SoftQuad;
Andrew Greene, Bitstream; Paul Grosso, Arbortext; Eduardo Gutentag, Sun; Juliane
Harbarth, Software AG; Mickey Kimchi, Enigma; Chris Lilley, W3C; Chris Maden,
Exemplary Technologies; Jonathan Marsh, Microsoft; Alex Milowski, Lexica; Steve
Muench, Oracle; Scott Parnell, Xerox; Vincent Quint, W3C; Dan Rapp, Novell;
Gregg Reynolds, Datalogics; Jonathan Robie, Software AG; Mark Scardina, Oracle;
Henry Thompson, University of Edinburgh; Philip Wadler, Bell Labs; Norman Walsh,
Arbortext; Sanjiva Weerawarana, IBM; Steve Zilles, Adobe (Co-Chair)
Les points suivants sont les changements faits depuis la recommandation proposée :
L'attribut xsl:version
est requis sur un
élément résultat littéral utilisé comme
feuille de style (voir [2.3 Feuille
de style sous la forme d'un élément littéral résultat]).
L'attribut data-type de l'élément xsl:sort peut utiliser un nom préfixé pour spécifier un type de données non spécifié par XSLT (voir [10 Ordonnancement]).
Les fonctionalités suivantes sont en cours d'évaluation pour les versions de XSLT au delà de la verison 1.0 :
une expression conditionnelle;
le support des types de données et des archétypes des schémas XML;
le support de quelquechose équivalent aux règles qui étaient présentes dans la première version soumise de XSL;
un attribut pour contrôler l'espace de noms par défaut pour les noms apparaîssants dans les attributs XSLT;
le support des références d'entités;
le support des DTD dans le modèle de données;
le support des notations dans le modèle de données;
un moyen pour obtenir d'un élément la liste des éléments qui le référencent (par exemple par un attribut IDREF);
un moyen plus facile pour obtenir un ID ou une clé d'un autre document;
le support des expressions régulières pour établir des correspondances avec tout ou partie des noeuds textuels, valeurs d'attributs, noms d'attributs et les noms des types d'éléments;
les comparaisons indépendantes de la casse;
la normalisation des chaînes de caractères avant leur comparaison, par exemple pour la compatibilité des caractères;
une fonction string resolve(node-set) dont l'argument sera une URI relative que la fonction trasformera en URI absolue en s'appuyant sur l'URI de base du noeud;
les documents résultat multiples;
l'utilisation du noeud courant comme valeur par défaut de l'attribut
select
de l'élément xsl:value-of
;
un attribut sur l'élément xsl:attribute
pour
contrôler comment la valeur d'attribut est normalisée;
des attributs additionels sur l'élément xsl:sort pour fournir plus de contrôles sur les tris, comme par exemple les scripts d'ordonnancements relatifs;
un moyen de mettre un texte identifié par une URI dans l'arbre résultat;
autoriser les unions dans les étapes de localisation (par exemple foo/(bar|baz));
autoriser sur les fragments de l'arbre résultat toutes les opérations qui sont autorisées sur les ensembles de noeuds;
un moyen pour regrouper ensemble les noeuds consécutifs ayant des sous-éléments ou des attributs dupliqués;
des fonctions pour manipuler l'attribut style de HTML plus facilement.