Vous êtes sur la page 1sur 19

XML par la pratique

1 - Generalites sur XML (1h)


Principes
XML
XML est un langage balises ("markup language") utilis pour transfrer des donnes sur le web.

Documents XML bien forms


Chaque document XML a une structure logique et une structure physique.
Physiquement, le document se compose d'units appeles entits.
Une entit peut contenir d'autres entits, qui sont alors incluses dans le document.
Un document commence la racine ou entit document.
Logiquement, le document se compose de dclarations, d'lments, de commentaires, d'appels de caractre et
d'instructions de traitement, qui sont indiqus dans le document par du balisage explicite.
Les structures logiques et physiques doivent s'imbriquer correctement.
Les documents composs en XML obissent tous un certain nombres de rgles pour tre qualifis de bienforms :
Le document doit respecter les rgles de conception dcrites dans la recommandation du W3C sur XML,
Toutes les entits rfrences dans le document doivent elles-mmes tre bien formes.
La suite de cette partie dcrit les entits d'un document XML et les rgles de conception de ce type de document.

Prologue XML
Chaque document XML doit commencer par une balise qui indique la version de XML utilise et ventuellement
d'autres indications.
Cette balise de dbut de document est appele le prologue.
Exemple :
<?xml version="1.0"?>

Texte
Les documents XML sont des fichiers textes.
Les caractres autoriss en XML sont la tabulation, le retour chariot, le retour la ligne et les caractres Unicode
et ISO/IEC 10646.
Le codage des caractres peut tre effectu en UTF-8 et UTF-16.
Les caractres <, > et & ne peuvent pas tre employs, sauf pour dlimiter une balise. (sauf exception, voir
Sections CDATA)
Si on souhaite utiliser ces caractres, il est ncessaire d'employer des rfrences des entits de caractre :
&amp; pour &
&lt; pour <
&gt; pour >

Pour employer ' et " dans une valeur d'attribut, utiliser :


&apos; pour '
&quot; pour "

Elments
Dans un document crit dans un langage balise tel que XML, les donnes (le texte, les donnes binaires,)
sont structures en utilisant des balises ("tags").
Exemple 1 :
<balise>mon texte</balise>

Exemple 2 :
<style type="text/css">
<![CDATA[@font-face{fontfamily:'CourierNewPSMT';src:url("data:;base64,\T1RUTwACACAAAQAAQ0ZGIE01zmEAAAAsAAAZb
GNtYXADsQJ8AAAZmA3/y//I/8f/w/+9/7H/r/
+u/60AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")}@font-face{fontfamily:'BerlinSansFB-Reg'; }]]>
</style>

Le dernier exemple peut paratre un peu abscons mais il montre en ralit que lon peut inclure des donnes
binaires (images, fontes, tout a fait autre chose.) dans du XML
Encadrer les donnes dans des balises permet de donner du sens aux donnes.
Exemple :
<important>Ce texte est trs important !</important>
<couleur>rouge</couleur>

Ce nest cependant pas trs satisfaisant car :


Les balises permettent aussi d'organiser les donnes.
Exemple :
<famille>
<pere>Charles</pere>
<mere>Diana</mere>
<enfants>
<fils>Tommy</fils>
<fils>Charlie</fils>
<fille>Magdeleine</fille>
</enfants>
</famille>

Dans XML, la structure logique constitue par les balises et les donnes qu'elles encapsulent (encadrent) est
appele un lment.
Les termes lment et balises ne veulent pas dire la mme chose : un lment est une unit d information
complte, et peut contenir une balise de dbut seule (comme la balise <br/>) ou une balise de dbut, une balise
de fin et le contenu situ entre les 2 balises. Une balise seule est simplement la balise de fin ou de dbut dun
lment .
Comme on peut le remarquer la syntaxe d'un lment XML est toujours de la forme :
balise de dbut + contenu + balise de fin

La balise de fin reprend le nom de l'lment prcd de / (diviser).


Il y a une exception cette rgle : les lments vides. Dans ce cas l'lment s'crit :
<nom/>

Chaque lment XML est compos :


d'un nom (name) obligatoire,
d'un contenu, qui peut tre vide ou (du texte et/ou des lments XML),
d'une liste d'attributs qui peut tre vide

La recommandation sur XML indique que chaque document XML doit comporter un (et seulement un) lment
racine (root element).
L'lment racine ne peut pas faire partie d'un autre lment.
Les autres lments du document doivent tre imbriqus correctement.
Mauvais exemple :
<fort><faible>texte</fort></faible>

Bon exemple :
<fort><faible>texte</faible></fort>

Un lment imbriqu dans un autre est appel lment fils et l'lment dans lequel il est imbriqu est appel
lment pre.
Dans notre exemple l'lment <fort> est le pre de l'lment <faible> et l'lment <faible> est le fils de l'lment
<fort>.

Nom des lments


XML est sensible la casse. Attention donc aux majuscules et minuscules.
Un certain nombre de caractres et de noms sont rservs.
Il est interdit d'utiliser le caractre : (deux points) dans le nom d'un lment. En effet, le caractre : sert prfixer
le nom d'un lment XML par le sous-ensemble de XML auquel il se rapporte. Cette notion est vue dans la suite
du TP.
Il est interdit de crer des noms d'lments commencant par xml, quel que soit la casse employe (XML est
interdit tout comme xMl)

Attributs
Un lment XML peut avoir des attributs. Un attribut spcifie une caractristique de l'lment.
Exemple :
<paragraphe couleurfond="blanc" couleurtexte="bleu">
Il faut savoir se distinguer, au besoin par les couleurs
</paragraphe>

En XML, contrairement HTML, tous les attributs doivent avoir une valeur.

Dclaration du type de document


XML veut dire eXtensible Markup Language, ce qui veut dire que l'on peut utiliser ses propres jeux de balises
pour crire un document.
XML contient un mcanisme de dclaration du type de document (DTD) qui permet de prciser le jeu de balises
employ et les rgles grammaticales associes.
Un document XML conforme aux rgles donnes dans la dclaration de type de document est appel valide.
La dclaration du type de document doit tre situe avant le premier lment du document.
Elle contient, ou pointe, sur des balises qui dcrivent une classe de documents. Ces balises peuvent tre externes
ou internes au document.
Exemple de DTD externe :
<?xml version="1.0"?>
<!DOCTYPE accueil SYSTEM "bonjour.dtd">
<accueil>Bonjour!</accueil>

Exemple de DTD interne :


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE accueil [
<!ELEMENT accueil (#PCDATA)>
]>
<accueil>Bonjour!</accueil>

Si un document comporte plusieurs DTDs, les DTD internes sont lues avant les DTD externes.
Certains jeux de balises sont normaliss et nous en allons en tudier quelques uns durant cette formation : SVG,
FOP, XSP, Xinclude, Xpath.
Il est ici fait rfrence des DTDs, des dclarations de types de documents crites dans la mme syntaxe que
celle utilise par les DTDs de SGML.
Le sous-ensemble de XML appel XML-Schema remplit le mme rle que les DTDs en apportant des
raffinements : typage plus prcis, plages de valeur pour un lment, expressions rgulires, porte,
Une bonne partie de la recommandation XML dcrit les rgles de conception des DTDs, mais les tudier erait
trop long 'tant donn la dure de cette formation.

Dclaration de document autonome


Il est possible de dclarer qu'un document est autonome, c'est dire qu'il ne dpend pas d'une DTD externe.
Dans ce cas le prologue du document s''crit :
<?xml version="1.0" standalone="yes"?>

(no est la valeur par dfaut)


Cela n'empche pas de faire rfrence des entits externe dans le document (fichiers inclure,).

Entits
Un document XML peut tre constitu de plusieurs parties, ventuellement situes dans des emplacements
distincts.
Ces parties sont appeles des entits et sont dfinies dans les DTDs.
Un document XML possde aussi une entit appele entit document qui sert de point de dpart pour le
processeur XML et qui peut contenir tout le document.
Chaque entit possde un nom utilis pour appeler l'entit dans le document.
Les entits peuvent tre ou non analys par le document : on parle d'entits analysables (parsed entities) et nonanalysables (unparsed entities).
Le contenu des entits analysables est substitu aux appels d'entit par le processeur XML lors du traitement du
document.
Il y a deux types d'entits : les entits gnrales et les entits paramtres.

Entits gnrales
Les entits gnrales font rfrences un texte ou un caractre ISO/IEC 10646 et peuvent tre appeles dans le
document.
Les entits analysable de texte doivent comporter une d'claration du type d'encodage.
Exemple :
<?xml encoding='ISO-8859-1'?>

Les appels des entits gnrales analysables utilisent l'esperluette (&) et le point-virgule (;) comme dlimiteurs.
Exemples d'appels de caractre et d'entit :
Tapez <touche>plus-petit-que</touche> (&#x3C;) pour sauvegarder les options.
Ce document a t rdig le &datedoc; et est class &niveau-de-scurit;.

Entits paramtres
Les entit's param`tres sont des entits utilises uniquement l'intrieur d'une DTD.
Les appels d'entits paramtres utilisent le symbole pour cent (%) et le point-virgule (;) comme dlimiteurs.
Exemple d'appel d'entit paramtre :
<!-- dclaration de l'entit paramtre "ISOLat2"... -->
<!ENTITY % ISOLat2
SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >
<!-- ... et appel -->
%ISOLat2;

Instruction de traitement (Processing Instructions)


Un document XML peut contenir des instructions de traitement, qui indiquent aux applications qui lisent le
document les traitements lui appliquer.
Exemple :
<?cocoon-process type="xslt"?>

Commentaires
Le document peut contenir des commentaires, qui sont des balises d'un type particulier.
Un commentaire peut apparatre n'importe o dans le document en dehors d'une balise.
Exemple :
<!-- Commentaire -->

Sections CDATA
Les documents XML peuvent contenir des sections appeles CDATA.
Les sections CDATA permettent d'encapsuler du texte qui sans cela serait interprt comme une balise.
Exemple :
<!CDATA[<mabalise_a_moi>peut contenir n'importe quoi</mabalise_a_moi> parce qu'elle
n'est pas lue]]>

Une section CDATA peut contenir les symboles < et &.


Il ne faut pas remplacer ces caractres par des entits (&lt;) dans les sections CDATA car ces parties du
documents sont interprtes de manire littrale et le programme n'effectue pas la traduction des rfrences
d'entits en caractres.
Si la section CDATA doit contenir le texte ]]> il faut l'crire ]]&gt; sinon le programme croit atteindre la fin de la
section CDATA.

Gestion des espaces


Il est possible d'indiquer au programme charg de traiter le document de prserver les espaces sur tout ou partie
du document.
Pour cela utiliser l'attribut xml:space.
Exemple :
<page>
Les espaces
<texte_special xml:space="preserve">
sont prservs ici !
</texte_special>
</page>

Gestion des langues

Il est possible d'indiquer au programme charg de traiter le document la langue d'un lment.
Pour cela utiliser l'attribut xml:lang.
Exemple :
<page>
Je parle
<texte_special xml:lang="de">
ein bissen Deutsch
</texte_special>
</page>

Le code de langue en 2 lettres est celui dfini dans le RFC 1766, "Tags for the identification of Languages".

XSL
Extensible Stylesheet Language, le langage de feuille de style extensible, regroupe en fait plusieurs sousensembles de XML.
Parmis ces sous-ensembles nous utiliserons :
XSL Transformations, XSLT, permet de transformer un document crit en XML en un autre document XML
Xpath, est un langage pour adresser des parties de documents XML
Par simplicit, le terme XSL sera employ dans la suite du TP pour XSL Transformations + Xpath.

Processeurs XSL
Pour raliser les TPs, nous aurons besoin d'un programme qui permet d'appliquer une transformation XSL un
document XML (et aussi d'interprter d'autres sous ensembles de XML).
Les programmes qui traitent des documents XML sont des processeurs XML (parsers XML).
Le systme de publication XML Cocoon utilis dans le TP utilise le parser Xerces et le moteur de transformation
XSL Xalan. Tous deux sont dvelopps en Open Source par l'Apache Software Foundation (ASF).
Tous les programmes utiliss durant le TP sont crits en Java et sont gratuits.

XML dans une architecture web


Une application est gnralement dcoupe en 3 couches distinctes :
- prsentation : mise en forme des donnes,
- application : structuration des donnes,
- donnes : stockage des donnes.
Ces couches sont r'parties entre le client et le serveur dans les applications client-serveur.
Les applications web sont un type particulier d'application client serveur.
Dans une application web, les rles sont rpartis entre le navigateur de l'utilisateur, qui assure la prsentation et
ventuellement quelques contrles, et le serveur web qui assemble les informations (partie applicative) et
communique avec une base de donnes (partie donne).
Dans le cadre d'un architecture web, XML peut tre utilis sur chacune de ces couches.

Prsentation
XML est beaucoup utilis sur la couche prsentation des applications internet.
Il permet en effet d'envoyer du contenu adapt la demande de l'utilisateur.

En permettant d'appliquer une transformation XSL en fonction du navigateur utilis par l'utilisateur, XML
permet de faire de la publication croise sur plusieurs media (cross-media).
Cette approche est utilis par certaines telcos pour dlivrer de l'information aux navigateurs mobiles (WAP,).
Certains ensembles de XML sont utiliss pour la publication de media enrichi (rich-media), tel que Synchronized
Multimedia Integration Language (SMIL), qui permet de crer des prsentations audiovisuelles interactives.

Application
Sur la couche application, XML va permettre d'effectuer le traitement conditionnel des requtes en fonction de la
demande de l'utilisateur.
Alors que les sous-ensembles de XML pour la couche prsentation sont bien normalises, Les sous-enembles de
XML pour la couche application sont bien souvent propritaires.
Dans ce TPs on utilisera eXtensible Server Page (XSP), un ensemble de balises dvelopp par l'ASF pour grer
la couche logique d'une application (traitement conditionnel, rcupration de paramtres issus de la requte).
Une autre alternative est d'utiliser Java Server Page version 1.2 (JSP) de Sun, qui est compatible XML.

Donnes
XML peut tre utilis soit directement comme format de stockage des donnes (bases de donnes Open Source
Xindice et Ozone), soit tre mapp sur une base de donnes relationnelle, les lments XML sont dans ce cas
reconstruits la vole lors de l'extraction des donnes.

2 - Utiliser XML
a) Installation d'un serveur XML (1h)
Pour gnrer du XML, plusieurs solutions existent.
L'une de ces solutions consiste envoyer des donnes XML brutes au navigateur, qui efffectue alors les
transformations ncessaires (en HTML, en image, en voix) avant de prsenter l'information l'utilisateur.
L'autre solution consiste transformer les donnes sur le serveur avant de les envoyer dans un format
directement affichable par le navigateur de l'utilisateur.
Dans le cadre de ce TP c'est la seconde solution qui a t retenue car peu de navigateurs sont capables d'effectuer
la transformation de XML dans un autre format.

Tomcat 3.2.4
Crer le rpertoire D:\xml.
Tlcharger Tomcat 3.2.4 dans le rpertoire D:\xml.
http://
Extraire Tomcat.
Rgler les variables d'environnement :
Editer le fichier tomcat.bat et modifier les lignes :
JAVA_HOME=
TOMCAT_HOME=
Par les valeurs adquates.

Dmarrer Tomcat
Cd %TOMCAT_HOME%/bin
Tomcat.bat -start

Vrifier que l'installation de Tomcat a russie :


http://localhost:8080/
La page d'accueil de tomcat doit s'afficher.
Eteindre Tomcat.
Tomcat.bat -stop

(ou CTRL+C)

Cocoon 1.8 sous Win32


Tlcharger le fichier auto-extractible de Cocoon l'adresse
http://
et le copier dans le rpertoire %TOMCAT_HOME%/webapps
Stopper Tomcat.
D'marrer Tomcat.
L'archive de Cocoon est dcompresse.
Stopper Tomcat.
Modifier le fichier %TOMCAT_HOME%/webapps/cocoon/cocoon.properties et le fichier %TOMCAT_HOME
%/conf/web.xml comme indiqu l'adresse :
http://
Redmarrer Tomcat.
Vrifier que Cocoon est bien install en tapant l'URL http://localhost:8080/cocoon/
La page d'accueil de cocoon doit s'afficher.

b) XML : utilisation sur la couche Presentation d'une application web


XSL : transformer du XML en XHTML (1h)
Dans cette partie nous allons transformer des lments XML en balises HTML l'aide de XSL.
Les feuilles de style XSL permettent d'enrichir et d'extraire des donnes d'un document XML.
Pour cela XSL fournit des balises spcifiques.

Ajouter une feuille de style (XSL) un document XML


Pour dclarer quelle feuille de style le moteur de transfromation XSL doit appliquer au document, insrer
l'instruction xml-stylesheet dans le document XML.
Fichier exemple.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="page.xsl"?>
<?cocoon-process type="xslt"?>
<ClubTarot>
<Joueur niveau="bon">
<Nom>Albert</Nom>
<Tel type="domicile">04-56743678</Tel>
<Tel type="travail">04-45367624</Tel>
<Couleur>Red</Couleur>
</Joueur>
</ClubTarot>

L'instruction ?cocoon-process? indique Cocoon quel type de traitement appliquer au document XML.
Enregistrer ce fichier XML dans le rpertoire %FORMATIONX% du serveur.

Modles de documents XSL


Nous allons maintenant crer une feuille de style XSL pour ce document.
Fichier page.xsl
<?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"/>
<xsl:template match="/">
<xsl:processing-instruction name="cocoonformat">type="text/html"</xsl:processing-instruction>
<html>
<head>
<title>Bienvenue au club !</title>
</head>
<body>
Bienvenue au club !
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Le HTML est inclus dans un lment xml-template et est considr comme du xml. Il faut donc veiller produire
du HTML "bien-form".
Copier le fichier sur le serveur.
Maintenant que notre document et notre feuille de style sont sur le serveur nous allons les modifier et leur ajouter
progressivement d'autres fonctions.
Testez l'accs au document xml sur le serveur.

Navigation dans le document XML / Extraire des donnes avec Xpath


Extraire les donnes d'un lment XML
Il faut maintenant extraire des donnes du document XML.
Les balises prdfinies de XSL permettent d'xcuter ce type d'opration.
Pour commencer nous allons extraire le nom du joueur de tarot et l'afficher.
Pour extraire la valeur d'un lment on utilise la balise xsl:value-of.
Fichier page.xsl
<?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"/>
<xsl:template match="/">
<xsl:processing-instruction name="cocoonformat">type="text/html"</xsl:processing-instruction>
<html>
<head>

<title>Bienvenue au club <xsl:value-of


select="/ClubTarot/Joueur/Nom"> !</title>
</head>
<body>
Bienvenue au club <xsl:value-of select="/ClubTarot/Joueur/Nom"/> !
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Mettre jour le fichier page.xsl et constater l'utilisation de la donne XML.

Utiliser une donne XML dans un attribut : valuation d'une expression Xpath
Dans l'exemple prcdent nous avons extrait une donne du document XML en utilisant une expression Xpath
comme valeur de l'attribut select.
L'expression Xpath indique quels lments du document sont viss par l'instruction.
Un / au dbut de l'expression Xpath indique que l'on commence la recherche la racine du document.
L'expression /ClubTarot/Joueur/Nom indique au processeur XSL d'aller, partir de la racine du document,
l'lment ClubTarot, puis d'aller l'lment Joueur parmis ses fils puis d'aller l'lment Nom.
Utilisation des {} pour assigner la valeur de l'element
Comme cela a t vu, un attribut ne peut pas avoir comme valeur une chane contenant les caractres < ,> et &.
Il est possible d'affecter la valeur d'un lment XML un attribut en utilisant la notation entre {}.
Exemple :
<body bgcolor="{/ClubTarot/Joueur/Couleur}">

</body>

Cette instruction indique d'utiliser la valeur de llment Couleur du Joueur pour l'attribut bgcolor de la balise
body.
Insrer cette instruction dans la feuille de style page.xsl et mettre jour le serveur.
Quand utiliser {} et ne pas l'utiliser ?

Slection d'un prdicat : Elment XML + valeur(s) d'attribut(s)


Pour accder un attribut dans une expression Xpath, il faut prcder son nom de @.
Il est possible d'afficher un lment en fonction d'un prdicat en utilisant la notation entre [ ].
Exemple :
<p>Votre numro de tlphone personnel est <xsl:value-of
select="/ClubTarot/Joueur/Tel[@type='domicile']"/></p>

Si l'un des lments du prdicat est une chane il faut l'encadrer entre des guillemets simples ( ' ' ) car
l'expression Xpath est dj entre guillemets.
Insrer l'exemple dans la feuille de style.

Itrations / Affichage d'une collection d'lments XML : for-each


Si un lment pre comporte plusieurs lments fils du mme type, il faut pouvoir traiter accder chacun de ces
lments individuellement.

L'instruction XSL xsl:for-each permet de parcourir tous les lments viss par un prdicat et de les traiter.
Exemple :
<xsl:for-each select="predicat">
<!-- A l'interieur de la boucle for-each l'element courant est atteint par
l'expression Xpath "." -->
<xsl:value-of select="."/>
</xsl:for-each>

Sur la base de cet exemple et des prcdents, afficher la liste des numros de tlphone du Joueur.

Accder plusieurs lments XML simultanment (../)


Pour acc'der un lment situ au-dessus de l'lment courant, il faut utiliser l'expression Xpath "..", autant de
fois que ncessaire.
Exemple :
<xsl:value-of select="../.."/>

Cet exemple affiche la valeur du grand pre de llment courant.

Accder tous les lments XML (select="@*", select="*")


Pour accder tous les lments on utilisera l'expression "*".
L'expression "@*" permet de slectionner tous les attributs d'un lment.

Attribut identifiant
XSL offre une facilit pour crer un identifiant unique pour chaque lment.

Cration d'un identifiant avec generate-id()


On utilise la fonction generate-id(predicat) pour crer un identifiant unique pour un lment.
Exemple :
<a name="{generate-id(.)}"><xsl-value-of select="."></a>

Hyperliens
La fonction generate-id peut tre rutilise plusieus fois dans un document et donnera toujours le mme rsultat
pour un lment donn.
Exemple :
<a href="#{generate-id(.)}"><xsl-value-of select="."></a>

Traitement conditionnel
Dans cette partie nous allons tudier les instructions XSL pour le traitement conditionnel.

xsl:if
Pour traiter un document XML il est possible de raliser des tests simples avec xsl:if.
Exemple :
<xsl:if test="/ClubTarot/Joueur/@niveau='bon'">
<p>Une partie spciale pour les bons a lieu aujourd'hui !</p>
</xsl:if>

Insrer cet exemple dans le fichier exemple.xml et observer le rsultat.

Expressions Test=
L'attribut test permet d'effectuer des tests sur des lments XML.
Il peut avoir comme valeur une expression Xpath ou une fonction.

Les fonctions sont prsentes par la suite. Elles permettent de calculer la position d'un lment, le nombre
d'lments,
Les expressions test= sont de la forme :
<xsl:if test="fonction(element) &gt; valeur">
<!-- si le test est vrai executer le code -->
</xsl:if>

Ou de la forme :
<xsl:if test="predicat='valeur'">
<!-- si le test est vrai executer le code -->
</xsl:if>

Oprateurs boolens
Les oprateurs boolens autoriss dans les expressions values par l'attribut test sont :
= : galit
!= : diffrent
&lt; : infrieur
&gt; : suprieur
&lt;= : infrieur ou gal
&gt;= : suprieur ou gal
not : ngationne(!) l'expression

xsl:when/xsl:choose
Une autre structure conditionnelle disponible est la strucure xsl:choose.
Elle permet d'xecuter un traitement en fonction du rsultat d'un test.
Par rapport xsl:if, xsl:choose prsente l'avantage de permettre d'effectuer plusieurs tests la suite.
Exemple :
<xsl:choose>
<xsl:when test="@type='domicile'">
<p style="background-color:yellow">Votre numro de tlphone <xsl:value-of
select="./@type"/> est le <xsl:value-of select="."/></p>
</xsl:when>
<xsl:otherwise>
<p>Votre numro de tlphone <xsl:value-of select="./@type"/> est le <xsl:valueof select="."/></p>
</xsl:otherwise>
</xsl:choose>

xsl:otherwise indique le traitement effectuer par dfaut.

Tri d'une collection avec xsl:sort


Il est possible de trier des sries d'lments.
Avant de faire l'exprience, crer le fichier suivant.
Fichier exemple2.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="page2.xsl"?>
<?cocoon-process type="xslt"?>
<ClubTarot>
<Joueur niveau="bon">
<Nom>Albert</Nom>
<Tel type="domicile">04-56743678</Tel>
<Tel type="travail">04-45367624</Tel>

<Couleur>Red</Couleur>
</Joueur>
<Joueur niveau="moyen">
<Nom>David</Nom>
<Tel type="domicile">04-74345678</Tel>
<Tel type="travail">04-36763424</Tel>
<Couleur>Yellow</Couleur>
</Joueur>
<Joueur niveau="bon">
<Nom>Ernest</Nom>
<Tel type="domicile">04-67743878</Tel>
<Tel type="travail">04-53667724</Tel>
<Couleur>Green</Couleur>
</Joueur>
</ClubTarot>

Pour trier une collection d'lments, il faut se placer dans l'lment pre et utiliser l'instruction xsl:sort pour trier
les lments choisis.
Fichier page2.xsl
<?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"/>
<xsl:template match="/">
<xsl:processing-instruction name="cocoonformat">type="text/html"</xsl:processing-instruction>
<html>
<head>
<title>Bienvenue au club !</title>
</head>
<body>
<h1>Liste des membres</h1>
<xsl:for-each select="/ClubTarot/Joueur">
<xsl:sort select="Nom" order="descending"/>
<p><xsl:value-of select="Nom"/></p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Crer la feuille de style page2.xsl et la tester.

Autres moyens d'accs aux donnes XML


Slection des lments en fonction de leur position
XSL offre la fonction position() pour calculer la position d'un lment.
Les fonctions last et first permettent 'galement d'avoir une indication sur la position.

Slection du premier
Exemple
<xsl:value-of select="/ClubTarot/Joueur[1]/Name"/>
<xsl:value-of select="/ClubTarot/Joueur[position()=1]/Nom"/>

Slection du dernier
Exemple
<xsl:value-of select="/ClubTarot/Joueur[last()]/Nom"/>

Slection de tous sauf le dernier


Exemple
<xsl:for-each select="/ClubTarot/Joueur[not(position()=last())]">
<xsl:sort select="Nom" order="descending"/>
<p><xsl:value-of select="Nom"/></p>
</xsl:for-each>

Slection de tous sauf le premier


Exemple
<xsl:for-each select="/ClubTarot/Joueur[not(position() &gt; 1)]">
<xsl:sort select="Nom" order="descending"/>
<p><xsl:value-of select="Nom"/></p>
</xsl:for-each>

Slection de tous les petits fils d'un lment


Exemple
<xsl:for-each select="/ClubTarot/*/Nom">
<p><xsl:value-of select="."/></p>
</xsl:for-each>

Listes : xsl:number
L'lment XSL xsl:number renvoie le nombre correspondant la position de l'lment courant (.) dans la
slection.
Exemple :
<xsl:number value="position()" format="1"/><xsl:text>.</xsl:text><xsl:value-of
select="Nom"/>

Valeur de dpart
La valeur de dpart peut tre modifie.
Exemple :
<xsl:number value="position() - 1" format="1"/>

Format
Plusieurs format sont disponibles :
Format="1" affiche la squence 1,2,3,
Format="01" affiche la squence 01,02,03,
Format="a" affiche la squence a,b,c,
Format="A" affiche la squence A,B,C,
Format="I" affiche la squence I,II,III,
Format="i" affiche la squence i,ii,iii,
Raliser une liste numrote en chiffres romains des noms des joueurs du club.

Variables ($variable)
L'lment xsl:variable permet de crer des variables qui conservent une valeur.

Dclaration
Exemple
<xsl:variable name="salutation" select="Bonjour !"/>

Affichage de la variable
<xsl:value-of select="$salutation"/>

Autre exemple
<xsl:variable name="ancetres" select="ancestor()"/>

Cet exemple cre une variable qui contient l'ensemble des anctres de l'lment courant : une variable peut
contenir des lments (pas seuelement des chanes).

Porte
Une variable n'a d'existence qu' l'intrieur du modle ou de la boucle o elle a t cree.
Il est possible de crer des variables globales en les dclarant l'extrieur d'un modle.

Valeurs multiples
Pour stocker plusieurs valeurs dans une variable il est possible de crer une variable partir d'une liste
d'lments.
Exemple
<xsl:variable name="ma_variable">
<xsl:for-each select="ClubTarot/Joueur">
<xsl:value-of select="Nom"/>
/
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$ma_variable"/>

Crer la variable prcdente dans la feuille de style.

Chanes
XSL met la disposition des auteurs plusieurs fonctions de manipulation de chane.

Concatnation
Exemple
<xsl:for-each select="/ClubTarot/Joueur">
<p><xsl:value-of select="concat('Bonjour ',Nom)"/></p>
</xsl:for-each>

Comparaison de chanes
Contains(chane tester, chane test)
La fonction contains renvoie vrai si la chane tester contient la chane test.
Exemple
<xsl:if test="contains($salutation,'jour')">
C'est donc qu'il fait jour !
</xsl:if>

Starts-with(chane tester, expression test)


La fonction starts-with renvoie vrai si la chane tester d'bute par l'expression test.
Exemple
<xsl:if test="starts-with($salutation,'Bon')">
Cela commence donc par bon !
</xsl:if>

Extraction de chanes
Substring-before(chane tester, expression test)
La fonction substring-before renvoie la partie de la chane tester situe avant l'expression test.
Exemple

<xsl:variable name="prefixeTel" select="substringbefore(/ClubTarot/Joueur[Nom='Albert']/Tel[@type='domicile'],'-')"/>


<xsl:value-of select="$prefixeTel"/>

Substring-after(chane tester, expression test)


La fonction substring-after renvoie la partie de la chane tester situe aprs l'expression test.
Exemple
<xsl:variable name="numTel" select="substringafter(/ClubTarot/Joueur[Nom='Albert']/Tel[@type='domicile'],'-')"/>
<xsl:value-of select="$numTel"/>

Substring(chane tester, index.longueur)


La fonction substring renvoie la partie de la chane tester situe entre l'index et l'index plus la longueur passe
en argument.
Si la longueur n'est pas spcifie, la chane est retourne de l'index la fin.
Exemple
<xsl:variable name="milieuTel" select="substring
(/ClubTarot/Joueur[Nom='Albert']/Tel[@type='domicile'],2,8)"/>
<xsl:value-of select="$milieuTel"/>

Longueur : string-length(chane)
La fonction string-length renvoie la taille de la ch6ine donne en argument.

Translate(chaine,chainesource,chainecible)
Transforme une chane en fonction des chanes indiques en paramtre.
Exemple
<xsl:variable name="upperCaseChars" select=" 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' "/>
<xsl:variable name="lowerCaseChars" select=" 'abcdefghijklmnopqrstuvwxyz' "/>
translate(Hello, $upperCaseChars, $lowerCaseChars)

Renvoie hello en minuscule.

Fonctions mathmatiques
Les fonctions mathmatiques de base des xsl sont les oprateurs : +,-,*, div et mod (reste d'une division).
Penser encadrer le signe - par des espaces: les noms d'lements XML peuvent contenir ce caractre et il peut y
avoir des risques de confusion par les parsers XML.

Sum(predicat)
Retourne la somme des valeurs des nuds du prdicat

Floor(nombre)
Retourne le plus grand nombre entier qui ne dpasse pas le nombre.
Floor(3.5) retourne 3.

Ceiling(nombre)
Retourne le plus petit nombre entier qui n'est pas infrieur au nombre.
ceiling(3.5) retourne 4.

Round(nombre)
Retourne l'entier le plus proche du nombre.
Round(3.2) retourne 3.

Count(predicat)
Retourne le nombre d'l'ments du prdicat.

Fonctions d'acces aux elements / a d'autres documents

Name()
La fonction name() renvoie le nom de l'lment courant ou d'un de ses attributs.

Document()
La fonction document() permet d'insrer un document dans le document courant.
Exemple :
<xsl:variable name="menu" select="document('map.xml')"/>

Il est ensuite possible d'itrer sur les lments du document insr.

Attributs xsl
Il est possible d'ajouter un attribut la vole un lment en cours de gnration en utilisant l'instruction
xsl:attribute.
Exemple
<TABLE border="1" width="25%">
<xsl:for-each select="/ClubTarot/Joueur">
<TR>
<xsl:if test="position() mod 2 = 0">
<xsl:attribute name="bgcolor">yellow</xsl:attribute>
</xsl:if>
<TD><xsl:value-of select="Nom"/></TD>
</TR>
</xsl:for-each>
</TABLE>

Insrer cet exemple dans la feuille de style et observer le rsultat.

Passage de paramtres entre fonctions


(xsl:template + xsl:param + xsl:call-template)
L'exemple suivant montre comment utiliser les instructions xsl:param et xsl:call-template pour appeler un
modle XSL en lui passant des paramtres.
Exemple
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>Le club de Tarot</TITLE>
</HEAD>
<BODY>
<xsl:call-template name="displayNameWithFont">
<xsl:with-param name="fontFace" select="'Impact'"/>
<xsl:with-param name="name"
select="/ClubTarot/Joueur[1]/Nom"/>
</xsl:call-template>
<BR/>
...
</BODY>
</HTML>
</xsl:template>
<xsl:template name="displayNameWithFont">
<xsl:param name="fontFace" select="'Braggadocio'"/> <!-- default font -->
<xsl:param name="name"/>
<FONT face="{$fontFace}">
<xsl:value-of select="$name"/>
</FONT>
</xsl:template>

Valeur de retour d'une fonction


Il est possible de renvoyer une valeur de retour la suite de l'appel d'un modle.

La valeur doit tre donne par l'instruction xsl:value-of l'intrieur de la fonction, sur le mme principe que
l'exemple prcdent.
Crer une fonction qui renvoie le nombre pass en paramtre ` un modle divis par 2.

SVG : Generer une image a partir de texte(1/2h)


Gnrer une image partir de donn'es XML consiste passer une page avec des donnes dans une feuille de
style qui transforme les lments XML du document original en lments SVG.
La principale diff'rence avec les exemples prcdents vient donc du jeu de balise employ.
Fichier svg-exemple.xml
<?xml version="1.0"?>
<?xml-stylesheet href="page-svg.xsl" type="text/xsl"?>
<?cocoon-process type="xslt"?>
<page>
<title>Coucou</title>
<content>
<p>Une image en SVG</p>
</content>
</page>

Fichier svg-page.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="page">
<xsl:processing-instruction name="cocoon-format">type="image/svgxml"</xsl:processing-instruction>
<svg xml:space="preserve" width="360" height="160"
xmlns:xlink="http://www.w3.org/2000/xlink/namespace/">
<defs>
<filter id="blur1"><feGaussianBlur stdDeviation="3"/></filter>
<filter id="blur2"><feGaussianBlur stdDeviation="1"/></filter>
</defs>
<g title="this is a tooltip">
<rect
style="fill:#0086B3;stroke:#000000;stroke-width:4;filter:url(#blur1);"
x="30" y="30" rx="20" ry="20" width="300" height="100"/>
<text style="fill:#FFFFFF;font-size:24;font-family:TrebuchetMSBold;filter:url(#blur2);" x="65" y="80">
<xsl:value-of select="content/p"/>
</text>
</g>
</svg>
</xsl:template>
</xsl:stylesheet>

FO : transformer du XML en PDF (1/2h)


La technique pour FO (formatting Object) est identique celle pour SVG.
Seul le format de sortie indiqu Cocoon et les balises employes changent.
Se reporter aux exemples Cocoon pour la dmonstration.

c) XML : utilisation sur la couche Application


Xinclude : construire un menu a partir d'une liste de documents(1/2h)
Xinclude est un sous-ensemble de XML qui permet d'inclure des documents dans un document XML.

Pour l'utiliser il faut dclarer une rfrence vers le jeu de balises Xinclude en dbut de document.
Dans le cas d'une utilisation avec Cocoon il faut galement indiquer Cocoon de traiter les instructions Xinclude
avant le passage de la feuille de style XSL.
Fichier xinclude-exemple.xml
Fichier map.xml
Fichier xinclude-page.xsl
Se reporter http://ubik:8082/nqueens pour les sources de l'exemple.
Driver l'exemple pour inclure les exemples traits aujourd'hui.
Les points suivants sont traits avec les exemples de Cocoon comme support.

XSP et JSP 1.2 : recuperer des informations envoyees par l'utilisateur (1/2h)
Objet request

d) XML : utilisation sur la couche Donnees


Interrogation Bdd : afficher une table (1/2h)
Interrogation LDAP : afficher la fiche de quelqu'un (1/2h)

Vous aimerez peut-être aussi