Cours XSL

Mise en forme et affichage de fichiers XML sur le web avec XSL et XSLT


Télécharger Mise en forme et affichage de fichiers XML sur le web avec XSL et XSLT

★★★★★★★★★★4 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


MISE EN FORME ET AFFICHAGE

DE FICHIERS XML SUR LE WEB

Avec XSL / XSL-T

La solution ultime pour l'affichage et la mise en forme de documents XML se nomme : XSL (eXtensible Stylesheet Language).

Avec XSL on a une maîtrise absolue sur le rendu d'un document XML; Non seulement XSL permet de personnaliser la présentation des informations, mais il permet aussi de choisir, d'organiser, de modifier, d'ajouter ou encore de trier et filtrer les données.

Avec XSL, on a un accès total à l'ensembles des éléments constituants d'un document XML.

Un document XSL est un document XML bien formé respectant la sémantique XSL. Une présentation XSL, permet d'allier la souplesse du HTML avec la richesse des styles CSS ainsi que la puissance des scripts DOM.

Document XSL : Notions de base :

Une feuille de style XSL est un document texte qui doit être externe au document XML et porter l'extension .xsl

Le document XSL doit contenir un prologue et un élément racine faisant référence à l'espace de nom utilisé.

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl=";>

</xsl:steelesheet>

Les styles XSL ne définissent pas de règles de styles mais des modèles (templates). Chaque modèle définit le ou les noeuds pour lesquels il doit s'appliquer, il peut contenir des objets de transformation (éléments HTML/XHTML et XSL).

Si aucun mode de sortie n'est spécifié ou si le mode choisi est XML, les éléments de sortie HTML doivent impérativement respecter la syntaxe XHTML ; En d'autres termes, chaque élément HTML doit être correctement fermé.

<xsl:template match="pattern">

<div style="font: 12px">

<xsl:value-of select="pattern" />

</div>

</xsl:template>

Dans ce petit exemple, le modèle est défini par l'élément XSL <xsl:template> et l'attribut match détermine le nœud pour lequel doit s'appliquer le modèle. L'élément XSL <xsl:value-of>

permet de récupérer le contenu texte de l'élément XML spécifié par la valeur de l'attribut select. La valeur des attributs match et select doit être un chemin de localisation (path) désignant une branche particulière de la hiérarchie du document XML ; Dans la terminologie XSL ce type de chemin est appelé pattern.

La syntaxe des patterns est un langage particulier non-XML connu sous le nom de XPath.

Comme pour les styles CSS, il nous faut établir une liaison entre le document XML et la feuille de styles XSL à l'aide d'une instruction de traitement.

<?xml-stylesheet type="text/xsl" href="URL document styles XSL"?>

Eléments XSL – abréviations XPath prédicats :

Je vous propose ici un rapide survol de quelques éléments XSL et de la syntaxe XPath abrégée à travers plusieurs tableaux.

     

Illustration par l'exemple de XSLT :

Les exemples qui suivent illustrent l'utilisation de certains éléments XSL. Tous ces exemples utilisent le document XML auquel on a ajouté une instruction de traitement permettant de le lier aux documents XSL donnés en exemple.

Exemple 19 :

Ce premier exemple, très simple, applique à l'ensemble des noeuds enfants le modèle défini.

Listing du document XSL :

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl=";>



<xsl:template match="/">

<div style="font: 12pt verdana">

<xsl:value-of select="*" />

</div>

</xsl:template>

</xsl:stylesheet>

Comme vous pouvez le constater le rendu n'est pas génial.

Dans l'exemple qui va suivre, le but recherché est d'afficher uniquement le titre de chacun des livres simplement en modifiant le pattern de l'attribut select de l'élément <xsl:value-of>.

Listing du document XSL :

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl=";> <xsl:template match="/">

<div style="font: 12pt verdana">

<xsl:value-of select="librairie/livre/titre" />

</div>

</xsl:template>

</xsl:stylesheet>

Ici, j'affiche bien un titre mais un seul; celui du premier élément !

Je modifie de nouveau mon exemple pour que celui-ci affiche tous les titres. Pour cela, j'utilise un élément <xsl:apply-templates> et j'en profite pour demander un tri ascendant avec l'élément <xsl:sort>.

Listing du document XSL :

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl=";>

<xsl:template match="/">

<xsl:apply-templates select="librairie/livre">

<xsl:sort select="titre" order="ascending" /> </xsl:apply-templates>

</xsl:template>

<xsl:template match="livre">

<span style="font: 10px verdana"><br />

<xsl:value-of select="titre" />

</span>

</xsl:template>

</xsl:stylesheet>

Voilà qui est mieux. J'aurais pu utiliser un élément <xsl:for-each> pour créer la répétition plutôt qu'un élément <xsl:apply-templates> comme dans l'exemple 19d.

Listing du document XSL :

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" mlns:xsl=";> Initiation à XML – Part. 8 – 2003/2004 - By F.Remise© alias Derf © 7 / 9

<xsl:template match="/">

<xsl:for-each select="librairie/livre">

<xsl:sort select="titre" order="descending" />

<span style="font: 10px verdana" />

<xsl:value-of select="titre" /><br />

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

On gagne quelques lignes. Maintenant essayons d'afficher uniquement les titres des livres faisant partie de la collection – To the .Point !. Une simple modification dans le pattern de l'attribut select de l'élément <xsl:for-each> suffit.

Listing du document XSL :

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl=";> <xsl:template match="/">

<xsl:for-each select="librairie/livre[collection=' - To the .Point !']"> <xsl:sort select="titre" order="descending" />

<span style="font: 10px verdana" />

<xsl:value-of select="titre" /><br />

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

J'aurais également pu utiliser un élément <xsl:if> pour arriver au même résultat. Listing du document XSL :



<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl=";>

<xsl:template match="/">

<xsl:for-each select="librairie/livre">

<xsl:sort select="titre" order="descending" />

<xsl:if test="collection=' - To the .Point !'">

<span style="font: 10px verdana" />

<xsl:value-of select="titre" /><br />

</xsl:if>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

Afin de vous présenter l'opérateur logique not() avec un élément <xsl:if>, l'exemple suivant affiche uniquement le titre des livres dont l'élément <titre></titre> ne possède pas d'attribut couverture. Listing du document XSL :

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl=";>

<xsl:template match="/">

<xsl:for-each select="librairie/livre">

<xsl:sort select="titre" order="descending" />

<xsl:if test="titre[not(@couverture)]">

<span style="font: 10px verdana" />

<xsl:value-of select="titre" /><br />

</xsl:if>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

Pour avoir un exemple d'extraction de valeur d'attribut, je vous propose de demander à notre feuille de style d'afficher le titre de chaque livre en ajoutant devant la chaîne de caractères Titre :,

« Initiation à XML – IUT-amiens – 2007 – By RD »

à l'aide de l'élément <xsl:text>, d'afficher le nom de l'auteur, et d'extraire l'attribut ISBN de l'élément titre et tout cela uniquement pour les livres de R. Clark.

Listing du document XSL :

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl=";>

<xsl:template match="/">

<xsl:for-each select="librairie/livre">

<xsl:sort select="titre" order="ascending" /> <xsl:if test="auteur='Richard CLARK'">

<span style="font: bold 10px verdana">

<xsl:text>Titre : Initiation à XML – IUT-amiens – 2007 – By RD </xsl:text>

<xsl:value-of select="titre" /><br />

</span>

<span style="font: 10px verdana">

<xsl:text>Auteur : </xsl:text>

<xsl:value-of select="auteur" /><br />

</span>

<span style="font: 10px verdana;color: red"> <xsl:text>ISBN : </xsl:text>

<xsl:value-of select="titre/@ISBN" /><br /><br />

</span>

</xsl:if>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

Exemple avec boucle

Il arrive que la structure du document XML ne soit pas linéaire, mais fondée sur, par exemple, des boucles, ou bien comporte un nombre indéterminé de fois un même élément ; c'est d'ailleurs le plus souvent le cas.

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet type="text/xsl" href=« "?>

<bouteille>

<marque>Cristaline</marque>

<composition>

<ion_positif>calcium 71mg/l</ion_positif>



<ion_negatif>nitrate 1mg/l</ion_negatif>

<ion_positif>magnésium 5,5mg/l</ion_positif>

<ion_negatif>chlorure 20mg/l</ion_negatif>

<autres_materiaux>fer</autres_materiaux>

</composition>

<source>

<ville>St-Cyr la Source</ville>

<departement>Loiret</departement>

</source>

<code_barre>3274080005003</code_barre>

<contenance>150cl</contenance>

<ph>7,45</ph> </bouteille> Cette fois-ci, il faut tenir compte d'un nombre a priori indéterminé d'éléments ion_positif, par exemple. Il suffit pour cela d'introduire dans la feuille de style un élément <xsl:for-each select="ce_qu_on_cherche_a_afficher"/>, qui permet de faire une boucle sur l'élément cherché :

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl=";>

<xsl:template match="/">

<html><head><title>Exemple de sortie HTML</title>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

</head>

<body>

<h1>Bouteille de marque <xsl:value-of select="bouteille/marque" /></h1>

<h2>Composition:</h2>

<h3>Ions positifs</h3>

<ul><xsl:for-each select="bouteille/composition/ion_positif">

<li><xsl:value-of select="." /></li>

</xsl:for-each>

</ul>

<h3>Ions négatifs</h3>

<ul><xsl:for-each select="bouteille/composition/ion_negatif">

<li><xsl:value-of select="." /></li>

</xsl:for-each>

</ul>

<h3>Autres matériaux</h3>

<ul><xsl:for-each select="//autres_materiaux">

<li><xsl:value-of select="." /></li>

</xsl:for-each>

</ul>

<h2>Lieu d'origine</h2> <p>Ville de <b><xsl:value-of select="bouteille/source/ville" /></b>, dans le département <b>

<xsl:value-of select="bouteille/source/departement" /></b></p>

<h2>Autres informations</h2><ul>

<li>Contenance: <xsl:value-of select="bouteille/contenance" /></li>

<li>pH: <xsl:value-of select="bouteille/ph" /></li> </ul>

</body> </html>

</xsl:template>

</xsl:stylesheet>



348