Académique Documents
Professionnel Documents
Culture Documents
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 :
& pour &
< pour <
> 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>
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 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>.
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.
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.
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> (<) 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;
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]]>
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.
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
(ou CTRL+C)
L'instruction ?cocoon-process? indique Cocoon quel type de traitement appliquer au document XML.
Enregistrer ce fichier XML dans le rpertoire %FORMATIONX% du serveur.
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.
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 ?
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.
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.
Attribut identifiant
XSL offre une facilit pour crer un identifiant unique pour chaque lment.
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>
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) > 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
< : infrieur
> : suprieur
<= : infrieur ou gal
>= : 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>
<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>
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"/>
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"/>
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>
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
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)
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.
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')"/>
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>
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.
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>
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