XSLT (extensible Stylesheet Language Transformation) Table des matières 1 Introduction 2 1.1 Définition de XSL........................................... 2 1.2 Structure d une Feuille de style.................................... 3 2 Les déclarations 3 2.1 Importation de feuilles XSL...................................... 3 2.2 Inclusion de feuille XSL........................................ 3 2.3 Format de sortie............................................ 3 2.4 Gestion des espaces.......................................... 4 3 Les règles de transformation 4 3.1 Déclaration d une règle........................................ 4 3.2 Une règle pour plusieurs éléments................................... 4 3.3 Traitement des éléments fils...................................... 5 3.4 Sélection des éléments fils....................................... 5 3.5 Notre exemple............................................. 6 3.6 Une feuille sans règle......................................... 6 3.7 Exemple de feuille de style...................................... 7 3.8 Sélection des règles par paquets.................................... 7 4 Construction de l arbre résultat 8 4.1 Noeud textuel constant........................................ 8 4.2 Noeud textuel par XPATH...................................... 9 4.3 Noeud élément et attribut....................................... 9 4.4 Noeud élément et attribut dynamique................................ 10 4.5 Copie de noeuds............................................ 11 4.6 Copie du noeud courant sans le contenu et les attributs....................... 11 4.7 Liste d attributs réutilisable...................................... 12 4.8 Noeud commentaire.......................................... 12 4.9 Noeud instruction de traitement................................... 12 5 Les éléments de structure 13 5.1 Les sections conditionnelles...................................... 13 5.2 Boucle sur des ensembles de noeuds................................. 14 5.3 Tri d un ensemble de noeuds..................................... 14 1
6 Les variables XSL 15 6.1 Définition de variables......................................... 15 6.2 Priorité des règles importées..................................... 16 6.3 Priorités fixées entre les règles.................................... 16 7 Règles nommées et paramètres 17 7.1 Paramètres de règle.......................................... 17 7.2 Règles nommées............................................ 17 7.3 Paramètres d une feuille XSL..................................... 17 8 Traitement des espaces de noms 18 9 Indexation et utilitaires 19 9.1 Indexation du document XML.................................... 19 9.2 Utilitaires............................................... 20 10 Formatage des nombres 20 11 Extension d XPATH par XSL 20 12 Étendre XSLT 21 12.1 Étendre XSL avec JAVA........................................ 21 12.2 Utiliser son extension......................................... 22 12.3 Extension standard pour XSLT.................................... 22 1 Introduction 1.1 Définition de XSL XSL (extensible Stylesheet Language) c est XSLT (XSL Transformation), FO (Formatting Object) XSLT est un langage permettant de produire un document XML ou texte à partir d un autre document par application de règles de transformation. C est donc un outil essentiel dans une chaîne de traitement XML. FO est une DTD XML qui définie la présentation d un texte sur un document papier (PS, GV, PDF, DPS). 2
1.2 Structure d une Feuille de style <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0" id="identifiant (?)" > déclarations optionnelles (?) règles de transformation (?) </xsl:stylesheet> Une feuille de style XSL est un document XML (version 2.0 prête, version 3.0 en préparation). Le symbole (?) indique le caractère optionnel d un attribut ou d un élément. 2 Les déclarations 2.1 Importation de feuilles XSL Importation de feuilles XSL avec gestion de la priorité : <xsl:import href="url_de_la_feuille_xsl" /> Les règles importées sont moins prioritaires que les règles définies dans la feuille courante. Cette déclaration doit figurer en tête d une feuille de style. 2.2 Inclusion de feuille XSL Inclusion de feuilles XSL (aucun impact sur la priorité) : <xsl:include href="url_de_la_feuille_xsl" /> 2.3 Format de sortie Déclaration optionnelle du format de sortie : <xsl:output method="xml html text " (xml) version="nu_de_version" (1.0) encoding="encodage" (UTF-8) indent="yes no" (yes) xml-declaration="yes no" (yes) doctype-system="url_de_la_dtd" (?) doctype-public="fpi_de_la_dtd" (?) cdata-section-elements="liste d éléments" (?) /> 3
2.4 Gestion des espaces Politique par défaut de gestion des blancs pour les noeuds de type texte. <xsl:preserve-space elements="liste_d éléments" (!) /> <xsl:strip-space elements="liste_d éléments" (!) /> 3 Les règles de transformation 3.1 Déclaration d une règle L attribut match indique les noeuds traités par cette règle : <xsl:template match="expression_xpath" > élément(s) de remplacement (?) Fonctionnement : Dans le corps d une règle les noeuds de type texte sont recopiés les noeuds éléments XSL sont interprétés les autres noeuds éléments sont recopiés Remarque : dans le traitement du corps d une règle, le noeud par défaut est celui sur lequel s applique la règle. Exemple : <xsl:template match="section[ section ]/nom" > <p>nom : <xsl:value-of select="."/></p> 3.2 Une règle pour plusieurs éléments L attribut match peut contenir plusieurs expressions XPATH connectées par un (union des ensembles de noeuds) : <xsl:template match="expr_1 expr_2 " > élément(s) de remplacement Exemple : <xsl:template match="section chapitre definition"> <p>nom : <xsl:value-of select="nom"/></p> 4
3.3 Traitement des éléments fils Dans le corps d une règle, l élément <xsl:apply-templates/> lance le traitement sur les fils du noeud courant : Pour le fichier XML : <a> <b> <c>hello</c> </b> <b/> <a/> </a> et la feuille XSL : <xsl:template match="/"> <liste><xsl:apply-templates /></liste> <xsl:template match="a b"> <xsl:apply-templates /> <xsl:template match="c"> <c/> Nous obtenons : <liste><c/></liste> 3.4 Sélection des éléments fils Nous pouvons directement sélectionner les élements à traiter avec l attribut select de xsl:apply-templates : <xsl:template match="/"> <liste> <xsl:apply-templates select="//c" /> </liste> <xsl:template match="c"> <c/> C est une feuille XSL qui dirige le traitement. Elle est également plus rapide. 5
3.5 Notre exemple <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE stock SYSTEM "essai.dtd"> <stock> <produit> <nom> Livre </nom> <prix monnaie="francs"> 50 </prix> <comment> Un article très recherché </comment> </produit> <produit> <nom> CD </nom> <prix monnaie="euros"> 23 </prix> </produit> </stock> 3.6 Une feuille sans règle La feuille de style vide contient deux règles par défaut : La première code le parcours en profondeur : <xsl:template match="* /"> <!-- R1 --> <xsl:apply-templates/> La seconde extrait les noeuds de type texte : <xsl:template match="text()"> <!-- R2 --> <xsl:value-of select="."/> L application d une feuille de style vide donne : <?xml version="1.0" encoding="utf 8"?> Livre R2 50 R2 Un article très recherché R2 R1 CD R2 23 R2 R1 R1 R1 XSL Le texte est codé en UTF-8. 6
3.7 Exemple de feuille de style <?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output method="html" doctype-system="http://www.w3.org/tr/rec-html40/loose.dtd" /> <xsl:template match="/"> <!-- R1 --> <html><body> <xsl:apply-templates/> </body></html> <xsl:template match="stock"> <!-- R2 --> <h1>stock de la société</h1> <xsl:apply-templates/> <xsl:template match="produit"> <!-- R3 --> <h2>produit <xsl:value-of select="nom"/></h2> <p>prix : <xsl:value-of select="prix"/> en <xsl:value-of select="prix/@monnaie"/></p> <xsl:if test="comment"> <p><xsl:value-of select="comment"/></p> </xsl:if> </xsl:stylesheet> L application de la feuille de style précédente donne : <!DOCTYPE HTML SYSTEM "http://www"> <html> <body> <h1>stock de la société</h1> XSL R1 R2 <h2>produit Livre </h2> R3 <p>prix : 50 en Francs</p> <p> Un article très recherché </p> <h2>produit CD </h2> <p>prix : 23 en Euros</p> R3 </body> </html> 3.8 Sélection des règles par paquets L attribut mode selectionne un nouveau jeu de règles. <xsl:apply-templates mode="mode-choisi" /> Exemple : 7
<xsl:template match="produit"> <h2>produit <xsl:value-of select="nom"/></h2> <xsl:apply-templates select="." mode="seulement-prix" /> <xsl:apply-templates select="." mode="seulement-comment" /> <xsl:template match="produit" mode="seulement-prix"> <p>prix : <xsl:value-of select="prix"/> en <xsl:value-of select="prix/@monnaie"/></p> <xsl:template match="produit" mode="seulement-comment"> <xsl:if test="comment"> <p><xsl:value-of select="comment"/></p> </xsl:if> 4 Construction de l arbre résultat 4.1 Noeud textuel constant Insérer un texte : <xsl:text disable-output-escaping="(no) yes" > texte à insérer </xsl:text> Exemple : pour obtenir Soleil & nuages : <xsl:text>soleil & nuages</xsl:text> <xsl:text><![cdata[soleil & nuages]]></xsl:text> Par défaut, les noeuds de texte sont également recopiés : <xsl:template match="prix"> <p>prix : <xsl:value-of select="."/> en <xsl:value-of select="@monnaie"/></p> Pour éviter les espaces superflus il est préférable d utiliser : <xsl:template match="prix"> <p> <xsl:text>prix : </xsl:text> <xsl:value-of select="."/> <xsl:text> en </xsl:text> <xsl:value-of select="@monnaie"/> </p> 8
Remarque : Les noeuds constitués uniquement d espaces ( &x20;, &x9;, &xd;, &xa; ) ne sont pas récopiés. <xsl:template match="/"> <p> <b>bonjour </b> </p> <p><b>bonjour </b></p> Notez les espaces après Bonjour. 4.2 Noeud textuel par XPATH Produire un noeud textuel par évaluation d une expression XPATH : <xsl:value-of select="expression_xpath" (!) disable-output-escaping="no yes" (no) /> Exemples : <xsl:value-of select="/stock/produit[nom= Livre ]/prix" /> <xsl:value-of select="//prix[@monnaie= Euros ]" /> Seul le premier noeud renvoyé est utilisé (appel implicite de la fonction string ). 4.3 Noeud élément et attribut Pour insérer un noeud de type élément dont on connait le nom il suffit de le placer dans la règle : <xsl:template match="produit"> <h2>produit <xsl:value-of select="nom"/></h2> Une expression XPATH peut être utilisée dans la valeur d un attribut si elle est entourée d accolades (utilisez {{ pour { et }} pour } ). <xsl:template match="produit"> <h2 id="{@id}" title="description : {comment}"> <xsl:text>produit </xsl:text> <xsl:value-of select="nom"/> </h2> On considère dans cet exemple que l élément produit possède un attribut id et un sous-élément comment. 9
4.4 Noeud élément et attribut dynamique Quand on ne connait pas le nom de l élément à insérer, on utilise : <xsl:element name="nom_local" (!) namespace="espace_de_nom" (?) use-attribute-sets="nom-de-liste" (?) > contenu de l élément </xsl:element> Même chose pour un attribut : <xsl:attribute name="nom_local" (!) namespace="espace_de_nom" (?) > valeur de l attribut </xsl:attribute> Exemple : effectuer la transformation suivante <prix monnaie="euros"> 10 ==> <Euros prix="10"/> </prix> avec la règle <xsl:template match="prix"> <xsl:element name="{@monnaie}"> <xsl:attribute name="prix"> <xsl:value-of select="."/> </xsl:attribute> </xsl:element> Exemple 2 : La notation <mon-element id="{une-expression-xpath}"> définition du contenu </mon-element> est équivalente à <mon-element> <xsl:attribute name="id"> <xsl:value-of select="une-expression-xpath"/> </xsl:attribute> définition du contenu </mon-element> 10
On peut donc commencer par définir un élément, puis lui ajouter des attributs et enfin lui ajouter du contenu. 4.5 Copie de noeuds Copie directe d un ensemble de noeuds : <xsl:copy-of select="expression_xpath" /> Exemple 1 : ajouter une quantité à chaque produit : <xsl:template match="produit"> <produit> <xsl:copy-of select="nom prix comment"/> <quantité>inconnue</quantité> </produit> Exemple 2 : copie fidèle : <xsl:template match="/" > <xsl:copy-of select="/" /> 4.6 Copie du noeud courant sans le contenu et les attributs Créer un élément de même nom que le noeud courant : <xsl:copy use-attribute-sets="nom-de-listes(?)" > contenu de l élément </xsl:copy> Exemple 1 : tout recopier (ou presque) en traversant l arbre. <xsl:template match="*"> <xsl:copy> <xsl:xsl:copy-of select="@*" /> <xsl:apply-templates /> </xsl:copy> Exemple 2 : enlever le commentaire d un produit ou d un cadeau : <xsl:template match="produit cadeau"> <xsl:copy> <xsl:copy-of select="*[ not(self::comment) ]"/> </xsl:copy> 11
4.7 Liste d attributs réutilisable Forme générale : <xsl:attribute-set name="nom-de-liste" (!) use-attribute-sets="nom-de-liste" (?) > <xsl:attribute name="nom1">valeur1</xsl:attribute> <xsl:attribute name="nom2">valeur2</xsl:attribute> </xsl:attribute-set> Utilité : regrouper les définitions d attributs pour les réutiliser associées à plusieurs éléments (tableaux, paragraphes, images, etc.) Les listes sont définies en dehors des règles. Exemple : <xsl:attribute-set name="classetableau" > <xsl:attribute name="class">tableau</xsl:attribute> </xsl:attribute-set> <xsl:attribute-set name="tableauavecbords" > <xsl:attribute name="style">border : solid 1px blue;</xsl:attribute> </xsl:attribute-set> <xsl:attribute-set name="tableau" use-attribute-sets="classetableau tableauavecbords" /> <xsl:template match="/"> <table xsl:use-attribute-sets="tableau" > </table> nous donne <table class="tableau" style="border : solid 1px blue;"> </table> 4.8 Noeud commentaire Insérer un commentaire : <xsl:comment> texte du commentaire </xsl:comment> 4.9 Noeud instruction de traitement L instruction XSL 12
<xsl:processing-instruction name="cible" (!) > arg1= val1 arg2= val2 </xsl:processing-instruction> donne dans le document produit <?cible arg1= val1 arg2= val2?> 5 Les éléments de structure 5.1 Les sections conditionnelles <xsl:if test="expression_xpath"> </xsl:if> Comportement : Le corps de l élément xsl:if est traité si et seulement si boolean(expression XPATH) est vraie. Remarque : Il n y a pas de structure sinon. Exemple : <xsl:template match="produit"> <h2>produit <xsl:value-of select="nom"/></h2> <xsl:if test="comment[ (normalize-space(.)!= ) ]"> <p><xsl:value-of select="comment"/></p> </xsl:if> Le choix multiple <xsl:choose> <xsl:when test="expression_xpath_1"> </xsl:when> <xsl:when test="expression_xpath_2"> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose> 13
La partie otherwise est optionnelle. Les éléments when peuvent être vides. Exemple de choix multiple : <xsl:template match="produit"> <xsl:choose> <xsl:when test="not(comment)"> <p>pas de commentaire.</p> </xsl:when> <xsl:when test="(normalize-space(comment) = )"> <p>commentaire vide.</p> </xsl:when> <xsl:otherwise> <p><xsl:value-of select="comment" /></p> </xsl:otherwise> </xsl:choose> 5.2 Boucle sur des ensembles de noeuds L instruction XSL for-each modifie le noeud courant : <xsl:for-each select="expression_xpath"> </xsl:for-each> Exemple : <xsl:template match="/"> <h1>liste des noms</h1> <xsl:for-each select="//nom"> <p>nom : <xsl:value-of select="."/></p> </xsl:for-each> 5.3 Tri d un ensemble de noeuds L instruction xsl:sort associée à xsl:for-each et xsl:apply-templates modifie l ordre des noeuds : <xsl:sort select="expression_xpath" (.) data-type="text number" (text) order="ascending descending" (ascending) case-order="upper-first lower-first" (upper-first) lang="nom_de_langue" (langue système) /> Exemple 1 : 14
<xsl:template match="/"> <h1>liste des produits</h1> <xsl:for-each select="//produit"> <xsl:sort select="nom"/> <p>nom : <xsl:value-of select="nom"/></p> <p>prix : <xsl:value-of select="prix"/></p> </xsl:for-each> Exemple 2 : <xsl:template match="/"> <h1>liste des produits</h1> <xsl:apply-templates select="//produit" > <xsl:sort select="prix" order="descending" /> <xsl:sort select="nom" order="descending" /> </xsl:apply-templates> Plusieurs clauses xsl:sort sont utilisables. 6 Les variables XSL 6.1 Définition de variables Les variables contenants un fragment de l arbre resultat : <xsl:variable name="nom_de_la_variable"> contenu </xsl:variable> Les variables peuvent être globales ou locales. Exemple : <xsl:variable name="head"> <head> <link rel="stylesheet" type="text/css" href="style.css" /> </head> </xsl:variable> <xsl:template match="/"> <html> <xsl:copy-of select="$head"/> <body></body> </html> Les variables contenants un fragment de l arbre d entrée : <xsl:variable name="nom_de_la_variable" select="expression_xpath" /> 15
Exemple : <xsl:variable name="produits" select="//produit" /> <xsl:variable name="pas.cher" select="$produits[prix < 10]" /> <xsl:variable name="gratuit" select="$pas.cher[prix = 0]" /> <xsl:template match="/"> <xsl:for-each select="$pas.cher[ comment ]"> </xsl:for-each> 6.2 Priorité des règles importées Les règles internes sont plus prioritaires que les règles importées. La clause <xsl:apply-imports/> permet de choisir les règles importées. Feuille base.xsl : <xsl:template match="pre"> <xsl:copy-of select="."/> Feuille mise-en-forme.xsl : <xsl:import href="base.xsl" /> <xsl:template match="pre"> <center><xsl:apply-imports /></center> L application de la feuille mise-en-forme.xsl donne : <center><pre></pre></center> 6.3 Priorités fixées entre les règles L attribut priority permet d augmenter (si > 0) ou de diminuer (si < 0) la priorité d une règle : <xsl:template match="produit[ (prix > 10) ]" priority="100" > <xsl:template match="produit" priority="0" > <!-- défaut --> <xsl:template match="*" priority="-1000" > 16
7 Règles nommées et paramètres 7.1 Paramètres de règle Il est possible d appeler une règle en lui passant des paramètres : <xsl:template match="produit"> <xsl:param name="avecprix" select="false()" /> <xsl:param name="prix" select="prix" /> <h2><xsl:value-of select="nom" /></h2> <xsl:if test="$avecprix"> <p>prix : <xsl:value-of select="$prix" /></p> </xsl:if> Les paramètres se définissent et s utilisent comme des variables : <xsl:apply-templates select="//produit"> <xsl:with-param name="avecprix" select="true()" /> </xsl:apply-templates> L attribut select de l élément xsl:param permet de prévoir une valeur par défaut. 7.2 Règles nommées Il est possible de nommer et d appeler une règle par son nom : <xsl:template name="faire-un-lien"> <xsl:param name="href" /> <xsl:param name="target" >_blank</xsl:param> <a href="{$href}" target="{$target}"> <xsl:apply-templates/> </a> Appel d une règle : <xsl:call-template name="faire-un-lien"> <xsl:with-param name="target">all</xsl:with-param> <xsl:with-param name="href" select=" ma-page.html " /> </xsl:call-template> Remarque : le noeud courant de la règle appelante devient le noeud courant de la règle appelée. 7.3 Paramètres d une feuille XSL Il est possible d ajouter des paramètres à une feuille XSL afin de changer son fonctionnement : 17
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output method="html"/> <xsl:param name="debug" select="false()" /> règles </xsl:stylesheet> Les paramètres s utilisent comme des variables : <xsl:if test="($debug)"> MODE DEBUG </xsl:if> 8 Traitement des espaces de noms Il est possible de travailler sur plusieurs espaces de noms : <stock xmlns="http://www.luminy.univ-mrs.fr"> </stock> La feuille de style : <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:lum="http://www.luminy.univ-mrs.fr" xmlns:dil="http://www.dil.univ-mrs.fr" version="1.0"> <xsl:template match="/"> <dil:prix> <xsl:for-each select="//lum:prix"> <dil:monprix valeur="{.}"/> </xsl:for-each> </dil:prix> </xsl:stylesheet> L application de la feuille de style donne : <dil:prix xmlns:dil="http://www.dil.univ-mrs.fr" xmlns:lum="http://www.luminy.univ-mrs.fr" > <dil:monprix valeur="50"/> <dil:monprix valeur="23"/> </dil:prix> L espace de nom lum est défini mais pas utilisé. Nous pouvons demander sa suppression avec exclude-result-prefixes : 18
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:lum="http://www.luminy.univ-mrs.fr" xmlns:dil="http://www.dil.univ-mrs.fr" exclude-result-prefixes="lum" version="1.0"> m^eme règle </xsl:stylesheet> 9 Indexation et utilitaires 9.1 Indexation du document XML Création de clés : <programme> <module> <cours> <nom>xml</nom> <enseignant>jean-luc Massat</enseignant> <xsl:key name="lescours" (!) match="/programmes/module/cours" (!) use="nom" (!) /> Il est possible de faire référence à un noeud cours à partir de son nom dans une expression XPATH. Par exemple, les enseignants d XML : key( lescours, XML )/enseignant Exemple 2 : <produit code="126000"> </produit> <produit code="756200"> </produit> <produit code="563980"> </produit> <commande> <code-produit>756200</code-produit> <code-produit>563980</code-produit> </commande> 19
<xsl:key name="produitsparcode" match="//produit" use="@code" /> <xsl:key name="commandesparcode" match="//commande" use="code-produit" /> <xsl:template match="/"> <h2>les produits commandés</h2> <xsl:apply-templates select="key( produitsparcode, //commande/code-produit)" /> <h2>les commandes des produits en stock</h2> <xsl:variable name="enstock" select="//produit[ en-stock ]" /> <xsl:apply-templates select="key( commandesparcode, $enstock/@code)" /> 9.2 Utilitaires Émission d un message d erreur : <xsl:message terminate="yes no" (?) /> texte du message </xsl:message> Pour imprimer un message sur la sortie d erreur standard et éventuellement arrêter le processeur XSL. 10 Formatage des nombres La fonction format-number(nombre,format) renvoie une chaîne issue du formatage d un nombre : format-number(500100, "###,###.00") = 500,100.00 Nous pouvons également définir un format et l utiliser : <xsl:decimal-format name="mesnombres" (?) decimal-separator="," (.) grouping-separator="." (,) infinity="" (infinity) NaN="" (NaN) percent="%" (%) per-mille="m" (?) /> format-number(34.567, "0,##", "mesnombres") = 34,57 format-number(.6, "0%", "mesnombres") = 6% format-number(.6, "0M", "mesnombres") = 60M 11 Extension d XPATH par XSL XPATH est étendu : ajout de la fonction generate-id(noeud) qui renvoie un identifiant unique : 20
<!-- test de noeuds identiques --> <xsl:if test="generate-id($n1) = generate-id($n2)"> </xsl:if> ajout de la fonction current() qui renvoie le noeud courant <xsl:template > <xsl:variable name="p" select="//article[@id = current()/@id]"/> </xsl:template > ajout de la fonction key(index,clef), ajout du ou dans les expressions. ajout de la fonction format-number(nombre,format) ajout de la fonction document(uri) qui renvoie le document XML identifié par l URI <xsl:value-of select="document( stock.xml )//produit[prix > 10]" /> deux documents liés : <xsl:variable name="stock" select="document( /chemin/vers/stock.xml )" /> <xsl:variable name="achats" select="document( achat.xml, $stock)" /> Attention : l utilisation des noeuds issus d un autre arbre entraîne un changement de contexte qui s applique a toutes les expressions XPATH (nouvelle définition de la racine / ). 12 Étendre XSLT 12.1 Étendre XSL avec JAVA Il est possible, dans une feuille XSL, de faire appel à des routines externes (écrites en Java, Perl, Javascript, TCL, C, etc.) Avec la classe Java import java.util.date; import java.util.calendar; public class GetDate { } public static Date getdate(string full) { Date d = Calendar.getInstance().getTime(); if (! full.equals("true")) { d.setminutes(0); d.sethours(0); } return d; } 21
12.2 Utiliser son extension et la feuille de style : <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java"> <xsl:output method="html"/> <xsl:template match="/"> <xsl:value-of select="java:getdate.getdate( true )" /> <xsl:value-of select="java:getdate.getdate( false )" /> nous obtenons Tue Jan 21 17:48:03 CET 2013 Tue Jan 21 00:00:03 CET 2013 12.3 Extension standard pour XSLT Vous pouvez étudier la librairie EXSLT : http://www.exslt.org/ 22