• Aucun résultat trouvé

Les transformations Transformations

Dans le document Cours J2EE Approfondi (Page 161-165)

La bibliothèque xml de la JSTL permet d'appliquer des transformations à un flux XML via une feuille de style XSL. Je ne

reviendrai pas ici sur le langage et les méthodes à employer, si vous n'êtes pas familiers avec ce concept, je vous conseille de lire

cette introduction à la mise en forme de documents XML avec XSLT.

La balise dédiée à cette tâche est <x:transform>. Commençons par un petit exemple, afin de comprendre comment elle fonctionne. J'utiliserai ici le même fichier XML que pour les exemples précédents, ainsi que la feuille de style XSL suivante :

Code : XML - test.xsl <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Mise en forme avec XSLT</title>

</head>

<body>

<table width="1000" border="1" cellspacing="0" cellpadding="0"> <tr> <th scope="col">Id</th> <th scope="col">Auteur</th> <th scope="col">Titre</th> <th scope="col">Contenu</th> </tr> <xsl:for-each select="/news/article"> <tr> <td> <xsl:value-of select="@id" /> </td> <td> <xsl:value-of select="auteur" /> </td>

</td> <td> <xsl:value-of select="titre" /> </td> <td> <xsl:value-of select="contenu" /> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>

Cette feuille affiche simplement les différents éléments de notre fichier XML dans un tableau HTML. Et voici comment appliquer la transformation basée sur cette feuille de style à notre document XML :

Code : JSP - testTransformXsl.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> <c:import varReader="xslFile" url="test.xsl">

<c:import varReader="xmlFile" url="monDocument.xml"> <x:transform doc="${xmlFile}" xslt="${xslFile}"/> </c:import>

</c:import>

On importe ici simplement nos deux fichiers, puis on appelle la balise <x:transform>. Deux attributs sont utilisés.

doc : contient la référence au document XML sur lequel la transformation doit être appliquée. Attention, ici on parle bien

du document XML d'origine, et pas d'un document analysé via <x:parse>. On travaille bien directement sur le contenu XML. Il est d'ailleurs possible ici de ne pas utiliser d'import, en définissant directement le flux XML à traiter dans une variable de scope, voire directement dans le corps de la balise comme dans l'exemple suivant :

Code : JSP

<x:transform xslt="${xslFile}">

<news>

<article id="1"> <auteur>Pierre</auteur> <titre>Foo...</titre>

<contenu>...bar !</contenu>

</article>

<article id="27"> <auteur>Paul</auteur>

<titre>Bientôt un LdZ J2EE !</titre> <contenu>Woot ?</contenu>

</article>

<article id="102"> <auteur>Jacques</auteur>

<titre>Coyote court toujours</titre> <contenu>Bip bip !</contenu>

</article>

</news> </x:transform>

xslt : contient logiquement la feuille de style XSL. Il est également possible de ne pas utiliser d'import, et de simplement

définir une feuille de style dans une variable de scope.

accédez à cette page JSP depuis votre navigateur, vous apercevez un tableau contenant les données de votre fichier XML : la transformation a bien été appliquée ! Ceci est particulièrement intéressant lorsque vous souhaitez formater un contenu XML en HTML, par exemple lors de la lecture de flux RSS. Observez plutôt les figures suivantes.

Arborescence sous Eclipse avec XSLT.

Rendu transformation XSLT.

Si par contre vous précisez un attribut var, le résultat de cette transformation sera alors stocké dans la variable de scope ainsi créée, de type Document. Sachez qu'il existe également un attribut result qui, en l'absence des attributs var et scope, stocke l'objet créé par la transformation.

Pour terminer, il est possible de passer des paramètres à une transformation XSLT, en utilisant la balise <x:param>. Cette dernière ne peut exister que dans le corps d'une balise <x:transform>, et s'emploie de la même manière que son homologue de la bibliothèque Core :

Code : JSP - testTransformXsl.jsp

<c:import var="xslFile" url="test.xsl"/>

<c:import var="xmlFile" url="monDocument.xml"/> <x:transform doc="${xmlFile}" xslt="${xslFile}">

<x:param name="couleur" value="orange" /> </x:transform>

Le comportement et l'utilisation sont identiques à ceux de <c:param> : deux attributs name et value contiennent simplement le nom et la valeur du paramètre à transmettre. Ici dans cet exemple, ma feuille de style ne traite pas de paramètre, et donc ne fait rien de ce paramètre nommé couleur que je lui passe. Si vous souhaitez en savoir plus sur l'utilisation de paramètres dans une feuille XSL, vous savez où chercher !

Il reste deux attributs que je n'ai pas explicités : docSystemId and xsltSystemId. Ils ont tous deux la même utilité que l'attribut

systemId de la balise <x:parse>, et s'utilisent de la même façon : il suffit d'y renseigner l'URI destinée à résoudre les liens relatifs contenus respectivement dans le document XML et dans la feuille de style XSL.

Je n'ai pour le moment pas prévu de vous présenter les autres bibliothèques de la JSTL : je pense que vous êtes maintenant assez familiers avec la compréhension du fonctionnement des tags JSTL pour voler de vos propres ailes.

Mais ne partez pas si vite ! Prenez le temps de faire tous les tests que vous jugez nécessaires. Il n'y a que comme ça que ça rentrera, et que vous prendrez suffisamment de recul pour comprendre parfaitement ce que vous faites. Dans le chapitre suivant je vous propose un exercice d'application de ce que vous venez de découvrir, et ensuite on reprendra le code d'exemple de la partie précédente en y intégrant la JSTL !

La bibliothèque XML de la JSTL s'appuie sur la technologie XPath. On analyse une source XML avec <x:parse>.

On affiche le contenu d'une variable ou d'un noeud avec <x:out>. On réalise un test avec <x:if> ou <x:choose>.

On réalise une boucle avec <x:forEach>.

Dans le document Cours J2EE Approfondi (Page 161-165)