Sie sind auf Seite 1von 40

Introduction XML

1. Le langage XML
1.1. XML dans son contexte :

XML est une technologie de description et de structuration de donnes. Actuellement, on trouve deux moyens pour stocker les donnes sur ordinateur : dans un fichier binaire ou dans un fichier de texte. Si on dsire comparer les deux :
Fichiers binaires - Ne peuvent tre ouverts ou cres que par des applications pouvant les comprendre ou gnrer, ils sont donc propritaires ; - Problmes de versions ; - Ils sont plus faciles lire et crire, la gestion de donnes est donc rapide Fichiers textes - Ils ne sont pas propritaires et peuvent tre lus par un trs grand nombre dapplications ; - Ils assurent le partage dinformations ; - Pas de mise en forme, que du texte brute sans couleurs ni image . . . - Moins rapides

Cest dans ce contexte quon a essay dimaginer un langage capable de possder les avantages du binaire (notamment la mise en forme) combins avec la souplesse de lecture des fichiers textes. Le systme de balises est le moyen utilis pour dcrire, structurer et mettre en forme de linformation. Un exemple trs simple si on veut indiquer quune partie du texte doit tre en rouge on peut crire : Dans cet exemple, la balise ouvrante ici "<rouge>" indique que le texte qui suit doit tre en rouge. La balise fermante ici "</rouge>" indique que lenrichissement stylistique prend fin. 1.2. Historique : de SGML XML Le SGML XML drive d'un langage dvelopp dans les annes 80, le SGML. Ce langage tait complexe apprendre et utiliser quotidiennement. Le SGML (Standard Generalized Markup Language, langage de balisage standard gnralis), est le premier langage de type texte auto_descriptif. Adopt comme standard en 1986, SGML a t conu dans le but de faciliter la gestion dimportants fichiers par les gros systmes. Le SGML est constitu de plusieurs composants. Ceux-ci changent pour chaque application SGML : - Dfinition du type de document (DTD) : ce composant sert prciser la structure du document ; - Instance du document : il s'agit du texte rel du document comportant les lments SGML qui ont t dfinis dans la DTD et qui identifient les diverses parties du texte. - Synthse du document : ce composant sert prciser les principaux aspects de l'application SGML. C'est ce niveau que sont dtermines les options et qu'est prcis le jeu de caractres qui sera utilis ainsi que les autres fonctions similaires. Ce langage servant prciser la structure d'un document quelconque, il est comprhensible que sa gnralit le rende difficile d'apprentissage, et complexe d'emploi. En particulier, il tait inadapt l'criture de documents pour Internet. Il a donc t ncessaire d'en driver le langage HTML. Le HTML HTML (Hypertexte Markup Language) est un langage de balisage comme le SGML. Il nest pas destin au stockage de donnes mais leur affichage. C'est aujourd'hui le standard du dveloppement web. Il a t tendu par le XHTML, un langage qui lui est extrmement similaire, mais permettant la production de documents aux normes XML.
1 / 15 Introduction XML

Texte quelconque <rouge> cette phrase est en rouge </rouge>

Ce langage est facile apprendre et utiliser ; il a d'ailleurs donn lieu au dveloppement de nombreux outils de publication sur Internet tels que les diteurs HTML (Dreamweaver, FrontPage, .). Le HTML tant une application SGML, il est donc li lui aussi une DTD. Il en existe parfois plusieurs par version d'HTML. Celles de la version 4.01 se trouvent rfrences sur le site web du W3C : DTD HTML 4.01 Strict, Transitional, Frameset... Un inconvnient du HTML est son champ d'action limit : il n'est ainsi pas possible de dfinir autre chose qu'une page Web. Au bout de quelques annes, la demande se faisant de plus en plus forte pour la dfinition d'un nouveau format, et le langage HTML rencontrant ses limites, le W3C a commenc organiser des groupes de travail sur un autre descendant du SGML, le XML. XML Le XML (eXtensible Markup Langage) est un driv du SGML est destin dcrire et structurer les donnes. Le plus important point commun avec le SGML est le fait que tout document XML peut tre bas sur une DTD ou un Schma. Cette association n'est cependant pas obligatoire, et un fichier XML peut trs bien se suffire lui-mme. Une autre caractristique importante est que dans un document XML, la mise en forme des donnes est totalement spare des donnes elles-mmes. Cela permet de sparer compltement l'information (le contenu) de son apparence (le contenant), et donc de fournir plusieurs types de sortie pour un mme fichier de donnes, en fonction de l'utilisateur ou de l'application demandeuse (autre document XML, tableau, graphique, image, animation multimdia, fichier HTML, fichier PDF...). De plus, la possibilit de crer les lments que l'on dsire permet de rendre le fichier lui-mme lisible -et modifiable- par un tre humain : on peut donner aux informations contenues dans un tel fichier le nom que l'on veut, et les ordonner selon son dsir. Un document XML peut ainsi prvoir plusieurs cibles, comme par exemple l'cran d'un tlphone portable, celui d'un ordinateur de bureau, une base de donnes, une application logicielle, etc. Il est galement possible d'effectuer des slections par tri, des gnrations automatiques de tables des matires et bien d'autres fonctions encore, grce au langage de feuilles de style XSLT. La figure suivante rcapitule la succession ces langages :

Le WML pour le Wap des tlphones mobiles, le MathML pour les mathmatiques. II. Mise en uvre 1. Procdure XML permet de nettement sparer forme et fond. Par exemple, cela signifie que pour produire un document HTML partir de donnes en utilisant le format XML, il est ncessaire d'crire au moins deux fichiers, le premier contenant les donnes mettre en forme, le second les informations ncessaires cette mise en forme. En pratique, et dans un souci de normalisation et de gnralisation, il peut s'avrer ncessaire d'ajouter un troisime fichier l'ensemble : 1. Optionnel : un fichier peut tre ncessaire pour dfinir a priori les balises auxquelles le document XML pourra avoir recours. Ce fichier peut tre soit une Document Type Definition soit un Schema (voir plus loin dans le cours) ;
2 / 15 Introduction XML

2. Le document contenant les donnes elles-mmes, c'est--dire le document XML proprement parler (une instance du document, au sens SGML) ; 3. Le document contenant les informations de mise en forme, permettant de produire un fichier dans le format de sortie voulu : une feuille XSLT (eXtensive Stylesheet Language Transformations). Dans le cas d'un format de sortie HTML, il peut tre galement ncessaire d'ajouter une feuille de style CSS. En rsum, si l'on veut produire un fichier HTML partir de donnes mises sous format XML, il faut : 1. Crer ventuellement un fichier dfinissant les balises utilisables ; 2. Crer le fichier de donnes XML ; 3. Crer la feuille de style XSL permettant la production du fichier HTML ; 4. Crer ventuellement une feuille de style CSS. III. Structure d'un document XML 1. Exemple : une bibliographie
<?xml version="1.0" encoding="ISO-8859-1"?> <biblio> <livre> <titre>Les Misrables</titre> <auteur>Victor Hugo</auteur> <nb_tomes>3</nb_tomes> </livre> <livre lang="en"> <titre>David Copperfield</titre> <auteur>Charles Dickens</auteur> </livre> </biblio>

Sur l'exemple prcdent, un fichier XML est compos d'un prologue, d'un lment racine et d'un arbre. Cet arbre est constitu d'lments imbriqus les uns dans les autres (ayant une relation parentenfant) et d'lments adjacents. Les premires lignes forment le prologue, constitu dans l'exemple prcdent de la dclaration XML, et ventuellement d'une dclaration de type de document (une DTD) ; L'lment biblio est notre lment racine (en anglais : document element) ; il est constitu de trois lments livre. Dans chacun d'entre eux nous retrouvons la mme composition, c'est-dire : un lment titre, un lement auteur et ventuellement un lment nb_tomes. L'lment livre, de plus, a un attribut lang ; 2. Le prologue
a. Dclaration XML

Cette dclaration fait partie des "instructions de traitement". Exemple de dclaration XML :
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>

On distingue trois informations fournies dans cette dclaration : 1. version : version du XML utilise dans le document, 1.0 en ce qui nous concerne (la dernire version du langage, 1.1, date de fvrier 2004 mais ne change rien quant ses bases) ;

3 / 15

Introduction XML

2. encoding : le jeu de codage de caractres utilis. Le jeu de caractre habituel pour le franais est le ISO-8859-1. Par dfaut, l'attribut encoding a la valeur UTF-8. 3. standalone : dpendance du document par rapport une dclaration de type de document. Si standalone a la valeur yes, le processeur de l'application n'attend aucune dclaration de type de document extrieure au document. Sinon, le processeur attend une rfrence de dclaration de type de document. La valeur par dfaut est no. Cette dclaration est facultative, mais il est prfrable de l'utiliser, auquel cas les attributs version, encoding et standalone doivent tre placs dans cet ordre. Si elle est utilise, elle doit tre place en toute premire ligne du document XML.
b. Instructions de traitement

Une instruction de traitement est une instruction interprte par l'application servant traiter le document XML. Elle ne fait pas totalement partie du document. Les instructions de traitement qui servent le plus souvent sont la dclaration XML ainsi que la dclaration de feuille de style. Exemple d'instruction de traitement :
<?xml-stylesheet type="text/xsl" href="biblio.xsl"?>

Dans cet exemple, l'application est xml-stylesheet, le processeur de feuille de style du XML. Deux feuilles de style diffrentes peuvent tre utilises, les XSL (propres au XML) ainsi que les CSS (feuilles de style apparues avec le HTML). L'attribut type indique de quel type de fichier il s'agit (text/css pour les feuilles de style CSS, par exemple) et l'attribut href indique l'URL du fichier. Cette instruction de traitement est notamment utilise par les navigateurs Internet pour la mise en forme du document.
c. Dclaration de type de document (DTD)

Cette dclaration, lorsqu'elle est prsente, permet de dfinir la structure du document. Elle peut tre de deux types, externe ou interne. Exemple de dclaration de type de document :
<!DOCTYPE biblio SYSTEM "biblio.dtd">

Ce type de dclaration est celui d'une dclaration de type de document externe (voir le chapitre sur les DTD). Elle dfinit l'ensemble des lments utilisables dans le document, y compris l'lment-racine (ici biblio) ainsi que le nom de fichier biblio.dtd dans lequel se trouve dfinie la structure du document. L'autre type de document permettant de dfinir la structure d'un fichier, le schma XML. IV. La syntaxe du XML 3. Les commentaires En XML, les commentaires se dclarent de la mme faon qu'en HTML. Ils commencent donc par <!-- et se terminent par -->. Ils doivent imprativement se trouver lextrieur dune balise PCDATA
<!-- ceci est correct --> <element> Un peu de texte </element>

Remarque : En raison de la compatibilit XML/SGML, la chane de caractres -- est interdite dans un commentaire. 4. L'arbre d'lments Un document XML peut se reprsenter sous la forme d'une arborescence d'lments. Cette arborescence comporte une racine (unique), des branches et des feuilles.
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- Element racine --> <biblio>
4 / 15 Introduction XML

<!Premier enfant --> <livre> <!-- lment enfant titre --> <titre>Les Misrables</titre> <auteur>Victor Hugo</auteur> <nb_tomes>3</nb_tomes> </livre> <livre lang="en"> <titre>David Copperfield</titre> <auteur>Charles Dickens</auteur> </livre> </biblio>

lment racine L'lment-racine (en anglais : document element) est, comme son nom l'indique, la base du document XML. Il est unique et englobe tous les autres lments. Il s'ouvre juste aprs le prologue, et se ferme la toute fin du document. Dans l'exemple ci-dessus, l'lment racine est biblio. Les lments Les lments forment la structure mme du document : ce sont les branches et les feuilles de l'arborescence. Ils peuvent contenir du texte, ou bien d'autres lments, qui sont alors appels "lments enfants", l'lment contenant tant quant lui appel logiquement "lment parent". Exemple d'lment contenant du texte :
<titre>Les Misrables</titre>

Exemple d'lment contenant d'autres lments :


<livre> <titre>L'Assommoir</titre> <auteur>mile Zola</auteur> <couverture couleur="rouge" /> </livre> <couverture couleur="rouge" />

D'autres lments sont vides : ils ne contiennent pas d'lment-enfant. Exemple d'lment vide : Les attributs Tous les lments peuvent contenir un ou plusieurs attributs. Un attribut est compos d'un nom et d'une valeur. Il ne peut tre prsent que dans la balise ouvrante de l'lment (par exemple, on n'a pas le droit d'crire </livre lang="en">). Exemple d'utilisation d'un lment avec attribut :
<instrument type="vent">trompette</instrument>

Les valeurs des attributs doivent toujours tre mises entre des guillemets, au contraire du Html o leur absence n'a plus beaucoup d'importance. Ainsi, l'criture suivante est incorrecte car il manque les guillemets.
<date anniversaire=071185>

La bonne criture est :


<date anniversaire="071185">

Les entits Certains caractres ayant un sens prcis en XML, il est ncessaire de leur trouver un remplaant lorsque l'on a besoin de les insrer dans un document. On a recours dans ce cas des entits prdfinies. Ces entits sont : Caractre Entit & &amp;
5 / 15 Introduction XML

< > " ' Exemple, pour avoir :


<verite>deux<trois>un</verite>

&lt; &gt; &quot; &aquot;

On doit crire :

<verite>deux&lt;trois&gt;un</verite>

Les sections CDATA Le sections CDATA permettent de transmettre les donnes quelles contiennent telles quelles lapplication, via le parseur. Exemple :
<verite>[CDATA[deux<trois>un]]</verite>

5. Rgles de composition Le XML impose des rgles de syntaxe trs spcifiques par rapport au Html. En outre, on retrouvera ces mmes rgles de syntaxe dans tous les langages drivs du XML comme le XHTML Le XML est un langage de balises [Markup Language]. Mais au contraire du Html o les balises sont dfinies, vous devez inventer vos balises. Rappelez-vous, le XML est eXtensible. Il faut donc crire soi-mme le nom des balises utilises. Il y a quelques rgles pour la composition des noms (mais elles ne drouteront pas les habitus du Javascript) : Les noms peuvent contenir des lettres, des chiffres ou d'autres caractres. Les noms ne peuvent dbuter par un nombre ou un signe de ponctuation. Les noms ne peuvent commencer par les lettres xml (ou XML ou Xml...). Les noms ne peuvent contenir des espaces. La longueur des noms est libre mais on conseille de rester raisonnable. On vitera certains signes qui pourraient selon les logiciels, prter confusion comme "-", ";", ".", "<", ">", etc. Les caractres spciaux pour non francophones comme , , , , sont priori permis mais pourraient tre mal interprts par certains programmes. On profitera de cette libert dans les noms pour les rendre le plus descriptif possible comme par exemple <gras_et_italique>. Les balises sont sensibles au majuscules et minuscules [case sensitive]. Ainsi, la balise <Message> est diffrente de la balise <message>. La balise d'ouverture et la balise de fermeture doivent donc tre identiques. Ainsi par exemple ; <Message> ... </message> est incorrect et <message> ... </message> est correct. Une tendance se dgage pour n'crire les balises qu'en minuscules, limitant ainsi les erreurs possibles. Toute balise ouverte doit imprativement tre ferme. Fini les critures bcles du Html o l'on pouvait dans certains cas omettre la balise de fin comme pour le paragraphe <p> ou l'lment de liste <li>.
6 / 15 Introduction XML

Ainsi en Html, ce qui suit est affich correctement : <p> <ul> <li>Point 1 <li>Point 2 Le XML est beaucoup plus strict. On devrait avoir : <p> <ul> <li>Point 1</li> <li>Point 2</li> <p> Les ventuelles balises uniques ou appeles aussi balises vides, comme <br>, <meta> ou <img> en Html, doivent galement comporter un signe de fermeture soit balise/. Ainsi une balise <meta/> est correcte en XML. Les balises doivent tre correctement imbriques. Le XML tant trs proccup par la structure des donnes, des balises mal imbriques sont des fautes graves de sens. Ainsi l'criture suivante est incorrecte car les balises ne sont pas bien imbriques : <parent><enfant>Loc</parent></enfant> L'criture correcte avec une bonne imbrication des lments est : <parent><enfant>Marine</enfant></parent> Tout document XML doit comporter une racine. En fait, la premire paire de balises d'un document XML sera considr comme la balise de racine [root]. Par exemple : <racine> ... suite du document XML ... </racine> Si on ose faire un lien avec le Html, votre lment racine tait <body> ... </body>. Tous les autres lments seront imbriqus entre ces balises de racine. Par exemple : <parents> <enfants> <petits_enfants> ... </petits_enfants> </enfants> </parents> Les valeurs des attributs doivent toujours tre mises entre des guillemets. Le XML peut avoir (comme le Html) des attributs avec des valeurs. En XML, les valeurs des attributs doivent obligatoirement tre entre des guillemets, au contraire du Html o leur absence n'a plus beaucoup d'importance. Ainsi, l'criture suivante est incorrecte car il manque les guillemets. <date anniversaire=071185>
7 / 15 Introduction XML

La bonne criture est : <date anniversaire="071185"> Le XML est un langage strict. Votre document doit imprativement respecter la syntaxe du XML. On dira alors que le document est "bien form" [Well-formed]. Seuls les documents "bien forms" seront affichs correctement. A la moindre erreur de syntaxe, le document ne sera pas ou ne sera que partiellement affich. 6. Un premier document XML Rien de bien compliqu mais ce document sera toff en cours d'tude. <?xml version="1.0" encoding="ISO-8859-1"?> La dclaration <?xml version="1.0"?> indique au navigateur que ce qui suit est un document XML selon sa version 1.0. Vous remarquerez que cette balise ne comporte pas de signe de fermeture car cette balise n'est pas encore du XML. On en profite gnralement pour notifier le "character set" qui indique l'interprteur XML [Parser] le jeu de caractres utiliser. Le jeu de caractres "ISO-8859-1" a, pour nous francophones, l'avantage d'accepter la plupart des lettres avec des accents. Mais il existe d'autres jeux de caractres comme UTF-8 ou UTF-16 plutt destins aux anglosaxons car ils ne reprennent pas les accents. <racine> L'lment racine indispensable au XML. Vous pouvez utiliser, votre convenance, n'importe quel nom l'intrieur de cette balise de racine. ... suite du document XML ... Votre document XML proprement dit, qui respectera bien entendu scrupuleusement la syntaxe du XML ("bien form"). </racine>
Le document XML se termine obligatoirement la fermeture de la balise de racine.

Elaboration du fichier Voici un petit fichier XML. <?xml version="1.0"?> <racine> <enfants> <masculin>Loic</masculin> <feminin>Marine</feminin> </enfants> </racine> On le reproduit dans le programme Bloc-notes [notepad] pour les gens de Windows.

8 / 15

Introduction XML

Et on l'enregistre (non pas en type de document Texte) en " Type : Tous (*.*) " sous un nom avec une extension .xml.

Rsultat dans Microsoft Explorer 5 et + Depuis le version 5 de Microsoft Internet Explorer, les fichiers XML s'affichent sans problmes.

Vous remarquerez qu'il y a un petit signe - affich devant des balises englobantes (voir le pointeur sur la capture d'cran). Il suffit de cliquer sur le signe pour masquer celles-ci. Et bien entendu de cliquer sur le signe + pour les faire rapparatre.

9 / 15

Introduction XML

Rsultat sous Netscape 6 et + Le mme fichier ne sera visible sur Netscape qu' partir de la version 6. L'interprtation de ce fichier XML est pour le moins diffrente.

Au risque de me faire des ennemis, le XML et surtout le XSL est surtout l'affaire de Microsoft Explorer qui les prend mieux en compte. Esprons que ce ne soit que momentan. 7. Afficher le XML avec CSS
Le CSS Pour afficher les balises XML, on peut faire appel aux bonnes vieilles feuilles de style (CSS), maintenant classiques dans le paysage Html. A chaque balise "invente" dans le fichier XML, on va dfinir un lment de style que le navigateur pourra alors afficher. Un exemple de XML + CSS A seule fin de dmonstration, voici un exemple des possibilits d'une feuille de style CSS associe un document XML. Voici notre document XML de dpart : <?xml version="1.0" encoding="ISO-8859-1"?> <racine> <enfant> <nom>Loc</nom> <lien>garon</lien> <date>07/11/83</date> <data>Le petit qui me dpasse d'une tte.</data> </enfant> <enfant> <nom>Marine</nom> <lien>fille</lien> <date>20/12/85</date> <data>La petite fille chrie son papa.</data> </enfant> </racine>

10 / 15

Introduction XML

Affich dans le navigateur, cela nous donne :

On ajoute un fichier .css dont voici le contenu :

<style type="text/css"> racine , enfant {} nom { display: block; width: 250px; font-size: 16pt ; font-family: arial ; font-weight: bold; background-color: teal; color: white; padding-left: 10px; } lien { display: block; font-size: 12pt; padding-left: 10px; } date { display: block; font-size: 12pt; color: red ; font-weight: bold; padding-left: 10px; } data { display: block; font-size: 11pt ; font-style: italic; font-family: arial ; padding-left: 10px; } </style>

11 / 15

Introduction XML

Aprs avoir ajout un lien vers le fichier css dans le fichier xml : <?xml-stylesheet href="css.css" type="text/css"?> On obtient finalement :

Mais il y a encore un autre moyen, plus performant et aux possibilits plus tendues : afficher du XML avec le XSL soit le langage de feuilles de style eXtensible. Le pendant du XML au CSS. 8 Des diteurs XML expliqus N'attendez pas de miracle des diteurs XML ! Comme en XML vous fabriquez sur mesure vos balises, les diteurs ne peuvent avoir qu'un rle d'aide l'encodage et la structure de votre document. Les diteurs XML sont cependant d'une grande utilit si vous avez de nombreuses balises rcurrentes dans votre document XML. En outre, s'il en ncessaire d'actualiser souvent les donnes du votre fichier Xml, il sera beaucoup plus facile de vous retrouver dans l'interface d'un diteur que dans le fouillis de balises du code source. Microsoft XML Notepad

12 / 15

Introduction XML

Nous allons reproduire le fichier XML qui nous a servi d'exemple jusqu'ici (simple.xml). Cliquez sur "Root_Element" dans la fentre Structure pour l'lment racine et saisissez document au clavier. Cliquez ensuite sur "Child_Element" et encodez la balise enfant. Ajoutons le sous-lment nom. Cliquez cet effet sur l'lment enfant, avec le bouton droit de la souris et slectionnez dans le menu contextuel Insert ! Child Element.

Dans la fentre Structure, le curseur d'insertion clignote dans le sous-lment ajout. On y ajoute la balise nom. On accde ensuite au cadre de droite soit dans la fentre Valeur et on saisit Loic. A ma connaissance, XML Notepad ne permet pas de reprendre le jeu de caractres "ISO-8859-1".

Ajoutons les autres sous-lments lien, date et data. On clique sur nom ! bouton droit ! Insert ! Element et on encode les donnes. On va maintenant rpter la srie de balises de sous-lments. On clique sur enfant ! bouton droit ! Duplicate et la srie est reproduite. On peut encoder les valeurs.

13 / 15

Introduction XML

Pour voir le document termin, menu View ! Source. En outre, dans la fentre ouverte, on vous signale si le document est "bien form [well formed].

XML Spy

Avec XML Spy, on dispose d'un programme dj plus professionnel. Il est notre avis assez remarquable pour la structure qu'il met en place.

Nous allons reproduire le fichier XML qui nous a servi d'exemple jusqu'ici (simple.xml). Commenons par l'lment racine. On prend le menu XML / Insert / Element et on encode la balise racine.

Encodons l'lment enfant. Aprs avoir cliqu dans le zone racine menu XML / Add child

14 / 15

Introduction XML

On passe aux sous-lments. Aprs avoir cliqu dans la zone enfant, on demande 4 lments soit menu XML / Add child / Element que l'on rpte 4 fois et on remplit les balises et les donnes.

Et l'on refait la mme chose pour les autres donnes enfant.

Ceci n'est vraiment qu'un trs bref aperu de XML Spy dont les possibilits sont nettement plus nombreuses et tendues.

15 / 15

Introduction XML

Initiation aux schmas XML


I. Introduction
1. Limitations des DTD - Premirement, les DTD ne sont pas au format XML. Cela signifie qu'il est ncessaire d'utiliser un outil spcial pour manipuler un tel fichier, diffrent de celui utilis pour l'dition du fichier XML. - Deuximement, les DTD ne supportent pas les espaces de nom (voir plus loin). En pratique, cela implique qu'il n'est pas possible d'importer des dfinitions de balises dfinies par ailleurs dans un fichier XML dfini par une DTD. - Troisimement, le typage des donnes (c'est--dire la possibilit de spcifier par exemple qu'un attribut ne doit tre qu'un nombre entier) est extrmement limit. 2. Apports des schmas Conu pour pallier les dficiences pr-cites des DTD, XML Schema propose des nouveauts en plus des fonctionnalits fournies par les DTD : Le typage des donnes est introduit, ce qui permet la gestion de boolens, d'entiers, d'intervalles de temps... Il est mme possible de crer de nouveaux types partir de types existants. La notion d'hritage. Les lments peuvent hriter du contenu et des attributs d'un autre lment.. Le support des espaces de nom. Les indicateurs d'occurrences des lments peuvent tre tout nombre non ngatif (rappel : dans une DTD, on est limit 0, 1 ou un nombre infini d'occurences pour un lment). Les schmas sont trs facilement concevables par modules.

II. Les premiers pas


1. Introduction Le but d'un schma est de dfinir une classe de documents XML. Il permet de dcrire les autorisations d'imbrication et l'ordre d'apparition des lments et de leurs attributs, tout comme une DTD. Mais il permet aussi d'aller au-del. Un premier point intressant est qu'un fichier Schema XML est un document XML. Cela permet un tel document d'tre manipul de la mme manire que n'importe quel autre fichier XML, et en particulier par une feuille de style XSDL. Le vocabulaire de XML Schema est compos d'environ 30 lments et attributs. 2. Structure de base Comme tout document XML, un Schema XML commence par un prologue, et a un lment racine.
<?xml version="1.0" encoding="ISO-8859-1"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"> <!--d'lments, d'attributs et de types ici --> </xsd:schema> dclarations

L'lment racine est l'lment xsd:schema. Pour le moment, oubliez l'attribut xmlns:xsd qui fait rfrence l'espace de noms utilis pour l'criture du fichier. Il faut simplement retenir que tout lment d'un schma doit commencer par le prfixe xsd.

III. Dclarations d'lments et d'attributs


1. Dclarations d'lments Un lment, dans un schma, se dclare avec la balise <xsd:element>. Par exemple,
<?xml version="1.0" encoding="ISO-8859-1"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"> <xsd:element name="contacts" type="typeContacts" /> <xsd:element name="remarque" type="xsd:string" />
1 / 9
Initiation aux schmas XML

<!-- dclarations de types ici --> </xsd:schema>

Le schma prcdent dclare deux lments : un lment contacts et un lment remarque. Chaque lment est typ -c'est--dire qu'il doit respecter un certain format de donnes. L'lment contacts est ainsi du type typeContacts, qui est un type complexe dfini par l'utilisateur. L'lment remarque quant lui est du type xsd:string qui est un type simple prdfini de XML Schema. Chaque lment dclar est associ un type de donnes via l'attribut type. Les lments pouvant contenir des lment-enfants ou possder des attributs sont dits de type complexe, tandis que les lments n'en contenant pas sont dits de type simple. 2. Dclarations d'attributs a. Dclaration simple la diffrence des lments, un attribut ne peut tre que de type simple. Cela signifie que les attributs, comme avec les DTD, ne peuvent contenir d'autres lments ou attributs. De plus, les dclarations d'attributs doivent tre places aprs les dfinitions des types complexes, autrement dit, aprs les lments xsd:sequence, xsd:choice et xsd:all (voir plus loin). Exemple :
<?xml version="1.0" encoding="ISO-8859-1"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"> . . . . . . <xsd:element name="image"> <xsd:complexType> <xsd:attribute name="source" type="xsd:anyURI" use="required"/> </xsd:complexType> </xsd:element> . . . </xsd:schema>

b. Contraintes d'occurences Tout comme dans une DTD, un attribut peut avoir un indicateur d'occurences. L'lment attribute d'un Schema XML peut avoir trois attributs optionnels : use, default et fixed. Des combinaisons de ces trois attributs permettent de paramtrer ce qui est acceptable ou non dans le fichier XML final (attribut obligatoire, optionnel, possdant une valeur par dfaut...). Par exemple, la ligne suivante permet de rendre l'attribut maj optionnel, avec une valeur par dfaut au 11 octobre 2003 s'il n'apparat pas (le format de date est standardis : cette date s'crit donc l'anglosaxonne anne-mois-jour ; cela permet en outre de plus facilement classer les dates).
<xsd:attribute name="maj" type="xsd:date" use="optional" default="2003-10-11" />

Il est noter que la valeur de l'attribut default doit tre conforme au type dclar. Par exemple :
<xsd:attribute name="maj" type="xsd:date" use="optional" default="-43" />

produirait une erreur la validation du schma. c. Regroupements d'attributs XML Schema propose une fonctionnalit supplmentaire, permettant de dclarer des groupes d'attributs (groupes auxquels il est possible de faire appel lors d'une dclaration d'lments). Cela permet d'viter de rpter des informations de dclarations. Exemple :
<xsd:attributeGroup name="AttributsLivre"> <xsd:attribute name="isbn" type="IsbnType"/> <xsd:attribute name="prix" type="xsd:float"/> </xsd:attributeGroup> <xsd:complexType name=TypeLivre">
2 / 9
Initiation aux schmas XML

Utilisation :

<xsd:sequence> <xsd:element name="titre" type="xsd:string"/> <xsd:element name="auteur" type="xsd:string"/> </xsd:sequence> <xsd:attributeGroup ref="AttributsLivre"/> </xsd:complexType>

d. Dclaration d'lment ne contenant que du texte avec un (ou plusieurs) attribut(s) Un tel lment est de type complexe, car il contient au moins un attribut. Afin de spcifier qu'il peut contenir galement du texte, on utilise l'attribut mixed de l'lment xsd:complexType. Par dfaut, mixed="false"; il faut dans ce cas forcer mixed="true". Par exemple,
<xsd:element name="prix"> <xsd:complexType mixed="true"> <xsd:attribute name="devise" use="required" /> </xsd:complexType> </xsd:element>

3. Dclaration et rfrencement La procdure prcdente de dclaration d'lments peut amener une structure de type poupe russe des dclarations. Pour des raisons de clart, il est beaucoup plus avantageux d'ordonner ces dclarations. Il est recommand de commencer par dclarer les lments et attributs de type simple, puis ceux de type complexe. On peut en effet faire rfrence, dans une dclaration de type complexe, un lment de type simple prlablement dfini. Par exemple...
<xsd:element name="livre"> <xsd:complexType> <xsd:sequence> <xsd:element name="auteur" type="xsd:string" /> <xsd:element name="pages" type="xsd:positiveInteger" /> </xsd:sequence> </xsd:complexType> </xsd:element>

... est plus difficile maintenir que...


<xsd:element name="pages" type="xsd:positiveInteger" /> <xsd:element name="auteur" type="xsd:string" /> <xsd:element name="livre"> <xsd:complexType> <xsd:sequence> <xsd:element ref="auteur" /> <xsd:element ref="pages" /> </xsd:sequence> </xsd:complexType> </xsd:element>

IV. Les types de donnes


1. Introduction Ainsi que nous l'avons dj brivement signal, XML Schema permet de spcifier des types de donnes bien plus finement que le langage DTD. Il distingue notamment types simples et types complexes. 2. Types simples a. Gnralits Les types de donnes simples ne peuvent comporter ni attributs, ni lments enfants. Il en existe de nombreux, prdfinis, mais il est galement possible d'en "driver" de nouveaux (nous reviendrons plus loin sur cette fonctionnalit). Enfin, il est possible de dclarer des "listes" de types.

3 / 9

Initiation aux schmas XML

b. Bibliothque de types intgrs Nombreux sont les types prdfinis dans la bibliothque de types intgrs de XML Schema. la figure suivante en donne la hirarchie, et leur liste dtaille figure sur le site du W3C.

Les types de donnes les plus simples (les chanes de caractres) que permettaient les DTDs sont conservs, mais d'autres ont fait leur apparition. On pourra envisager, par exemple, dans un schma dcrivant un bon de commande, la dclaration d'un attribut quantite :
<xsd:attribute name="quantite" type="xsd:positiveInteger" use="required" default="1" />

... qui force la valeur de l'attribut un tre un entier positif. Un bon de commande XML suivant ce schma, ayant une commande spcifiant quantite="-3" sera alors automatiquement refus par le systme.

4 / 9

Initiation aux schmas XML

c. Listes Il galement possible de crer une liste personnalise, par drivation de types existants. Par exemple :
<xsd:simpleType name="numroDeTlphone"> <xsd:list itemType="xsd:unsignedByte" /> </xsd:simpleType>

Un lment conforme cette dclaration serait <tlphone>01 44 27 60 11</tlphone>. d. Unions Les listes et les types simples intgrs ne permettent pas de choisir le type de contenu d'un lment. On peut dsirer, par exemple, qu'un type autorise soit un nombre, soit une chane de caractres particuliers. Il est possible de le faire l'aide d'une dclaration d'union. Par exemple, sous rserve que le type simple numroDeTlphone ait t pralablement dfini (voir prcdemment), on peut dclarer...
<xsd:simpleType name="numroDeTlphoneMnmoTechnique"> <xsd:union memberTypes="xsd:string numroDeTlphone" /> </xsd:simpleType>

Les lments suivants sont alors des "instances" valides de cette dclaration :
<tlphone>18</tlphone> <tlphone>Pompiers</tlphone>

3. Les types complexes a. Introduction Un lment de type simple ne peut contenir pas de sous-lment. Il est ncessaire pour cela de le dclarer de type complexe. On peut alors dclarer des squences d'lments, des types de choix ou des contraintes d'occurences b. Squences d'lments Nous savons dj comment, dans une DTD, nous pouvons dclarer un lment comme pouvant contenir une suite de sous-lments dans un ordre dtermin. Il est bien sr possible de faire de mme avec un schma. On utilise pour ce faire l'lment xsd:sequence, qui reproduit l'oprateur , du langage DTD. Ainsi...
<xsd:complexType name="typePersonne"> <xsd:sequence> <xsd:element name="nom" type="xsd:string" /> <xsd:element name="prnom" type="xsd:string" /> <xsd:element name="dateDeNaissance" type="xsd:date" /> <xsd:element name="adresse" type="xsd:string" /> <xsd:element name="adresseElectronique" type="xsd:string" /> <xsd:element name="tlphone" type="numroDeTlphone" /> </xsd:sequence> </xsd:complexType>

Salari est compos de la squence nom, prnom, dateDeNaissance, adresse, adresseElectronique, tlphone. (obligatoirement dans lordre). c. Choix d'lment On peut vouloir modifier la dclaration de type prcdente en stipulant qu'on doive indiquer soit l'adresse d'une personne, soit son adresse lectronique en utilisant llment xsd:choice :
<xsd:complexType name="typePersonne"> <sequence> <xsd:element name="nom" type="xsd:string" /> <xsd:element name="prnom" type="xsd:string" /> <xsd:element name="dateDeNaissance" type="xsd:date" /> <xsd:choice> <xsd:element name="adresse" type="xsd:string" />
5 / 9
Initiation aux schmas XML

<xsd:element name="adresseElectronique" type="xsd:string" /> </xsd:choice> </sequence> <xsd:element name="tlphone" type="numroDeTlphone" /> </xsd:complexType>

Ce connecteur a donc les mmes effets que l'oprateur | dans une DTD. d. L'lment all Cet lment est une nouveaut par rapport aux DTD. Il indique que les lments enfants doivent apparatre une fois (ou pas du tout), mais dans n'importe quel ordre. Cet lment xsd:all doit tre un enfant direct de l'lment xsd:complexType. Par exemple...
<xsd:complexType> <xsd:all> <xsd:element name="nom" type="xsd:string" /> <xsd:element name="prnom" type="xsd:string" /> <xsd:element name="dateDeNaissance" type="xsd:date" /> <xsd:element name="adresse" type="xsd:string" /> <xsd:element name="adresseElectronique" type="xsd:string" /> <xsd:element name="tlphone" type="numroDeTlphone" /> </xsd:all> </xsd:complexType>

... indique que chacun de ces lments peut apparatre une fois ou pas du tout (quivalent de l'oprateur ? dans une DTD), et que l'ordre des lments n'a pas d'importance (cela n'a pas d'quivalent dans une DTD). e. Indicateurs d'occurences Dans une DTD, un indicateur d'occurence ne peut prendre que les valeurs 0, 1 ou l'infini. Dans XML Schema, les indicateurs doccurrences sont exprims via les attributs minOccurs et maxOccurs. La valeur autorise pour minOccurs est un nombre entier positif; la valeur autorise pour maxOccurs est un nombre entier positif ou la valeur prdfinie unbounded, spcifiant que le nombre autoris doccurrences nest pas born. Les attributs minOccurs et maxOccurs peuvent tre associs aux lments xsd:element ou aux constructeurs xsd:sequence, xsd:choice et xsd:all. La valeur par dfaut des attributs minOccurs et maxOccurs est 1. Le tableau suivant rcapitule les possibilits : Dans une DTD Valeur de minOccurs
* + ?

Valeur de maxOccurs
unbounded

0 0 nombre entier n quelconque

1 (pas ncessaire, valeur par dfaut) unbounded 1 (pas ncessaire, valeur par dfaut) nombre entier m quelconque suprieur ou gal n 1 (pas ncessaire, valeur par dfaut) 1 (pas ncessaire, valeur par dfaut)

rien impossible Exemple :

<xsd:element name="recette"> <xsd:complexType> <xsd:sequence> <xsd:element name="titre" type="xsd:string"/> <xsd:element name="commentaire" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="ingredient" maxOccurs="unbounded"/> <xsd:element name="image" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element>

6 / 9

Initiation aux schmas XML

f. Cration de type complexe partir de types simples Il est possible galement de crer un type complexe partir d'un type simple. On peut avoir besoin de dfinir un lment contenant une valeur simple, et possdant un attribut, comme <poids unite="kg">67</poids>, par exemple. Un tel lment ne peut pas tre dclar de type simple, car il contient un attribut. Il faut driver un type complexe partir du type simple positiveInteger :
<xsd:complexType name="typePoids"> <xsd:simpleContent> <xsd:extension base="xsd:positiveInteger"> <xsd:attribute name="unite" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType>

L'lment xsd:simpleContent indique que le nouvel lment ne contient pas de sous-lment.

VI. Les drivations


1. Introduction Les types simples et complexes permettent dj de faire plus de choses que les dclarations dans le langage DTD. Il est possible de raffiner leur dclaration de telle manire qu'ils soient une "restriction" ou une extension d'un type dj existant, en vue de prciser un peu plus leur forme. Nous allons nous limiter dans ce cours d'initiation la restriction des types simples. 2. Restriction de type a. Gnralits La drivation par restriction permet de crer de nouveaux types simples partir des types simples prdfinis par le format XML Schema. On utilise pour ce faire des facettes, qui sont des contraintes supplmentaires appliques un type simple particulier. Une facette permet de placer une contrainte sur l'ensemble des valeurs que peut prendre un type de base. Par exemple, on peut souhaiter crer un type simple, appel MonEntier, limit aux valeurs comprises entre 0 et 99 inclus. On drive ce type partir du type simple prdfini nonNegativeInteger, en utilisant la facette maxExclusive.
<xsd:simpleType name="monEntier"> <xsd:restriction base="nonNegativeInteger"> <xsd:maxExclusive value="100" /> </xsd:restriction> </xsd:simpleType>

Il existe un nombre important de facettes qui permettent de : fixer, restreindre ou augmenter la longueur minimale ou maximale d'un type simple numrer toutes les valeurs possibles d'un type prendre en compte des expressions rgulires fixer la valeur minimale ou maximale d'un type (voir l'exemple ci-dessus) fixer la prcision du type... b. Exemples Ici, le type de lattribut difficulty est un type driv dfini par le concepteur du schma qui fait usage de la facette xsd:enumeration afin de restreindre le type prdfini xsd:string.
<xsd:attribute name="difficulty" use="optional" default="difficult"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="easy"/> <xsd:enumeration value="medium"/> <xsd:enumeration value="difficult"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute>
7 / 9
Initiation aux schmas XML

Pour limiter la longueur d'une chane :


<xsd:simpleType name="typeMotLangueFrancaise"> <xsd:restriction base="xsd:string"> <xsd:length value="21" /> </xsd:restriction> </xsd:simpleType>

Plus complexe, on peut utiliser des expressions rgulires, qui permettent de spcifier quels sont les caractres autoriss, l'aide de l'lment xsd:pattern. Par exemple...
<xsd:simpleType name="typeAdresseElectronique"> <xsd:restriction base="xsd:string"> <xsd:pattern value="(.)+@(.)+" /> </xsd:restriction> </xsd:simpleType>

Dans cet exemple, (.)+ signifie que l'on peut mettre n'importe quel caractre au moins une fois, et qu'entre les deux chanes doit imprativement apparatre le caractre @. Un numro ISBN est un rfrent international pour une publication. Il s'agit d'un numro 10 ou 13 chiffres. On peut le dclarer ainsi :
<xsd:simpleType name="typeISBN"> <xsd:restriction base="xsd:string"> <xsd:pattern value="[0-9]{10}" /> </xsd:restriction> </xsd:simpleType>

Pour plus dinfos sur les facettes, voir W3C l'adresse http://www.w3.org/TR/xmlschema-0/#SimpleTypeFacets.

VII. Diverses autres fonctionnalits


1. Inclusion de schmas Un Schema XML a rapidement tendance devenir rapidement suffisamment long pour que sa complexit apparente rebute l'il humain. Il est alors plus raisonnable de le scinder en plusieurs morceaux, chacun charg de dfinir prcisment tel ou tel sous-domaine du schma. Il est en effet possible d'inclure plusieurs schmas dans un seul, l'aide de l'lment xsd:include. Cela offre de plus l'norme avantage de modulariser un schma, et donc de pouvoir sans difficult importer certaines parties partir de schmas dj existants. Supposons par exemple que nous ayons dfini le schma d'une bibliographie dans le cadre plus gnral de l'criture d'un mmoire. Ce Schema XML est stock l'URL http://www.monsite.org/schemas/biblio.xsd. Nous avons besoin d'une bibliographie pour une autre aplication -par exemple, dresser la liste d'un ensemble de ressources pour un site Web de e-formation. Nous pouvons inclure le schma prcdemment crit l'aide de la commande...
<xsd:include schemaLocation="http://www.monsite.org/schemas/biblio.xsd" />

Il s'agit d'une sorte de copier-coller du contenu de la bibliographie dans le schma en cours d'criture. La seule condition est que le targetNameSpace soit le mme dans le Schema XML inclus et dans le Schema XML importateur. 2. Documentation
XML Schema permet, outre l'utilisation des commentaires comme tout format XML, l'adjonction de documentation aux lments. La documentation l'intention des lecteurs humains peut tre dfinie dans des lments xsd:documentation, tandis que les informations l'intention de programmes doivent tre incluses dans des lments xsd:appinfo. Ces deux lments doivent tre placs dans un lment xsd:annotation. Ils disposent d'attributs optionnels : xml:lang et source, qui est une rfrence une URI pouvant tre utilise pour identifier l'objectif du commentaire ou de l'information. 8 / 9
Initiation aux schmas XML

Les lments xsd:annotation peuvent tre ajouts au dbut de la plupart des constructions.

V. Espaces de nom
1. Introduction La notion d'espace de nom est complexe ; elle permet un document XML quelconque d'utiliser les balises dfinies dans un schma donn. Cette notion apparat : dans les feuilles de style XSL, o nous utilisions des lments prfixs par xsl, aprs avoir crit
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> dans un schma, o nous utilisions des lments prfixs par xsd, aprs avoir crit <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema">.

Cela signifie que l'espace de nom auquel ces balises font rfrence, l o elles sont dfinies, est un schma particulier que l'on peut consulter. 2. Comment lier un fichier XML un schma ? Nous n'allons pas ici entrer dans les dtails de la notion d'espace de nom, mais simplement apprendre valider un document XML d'aprs un Schema XML. On utilise pour ce faire le prfixe xmlns. Un schma est en effet un document XML, et on trouve dans son lment racine l'attribut xmlns:xsd="http://www.w3.org/2001/XMLSchema". Cela signifie que dans le document, tous les lments commenant par xsd sont rfrencs cette URL. Donc si on a dpos un schma l'adresse http://www.monsite.org/collection_schemas/biblio, on peut l'appeler par <xsd:biblio xmlns="http://www.monsite.org/collection_schemas/biblio">. Dans le cas d'une rfrence locale, on fait rfrence au schma dans le document XML en utilisant l'attribut noNamespaceSchemaLocation. Par exemple,
<biblio xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="biblio10.xsd">.

9 / 9

Initiation aux schmas XML

Mise en forme l'aide de feuilles de style XSL


(XPath et XSLT) I. Prsentation
1. Introduction XSL signifie eXtensive Stylesheet Langage, ou langage extensible de feuille de style. Cette abrviation recouvre en fait trois langages : dsigne un moyen d'accder un nud quelconque de l'arborescence d'un document XML partir d'un autre nud quelconque. XSLT signifie eXtensible Stylesheet Langage Transformation. XSL-FO signifie eXtensible Stylesheet Langage - Formating Objects, et dsigne un langage permettant le contrle de la mise en page finale de la transformation. Ce langage est particulirement destin la production de contenus au format PDF.
XPath

Ce cours se limitera aborder les deux premiers langages. Le XSLT permet de transformer un document XML source en un autre qui peut tre soit XML, HTML ou texte. Le fonctionnement du XSL est fond sur les manipulations de modles (templates). Les lments du document XML d'origine sont remplacs (ou lgrement modifis) par ces modles. Un modle contient ainsi le texte (lments, attributs, texte...) de remplacement d'un lment donn. Tout lment pouvant tre remplac dans le fichier de sortie par tout type de contenu texte, XSL est un outil privilgi de production de fichiers HTML partir de sources XML. Un fichier XSL tant un fichier XML, il doit respecter les normes de syntaxe de ce format. 2. Structure d'un document XSL La structure de base d'un document XSL commence par un prologue, puis un lment <xsl:stylesheet> pouvant contenir quelques attributs, notamment une dclaration d'espace de noms ainsi que le numro de version. L'exemple suivant prsente l'appel cet lment tel que nous le pratiquerons dans ce cours :
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> . . . . . . . . </xsl:stylesheet>

L'lment <xsl:stylesheet> est l'lment racine du document XSL. C'est lui qui contient tous les modles, y compris celui qui est associ la racine du document XML, modle que l'on note <xsl:template match="/">. L'attribut match="/" indique que ce modle s'applique la racine du document XML.

II. Exemples de mises en forme


1. Exemple simple a. Introduction Il est possible de traiter de manire simple un fichier XML contenant une information relativement linaire. Ainsi, l'exemple dj prsent d'une composition de bouteille d'eau, dans le cas d'une seule bouteille, se prte facilement une simple mise en forme HTML. b. Exemple Exemple d'un document XML li une feuille de style XSL simple :
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="bouteille1.xsl"?> <bouteille> <marque>Cristaline</marque> <composition>calcium 71mg/l, magnsium 5,5mg/l, chlorure 20mg/l, nitrate 1mg/l, traces de fer.</composition> <source> <ville>St-Cyr la Source</ville>

1 / 16

XPath_XSLT

<departement>Loiret</departement> </source>

<code_barre>3274080005003</code_barre> <contenance>150cl</contenance> <ph>7,45</ph> </bouteille>

Et voici la feuille de style XSL associe :


<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <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> <p><xsl:value-of select="bouteille/composition" /></p> <h2>Lieu d'origine:</h2> <p>Ville de <b><xsl:value-of select="bouteille/source/ville" /></b>, dans le dpartement <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>

III. Les expressions de slection


1. Introduction Connues en anglais sous le nom de XSL patterns, les expressions de slection sont des chanes de caractres qui permettent de slectionner des nuds dans un document source. Il est galement possible d'utiliser une syntaxe spciale, appele XPath, qui permet, en se fondant sur la structure arborescente du document XML (le Document Object Model -DOM), de faire rfrence des lments et/ou des attributs. 2. Slection d'lments et d'attributs a. Slection d'lment, syntaxe de base L'exemple le plus simple d'expression de slection est le nom d'un type d'lment. Cette expression slectionne tous les lments du type prcis descendant ou anctre d'un nud donn. Exemple :
<xsl:value-of select="nom_element" />

L'oprateur / permet de dfinir le chemin d'accs aux lments slectionner, et donc leur parent. Par exemple, section/paragraphe slectionne les lments section du nud courant et pour chaque lment section, slectionne les lments paragraphe qu'il contient. En d'autres termes, cette expression slectionne les petits-fils paragraphe du nud courant qui ont pour pre un nud section. Un nom d'lment peut tre remplac par * dans une expression. Par exemple, */paragraphe slectionne tous les petits-fils paragraphe quel que soit leur pre. L'utilisation de // permet d'appliquer la recherche aux descendants et non pas seulement aux fils directs. Par exemple, section//paragraphe slectionne tous les lments paragraphe descendant d'un lment section fils direct du nud courant. Le caractre . slectionne le nud courant. Par exemple, .//paragraphe slectionne tous les descendants paragraphe du nud courant.
2 / 16
XPath_XSLT

La chane .. slectionne le pre du nud courant. Par exemple, ../paragraphe slectionne tous les nuds paragraphe frres du nud courant. b. Slection d'lment, appel de fonctions L'expression comment() slectionne tous les nuds commentaires fils du nud courant. L'expression text() slectionne tous les nuds fils du nud courant, ne contenant que du texte. L'expression node() slectionne tous les nuds fils du nud courant. L'expression id("UnIdentifiant") slectionne l'lment, normalement unique, qui a un attribut attr de type ID (cf. le paragraphe "Dclaration d'attribut de type ID") valant "UnIdentifiant". c. Slection d'lment et DOM Il est galement possible de naviguer dans les branches de l'arborescence du document XML, en utilisant les ressources du DOM. Diffrents types de syntaxes sont possibles, fondes sur une expression de la forme Element[Expression]. Par exemple : o i est un nombre entier dsigne le i-me descendant direct d'un mme parent ayant le nom indiqu. Par exemple, paragraphe[3] dsigne le 3me enfant de l'lment courant, portant le nom paragraphe. Attention, la numrotation commence 1 et non 0. elt[position()>i] o i est un nombre entier slectionne tous les lments prcds d'au moins i lments de mme nom comme descendants du mme parent. Par exemple, paragraphe[position()>5] slectionne tous les lments paragraphe dont le numro d'ordre est strictement suprieur 5. elt[position() mod 2=1] slectionne tout lment qui est un descendant impair. elt[souselt] slectionne tout lment elt qui a au moins un descendant souselt ( ne pas confondre avec elt/souselt, qui slectionne tout lment souselt ayant pour parent elt...). elt[first-of-any()] slectionne le premier lment elt fils de l'lment courant. elt[last-of-any()] slectionne le dernier lment elt fils de l'lment courant. elt[first-of-type()] slectionne l'lment elt fils de l'lment courant, s'il est premier de son type. Considrons l'exemple suivant. L'lment elt peut contenir des nuds de type texte elt1 et elt2 dans n'importe quel ordre. On cherche valuer l'expression elt2[first-of-type()]. Deux cas se prsentent : soit elt commence par au moins un lment elt1, avec ventuellement un lment elt2 ensuite, soit il commence par un lment elt2. L'expression ne slectionne le premier lment elt2 que dans le second cas, o il n'est prcd par aucun lment de mme type. elt[last-of-type()] slectionne de mme l'lment elt fils de l'lment courant, s'il est le dernier de son type.
elt[i]

Par exemple, l'expression section/paragraphe[last-of-type() and first-of-type()] slectionne les lments paragraphe fils uniques dont le pre est un lment section ; l'expression section/paragraphe[last-of-any() and first-of-any()] slectionne les lments paragraphe dont le pre est un lment section qui ne contient qu'un seul lment paragraphe. La fonction ancestor() permet la slection d'un anctre du nud courant. Elle reoit en argument une expression de slection et recherche le premier anctre du nom correspondant la slection. Par exemple, ancestor(chapitre)/titre slectionne l'lment titre du chapitre contenant l'lment courant. d. Slection d'attributs Les attributs d'un lment sont slectionns en faisant prcder leur nom par le caractre @. Les rgles relatives la slection des lments s'appliquent galement aux attributs : section[@titre] slectionne les lments section qui ont un attribut titre. section[@titre="Introduction"] slectionne les lments section dont l'attribut titre a pour valeur Introduction. Si l'on veut afficher le contenu de l'attribut, on le fait prcder du caractre /. Par exemple, <xsl:valueof select="paragraphe/@titre" /> permet l'affichage du titre de l'lment paragraphe fils de l'lment courant (si rien n'est prcis, par dfaut il s'agit du premier lment paragraphe fils).

3 / 16

XPath_XSLT

e. Oprateurs logiques Les oprateurs logiques not(), and et or peuvent tre utiliss, comme par exemple section[not(@titre)], qui slectionne les lments section qui n'ont pas d'attribut titre. Attention : lorsque, dans le schma XML par exemple, l'attribut est dfini comme ayant une valeur par dfaut, mme s'il n'est pas explicit dans le document XML, il est considr comme existant.

II. XPath
1. Introduction Comme son nom l'indique, XPath est une spcification fonde sur l'utilisation de chemin d'accs permettant de se dplacer au sein du document XML. Dans ce but, un certain nombre de fonctions ont t dfinies. Elles permettent de traiter les chanes de caractres, les boolens et les nombres. Le XPath tablit un arbre de nuds correspondant au document XML. Les types de nuds peuvent tre diffrents : nud d'lment, nud d'attribut et nud de texte. En vue d'une utilisation plus aise, le XPath comprend un mcanisme qui associe tous ces types une chane de caractres. La syntaxe de base du XPath est fonde sur l'utilisation d'expressions. Une expression peut s'appliquer quatre types d'objets : un ensemble non ordonn de nuds ; une valeur boolenne (vrai ou faux) ; un nombre en virgule flottante ; une chane de caractres. Chaque valuation d'expression dpend du contexte courant. Une des expressions les plus importantes dans le standard XPath est le chemin de localisation. Cette expression slectionne un ensemble de nuds partir d'un nud contextuel. 2. Chemin de localisation a. Introduction Un chemin de localisation peut tre de type absolu ou relatif. Dans le cas o il est de type absolu, il commence toujours par le signe / indiquant la racine du document XML ; Dans le cas o il est de type relatif, le nud de dpart est le nud contextuel courant. La syntaxe de composition d'un chemin de localisation peut tre de type abrg ou non abrg. Toute syntaxe non abrge ne trouve pas forcment d'quivalenct en syntaxe abrge. Un chemin de localisation est compos de trois parties : un axe, dfinissant le sens de la relation entre le nud courant et le jeu de nuds localiser; un nud spcifiant le type de nud localiser; 0 n prdicats permettant d'affiner la recherche sur le jeu de nuds rcuprer. Par exemple, dans le chemin child::section[position()=1], child est le nom de l'axe, section le type de nud localiser (lment ou attribut) et [position()=1] est un prdicat. Les doubles :: sont obligatoires. La syntaxe d'une localisation s'analyse de gauche droite. Dans notre cas, on cherche dans le nud courant, un nud section qui est le premier nud de son type. b. Axes child : contient les enfants directs du nud contextuel. descendant : contient les descendants du nud contextuel. Un descendant peut tre un enfant, un petitenfant... parent : contient le parent du nud contextuel, s'il y en a un. ancestor : contient les anctres du nud contextuel. Cela comprend son pre, le pre de son pre... Cet axe contient toujours le nud racine, except dans le cas o le nud contextuel serait lui-mme le nud racine. following-sibling : contient tous les nuds cibles du nud contextuel. Dans le cas o ce nud est un attribut ou un espace de noms, la cible suivante est vide. preceding-sibling : contient tous les prdcesseurs du nud contextuel ; si le nud contextuel est un attribut ou un espace de noms, la cible prcdente est vide.
4 / 16
XPath_XSLT

: contient tous les nuds du mme nom que le nud contextuel situs aprs le nud contextuel dans l'ordre du document, l'exclusion de tout descendant, des attributs et des espaces de noms. preceding : contient tous les nuds du mme nom que le nud contextuel situs avant lui dans l'ordre du document, l'exclusion de tout descendant, des attributs et des espaces de noms. attribute : contient les attributs du nud contextuel ; l'axe est vide quand le nud n'est pas un lment. namespace : contient tous les nuds des espaces de noms du nud contextuel ; l'axe est vide quand le nud contextuel n'est pas un lment. self : contient seulement le nud contextuel. attribute : les attributs du noeud descendant-or-self : contient le nud contextuel et ses descendants. ancestor-or-self : contient le nud contextuel et ses anctres. Cet axe contiendra toujours le nud racine.
following

c. Prdicats Le contenu d'un prdicat est une prdiction. Chaque expression est value et le rsultat est un boolen. Par exemple, section[3] est quivalent section[position()=3]. Ces deux expressions sont quivalentes : chacune d'entre elles produit un boolen. Dans le premier cas, il n'y a pas de test, on slectionne simplement le troisime lment, l'expression est obligatoirement vraie. Dans le second cas, un test est effectu par rapport la position de l'lment section ; lorsque la position sera gale 3, l'expression sera vraie. d. Syntaxe non abrge Cette syntaxe va tre prsente par plusieurs exemples... Les parties qui dpendent du fichier XML analys sont crites de cette manire. child::para : slectionne l'lment para enfant du nud contextuel. child::* : slectionne tous les lments enfants du nud contextuel. child::text() : slectionne tous les nuds de type texte du nud contextuel. child::node() : slectionne tous les enfants du nud contextuel, quel que soit leur type. attribute::name : slectionne tous les attributs name du nud contextuel. attribute::* : slectionne tous les attributs du nud contextuel. descendant::para : slectionne tous les descendants para du nud contextuel. ancestor::div : slectionne tous les anctres div du nud contextuel. ancestor-or-self::div : slectionne tous les anctres div du nud contextuel et le nud contextuel lui-mme si c'est un div. descendant-or-self::para : slectionne tous les descendants para du nud contextuel et le nud contextuel lui-mme si c'est un para. self::para : slectionne le nud contextuel si c'est un lment para, et rien dans le cas contraire. child::chapitre/descendant::para : slectionne les descendants para de l'lment chapitre enfant du nud contextuel. child::*/child::para : slectionne tous les petits-enfants para du nud contextuel. /child:: : slectionne l'lment racine du document. /descendant::para : slectionne tous les lments para descendants du document contenant le nud contextuel. /descendant::olist/child::item : slectionne tous les lments item qui ont un parent olist et qui sont dans le mme document que le nud contextuel. child::para[position()=1] : slectionne le premier enfant para du nud contextuel. child::para[position()=last()] : slectionne le dernier enfant para du nud contextuel. child::para[position()=last()-1] : slectionne l'avant-dernier enfant para du nud contextuel. child::para[position()1] : slectionne tous les enfants para du nud contextuel autres que le premier. following-sibling::para[position()=1] : slectionne le prochain para frre du nud contextuel.

5 / 16

XPath_XSLT

On pourrait continuer encore longtemps cette liste d'exemples. Cette syntaxe non-abrge permet beaucoup de raffinement. child::*[self::chapitre or self::sstitre][position()=last()] permet ainsi de slectionner le dernier enfant chapitre ou sstitre du nud contextuel. e. Syntaxe abrge child:: est laxe par dfaut : il peut tre omis
exemple : div/para est quivalent child::div/child::para @ est labrviation de attribute:: exemple : para[@type="warning"] est quivalent child::para[attribute::type="warning"] // est labrviation de /descendant!or!self::node()/ exemple : //para . est labrviation de self::node() exemple : .//para est quivalent self::node()/descendant!or!self::node()/child::para .. est labrviation de parent::node() exemple : ../title est quivalent parent::node()/child::title3. Fonctions de base

3. Expressions XPath Les location paths ne sont pas les seuls types dexpressions XPath. Il y a aussi des expressions boolennes, numriques et chanes de caractres Toute expression XPath peut tre utilise dans un prdicat de location path Dans une expression XPath on peut utiliser un location path, ou une union de location paths spars par | 4. Boolens On peut combiner plusieurs expressions boolennes lmentaires par les oprateurs and et or Les expressions lmentaires sont des comparaisons : = != < > <= >= Les comparaisons se font aprs avoir converti les objets comparer en un mme type La comparaison dun node!set avec une chane se fait en cherchant un noeud du node!set dont la string!value est la mme que la chane Prcdence des oprateurs : or and =, != <=, <, >=, > 5. Nombres On peut utiliser les nombres en virgule flottante double prcision (64 bits) On peut utiliser les oprateurs + ! div mod Si les oprandes ne sont pas des nombres, ils sont convertis en nombres : les node!sets sont convertis en chanes, elles!mmes converties en nombres 6. Fonctions de base Toute implmentation de XPath doit comprendre au moins les fonctions de base (Core Function Library) Les fonctions utilisables dans lvaluation dune expression sont dfinies par le contexte dvaluation de lexpression Les arguments de la fonction sont convertis si ncessaire pour tre du type voulu (boolen, nombre, chane), sauf les argument du type node!set qui ne peuvent tre convertis La conversion se fait aprs appel des fonctions boolean, number, string

a. Fonctions node!sets
6 / 16
XPath_XSLT

last() : retourne un nombre gal l'index du dernier nud dans le contexte courant. position() : retourne un nombre gal la position du nud dans le contexte courant. count(node!set) : nombre de noeuds dans le node!set id(object) : node!set contenant les lments du document qui ont pour ID la valeur de object local!name(node!set) : la chane du nom local du premier noeud de node!set namespace!uri(node!set) : la chane de lURI de lespace de nom du premier noeud de

node!set
name(node!set) : la chane du nom complet du premier noeud de node!set

b. Fonctions chanes string(object) : convertit object en une chane de caractres concat(string1, string2, string*) : concatne plusieurs chanes start!with(string1, string2) : boolen, vrai si string1 commence par string2 contains(string1, string2) : boolen, vrai si string1 contient string2 substring!before(string1, string2) : la sous!chane de string1 qui prcde la premire occurrence de string2 substring!after(string1, string2) : la sous!chane de string1 qui suit la premire occurrence de string2 substring(string, number1, number2) : la sous!chane de string qui commence la position number1 et dont la longueur est number2 string!length(string) : cette fonction retourne le nombre de caractres de la chane. Dans le cas o l'argument est omis, la valeur retourne est gale la longueur de la valeur textuelle du nud courant normalize!space(string) : retire les espaces initiaux, finals et les espaces doubls translate(string1, string2, string3) : remplace dans string1 chaque caractre de string2 par le caractre de mme rang de string3 exemple : translate("bar","abc","ABC") retourne BAr c. Fonctions boolennes boolean(object) : convertit object en boolen true si nombre non nul, node!set non vide, chane de longueur non nulle not(boolean) : ngation de boolean
true() false() lang(string) : la langue (attribut xml:lang) du noeud courant est la mme ou un sous!langage de string

d. Fonctions numriques number(object) : convertit object en un nombre sum(node!set) : somme du rsultat de la conversion en nombre de chaque noeud de node!set floor(number) : plus grand entier infrieur ou gal number ceiling(number) : plus petit entier suprieur ou gal number round(number) : entier le plus proche de number

III. lments XSLT


1. Gnralits a. Introduction Dans cette partie, nous allons dtailler quelques lments XSLT et prsenter des exemples d'utilisation.

b. Rappel : prologue d'un document XSL

7 / 16

XPath_XSLT

Un fichier XSL doit commencer par les lignes indiquant le numro de version XML et l'encodage de caractres utilis :
<?xml version="1.0" encoding="ISO-8859-1"?>

2. Les fondamentaux a. Gnralits Sont prsents ici les lments de base du document XSL, ceux que l'on retrouve dans l'immense majorit des cas.. b. <xsl:stylesheet> Cet lment doit tre l'lment racine du document XSL. Il contient tous les autres lments de mise en forme. Dans le cas gnral, l'utilisation de cet lment est de la forme :
<xsl:stylesheet id="id" version="nombre" xmlns:pre="URI"> ... </xsl:stylesheet>
id est l'identifiant unique de la feuille de style. version est le numro de version XSLT. xmlns:pre correspond la dfinition de l'espace de noms. pre indique le prfixe

de la feuille de style qui sera utilis dans la

feuille de style pour faire rfrence l'URI de l'espace nominal


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ... </xsl:stylesheet>

permet d'avoir accs des fonctions volues d'XSLT. C'est cette dclaration que nous allons utiliser dans la suite. c. <xsl:output> Cet lment vide, placer comme premier enfant de <xsl:stylesheet>, permet de spcifier des options concernant l'arbre de sortie. L'utilisation de cet lment est de la forme :
<xsl:output method="xml | html | text" version="nmtoken" encoding="chaine" omit-xml-declaration="yes | no" standalone="yes | no" doctype-public="chaine" doctype-system="chaine" cdata-section-elements="elt" indent="yes | no" mediatype="chaine" />

identifie la mthode de transformation. Dans le cas o elle est gale text, aucune mise en forme n'est effectue. version identifie la version de la mthode de sortie (xml1.0, html4.01...). encoding indique la version du jeu de caractres utiliser pour la sortie. omit-xml-declaration indique au processeur XSLT s'il doit ajouter ou non une dclaration XML. standalone indique au processeur XSLT s'il doit crer un arbre de sortie avec ou sans dclaration de type de document. doctype-public indique l'identifiant public utilis par la DTD associe la transformation. doctype-system indique l'identifiant system utilis par la DTD associe la transformation. cdata-section-elements indique les lments dont le contenu doit tre trait lors de la transformation via une section CDATA. indent prsente la transformation sous forme d'arbre dans le cas o la valeur de cet attribut est gale yes. media-type indique le type MIME des donnes rsultantes de la transformation.
method

Par exemple :
<xsl:output method="html" version="html4.01" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype system="http://www.w3.org/TR/html4/strict.dtd" /> 8 / 16
XPath_XSLT

... permet d'indiquer que le fichier de sortie sera au format HTML 4.01, conforme la DTD publique de l'HTML du W3C, et que le jeu de caractres utilis est l'ISO-8859-1. Le rsultat en sortie est un fichier HTML commenant par
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

... et possdant dans son <head>


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

L'utlisation d'un tel lment permet donc de se dispenser de la spcification explicite du codage de caractres via un lment <meta> lors de l'criture de la feuille de style XSL. d. <xsl:template> Cet lment dfinit un modle appliquer un nud et un contexte spcifique. L'utilisation de cet lment est de la forme :
<xsl:template name="nommodele" match="expression" mode="modemodele"> . . . </xsl:template>
name correspond au nom associ au modle. match indique quel jeu de nuds sera affect par le modle. mode permet un lment d'avoir plusieurs modles, chacun

gnrant une sortie diffrente. Nous reviendrons plus loin sur les possibilits qu'offre cet lment pour une conception modulaire de la feuille de style.

e. <xsl:value-of> Cet lment permet d'insrer la valeur d'un nud dans la transformation. Ce nud est valu en fonction d'une expression. Cette expression peut correspondre un lment, un attribut ou tout autre nud contenant une valeur. L'utilisation de cet lment est de la forme :
<xsl:value-of select="expression" disable-output-escaping="yes | no" />

La valeur de select est value et c'est cette valuation qui sera insre dans la transformation. disable-output-escaping agit sur la transformation des caractres. Dans le cas o sa valeur est yes, la chane &lt; est insre dans la transformation en tant que signe <, ce qui peut entraner des erreurs. Dans le cas contraire, la chane &lt; est insre telle quelle dans la transformation. 3. Ajout d'lments et d'attributs a. <xsl:element> Cet lment insre un nouvel lment dans la transformation. Le nom de l'lment est donn par l'attribut name. L'utilisation de cet lment est de la forme :
<xsl:element name="nomelement" use-attribute-sets="jeuattr"> </xsl:element>

correspond au nom de l'lment crer. use-attribute-sets correspond au jeu d'attributs associer l'lment cr. Par exemple :
name

<xsl:element name="p"><xsl:value-of select="texte" /></xsl:element>

... permet de crer dans le fichier HTML un lment de paragraphe renfermant le contenu de l'lment texte du document XML. b. <xsl:attribute> Cet lment dfinit un attribut et l'ajoute l'lment rsultat de la transformation. L'utilisation de cet lment est de la forme :
<xsl:attribute name="nom">valeur</xsl:attribute>

correspond au nom de l'attribut ajouter dans le contexte courant. valeur correspond la valeur lui donner. Par exemple :
name

<image><xsl:attribute name="src">test.gif</xsl:attribute></image>

... permet d'ajouter l'lment image l'attribut src et de lui affecter la valeur test.gif, ce qui a pour effet de produire en sortie l'lment suivant :
<image src="test.gif"></image> 9 / 16
XPath_XSLT

On aurait pu, de manire tout fait quivalente, crire


<xsl:element name="image"><xsl:attribute name="src">test.gif</xsl:attribute></xsl:element>

... ce qui a pour effet de produire en sortie

<image src="test.gif"></image>

c. Syntaxe courte Il est possible de crer des lments de manire plus compacte, l'aide d'une syntaxe particulire. Supposons par exemple que nous ayons dans un fichier XML l'lment <image source="test.gif" texte_alternatif="Image de test"/>, et que nous souhaitions obtenir dans le fichier de sortie l'lment <img src="test.gif" alt="Image de test"/>. Il existe deux manires :
<xsl:element name="img"><xsl:attribute name="src"><xsl:value-of select="@source" /></xsl:attribute><xsl:attribute name="alt"><xsl:value-of select="@texte_alternatif" /></xsl:attribute></xsl:element>

! La syntaxe longue, avec...

! La syntaxe courte, utilisant des accolades...


<img src="{@source}" alt="{@texte_alternatif}" />

La seconde syntaxe est plus compacte ; mais elle prsente deux inconvnients : ! Ds lors que des expressions XPath sont un peu longues, cette syntaxe complique la relecture de la feuille de style ; ! Une feuille XSL est avant tout un fichier XML. En tant que tel, on peut souhaiter sa transformation ou son traitement automatis. La syntaxe longue s'y prte plus facilement. 4. Gestion des boucles a. <xsl:for-each> Cet lment de bouclage cre une boucle dans laquelle sont appliques des transformations. Son utilisation est de la forme :
<xsl:for-each select="jeunud"></xsl:for-each> <ul> <xsl:for-each select="item"> <li><xsl:value-of select="." /></li> </xsl:for-each> </ul>
select

correspond au jeu de nuds devant tre parcouru par la boucle. Exemple d'utilisation :

b. <xsl:sort> Cet lment permet d'effectuer un tri sur un jeu de nuds. Il doit tre plac soit dans un lment <xsl:for-each> soit dans un lment <xsl:apply-templates>. C'est un lment vide qui peut tre appel plusieurs fois pour effectuer un tri multicritres. Chaque appel cet lment provoque un tri sur un champ spcifique, dans un ordre prdfini. L'utilisation de cet lment est de la forme :
<xsl:sort select="nud" data-type="text | number | elt" order="ascending | descending" lang="nmtoken" case-order="upper-first | lower-first" />
select permet de spcifier un nud comme cl de tri. data-type correspond au type des donnes trier. Dans

le cas o le type est number, les donnes sont converties puis tris. order correspond l'ordre de tri. Cet attribut vaut ascending ou descending. lang spcifie quel jeu de caractres utiliser pour le tri ; par dfaut, il est dtermin en fonction des paramtres systme. case-order indique si le tri a lieu sur les majuscules ou minuscules en premier, selon qu'il prend la valeur upper-first ou lower-first. Par exemple :
10 / 16
XPath_XSLT

<ul> <xsl:for-each select="livre"> <xsl:sort select="auteur" order="descending" /> <li><b><xsl:value-of select="auteur" /></b><br /> <xsl:value-of select="titre" /> </li> </xsl:for-each> </ul>

Dans cet exemple, la liste des livres est classe dans l'ordre alphabtique dcroissant des noms d'auteur. c. <xsl:number> Cet lment permet dinsrer un nombre format pouvant servir de compteur. L'utilisation de cet lment est de la forme :
<xsl:number level="single | multiple | any" count="nud" from="nud" value="expression" format="chaine" lang="nmtoken" grouping-separator="car" grouping-size="nombre" />
level

indique quels niveaux doivent tre slectionns pour le comptage : single permet de ne compter que la position du nud par rapport ses frres ; multiple permet de compter la position du nud par rapport ses anctres (par exemple de la forme 1.3.4) ; enfin any renvoie la position du nud par rapport l'ensemble des nuds de mme nom dans tout le document. count indique quels nuds doivent tre compts dans les niveaux slectionns ; dans le cas o cet attribut n'est pas dfini, les nuds compts sont ceux ayant le mme type que celui du nud courant. from identifie le nud partir duquel le comptage commence. value indique l'expression correspondant la valeur du compteur ; si cet attribut n'est pas dfini, le nombre insr correspond la position du nud (position()). format spcifie le format de l'affichage du nombre ; cela peut tre un chiffre, un caractre (a-z, AZ) et comprendre un caractre de sparation tel que le point (.), le trait d'union (-) ou autre. Les formats possibles sont "1", "01", "a", "A", "i", "I". lang spcifie le jeu de caractres utiliser ; par dfaut, il est dtermin en fonction des paramtres du systme. grouping-separator identifie le caractre permettant de dfinir la sparation entre les centaines et les milliers. grouping-size spcifie le nombre de caractres formant un groupe de chiffres dans un nombre long ; le plus souvent la valeur de cet attribut est 3. Ce dernier attribut fonctionne avec... ...grouping-separator ; si l'un des deux manque, ils sont ignors. Exemple d'utilisation :
<ul> <xsl:for-each select="livre"> <xsl:sort select="auteur" /> <xsl:number level="any" from="/" format="1." /> <li><b><xsl:value-of select="auteur" /></b><br /><xsl:value-of select="titre" /> </li> </xsl:for-each> </ul>

5. Conditions de test a. <xsl:if>

11 / 16

XPath_XSLT

Cet lment permet la fragmentation du modle dans certaines conditions. Il est possible de tester la prsence d'un attribut, d'un lment, de savoir si un lment est bien le fils d'un autre, de tester les valeurs des lments et attributs. L'utilisation de cet lment est de la forme :
<xsl:if test="condition">action</xsl:if>
test prend la valeur 1 ou 0 suivant le rsultat de la condition (vrai ou faux). action correspond l'action devant tre effectue (texte afficher, second test,

gestion de

chane...). Exemple d'utilisation:


<xsl:if test="livre"> <ul> <xsl:for-each select="livre"> <li> <b><xsl:value-of select="auteur" /><br /></b> <xsl:value-of select="titre" />.<xsl:if test="@langue='franais'">Ce livre est en franais. </xsl:if> </li> </xsl:for-each> </ul> </xsl:if>

Dans le code prcdent, si l'attribut langue de l'lment livre vaut franais, le processeur ajoutera au fichier de sortie la phrase "Ce livre est en franais". Il ne se passe rien si ce n'est pas le cas. b. <xsl:choose> Cet lment permet de dfinir une liste de choix et d'affecter chaque choix une transformation diffrente. Chaque choix est dfini par un lment <xsl:when> et un traitement par dfaut peut tre spcifi grce l'lment <xsl:otherwise>. Exemple d'utilisation :
<ul> <xsl:for-each select="livre"> <li> <b><xsl:value-of select="auteur" /><br /></b> <xsl:value-of select="titre" /> <xsl:choose> <xsl:when test="@langue='francais'">Ce livre est en franais.</xsl:when> <xsl:when test="@langue='anglais'">Ce livre est en anglais.</xsl:when> <xsl:otherwise>Ce livre est dans une langue non rpertorie.</xsl:otherwise> </xsl:choose> </li> </xsl:for-each> </ul>

6. Variables et paramtres a. Introduction Il est possible en XSLT de dfinir des variables et des paramtres permettant de faire des calculs. Il est ncessaire pour cela de faire appel deux lments XSL : xsl:variable et xsl:param. b. lment <xsl:variable> L'lment <xsl:variable> sert crer les variables dans XSLT. Il possde les attributs suivants : name : cet attribut est obligatoire. Il spcifie le... nom de la variable. select : expression XPath qui spcifie la valeur de la variable. Par exemple :
<xsl:variable name="nombre_livres" select="255" /> <xsl:variable name="auteur" select="'Victor Hugo'" /> <xsl:variable name="nombre_pages" select="livre/tome/@page" />

On notera la prsence des guillemets imbriqus quand il s'agit d'affecter une chane de caractres une variable. La porte d'une variable est limite aux lments-frres et leurs descendants. Par consquent, si une variable est dclare dans une boucle xsl:for-each ou un lment xsl:choose ou xsl:if, on ne peut s'en servir en-dehors de cet lment.
12 / 16
XPath_XSLT

Une variable est appele en tant prcde du caractre $ : <xsl:value-of select="$nombre_pages" />. On peut utiliser une variable pour viter la frappe rptitive d'une chane de caractres, et/ou faciliter la mise jour de la feuille de style. c. L'lment <xsl:call-template> L'lment <xsl:template> peut tre appel indpendamment d'une slection d'un nud. Pour cela, il faut renseigner l'attribut name, et l'appeler l'aide de l'lment <xsl:call-template>. Par exemple :
<xsl:template name="separateur"> <hr /> <img src="ligne.gif" alt="sparation" width="150" height="2" /> <hr /> </xsl:template> Il suffit alors de l'appeler avec <xsl:call-template name="separateur"/>.

d. Les lments <xsl:param> et <xsl:with-param> Les paramtres crs avec ces deux lments sont habituellement utiliss dans les modles nomms, que nous venons de voir. Ils permettent de passer des valeurs aux modles. Un paramtre est cr avec l'lment <xsl:param>, et pass un modle avec l'lment <xsl:with-param>. Les deux ont deux attributs : name, obligatoire, qui donne un nom au paramtre ; select, une expression XPath facultative permettant de donner une valeur par dfaut au paramtre. Par exemple, on peut imaginer un template permettant d'valuer le rsultat d'une expression polynmiale :
<xsl:template name="polynome"> <xsl:param name="variable_x" /> <xsl:value-of select="2*$variable_x*$variable_x+(-5)*$variable_x+2" /> </xsl:template>

Il suffit alors de l'appeler en lui passant diverses valeurs pour le paramtre variable_x pour qu'il value cette expression. Ce comportement se rapproche de celui d'une fonction dans un langage de programmation. Par exemple...
<xsl:call-template name="polynome"> <xsl:with-param name="variable_x" select="3.4" /> </xsl:call-template>

... permet d'afficher le rsultat de 2*3.4^2-5*3.4+2. On remarquera que : la soustraction d'un nombre se fait par addition du nombre (ngatif) oppos ; la division se fait non par le caractre /, mais par l'oprateur div.

IV. Conception modulaire des feuilles de style


1. Introduction Les feuilles de style que nous avons crites jusqu' prsent conviennent de petits projets. Cependant, lorsqu'un dveloppement doit tre ralis plusieurs, ou lorsqu'il devient ncessaire de revenir aprs quelque temps sur du code dj crit, la possibilit de mettre au point des feuilles de style modulaires prend toute sa valeur. Deux tages successifs le permettent : 1. Au sein d'une mme feuille de style, la sparation du traitement de chaque nud peut se faire en gnralisant l'emploi des templates ; 2. Il est possible de scinder une feuille de styles en plusieurs fichiers, inclus les uns dans les autres.

2. Utilisation des templates a. Introduction


13 / 16

XPath_XSLT

Les feuilles de style que nous avons crites jusqu' prsent utilisaient l'lment xsl:for-each pour inspecter successivement tous les lments renvoys par une expression XPath. Lorsque le document XML initial ou le document de sortie deviennent un peu complexes, cette mthode aboutit l'criture d'une feuille de style consistant en de multiples boucles imbriques. Une solution commode est alors de sparer les traitements pour chaque nud du document initial grce aux lments xsl:template. b. Exemple Revenons la deuxime feuille de style que nous avions crite pour prsenter la liste des bouteilles :
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <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 ngatifs</h3> <ul> <xsl:for-each select="bouteille/composition/ion_negatif"> <li><xsl:value-of select="." /></li> </xsl:for-each> </ul> <h3>Autres matriaux</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 dpartement <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>

Modifions-la dans un premier temps afin qu'elle puisse s'adapter un document XML listant plusieurs bouteilles :
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <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> <xsl:for-each select="//bouteille">

14 / 16

XPath_XSLT

<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 ngatifs</h3> <ul> <xsl:for-each select="bouteille/composition/ion_negatif"> <li><xsl:value-of select="." /></li> </xsl:for-each> </ul> <h3>Autres matriaux</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 dpartement <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> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>

Les imbrications de boucles xsl:for-each peuvent devenir lourdes grer. Il est plus facile de maintenir la structure suivante :
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="html4.01" encoding="ISO-8859-1" doctype-public="//W3C//DTD HTML 4.01//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd" /> <xsl:template match="/"> <html> <head> <title>Exemple de sortie HTML</title> </head> <body> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="bouteille"> <h1>Bouteille de marque <xsl:value-of select="marque" /></h1> <h2>Composition:</h2> <h3>Ions positifs</h3> <ul> <xsl:for-each select="composition/ion_positif"> <xsl:apply-templates select="." /> </xsl:for-each> </ul> <h3>Ions ngatifs</h3> <ul> <xsl:for-each select="composition/ion_negatif">

15 / 16

XPath_XSLT

<xsl:apply-templates select="." /> </xsl:for-each> </ul> <h3>Autres matriaux</h3> <ul> <xsl:for-each select="autres_materiaux"> <xsl:apply-templates select="." /> </xsl:for-each> </ul> <h2>Lieu d'origine</h2> <p>Ville de <b><xsl:value-of select="source/ville" /></b>, dans le dpartement <b><xsl:value-of select="source/departement" /></b></p> <h2>Autres informations</h2> <ul> <li>Contenance: <xsl:value-of select="contenance" /></li> <li>pH: <xsl:value-of select="ph" /></li> </ul> </xsl:template> <xsl:template match="ion_positif"> <li><xsl:value-of select="." /></li> </xsl:template> <xsl:template match="ion_negatif"> <li><xsl:value-of select="." /></li> </xsl:template> <xsl:template match="autres_materiaux"> <li><xsl:value-of select="." /></li> </xsl:template> </xsl:stylesheet>

Le gain n'est pas trs apprciable ici, mais si vous jetez un il la feuille de style qui figure en lien en bas de cette page, vous verrez un exemple d'utilisation plus complexe... et plus utile. 3. Inclusions de feuilles de style Il est parfois ncessaire de scinder une feuille de style en plusieurs fichiers diffrents : Cela permet d'en faciliter la maintenance, en rendant possible un travail collectif ; Cela permet aussi de crer des bibliothques de modles pouvant tre rutiliss d'un projet un autre Pour cela, il suffit de spcifier dans la feuille de style matresse un appel une feuille de style autre, soit par l'lment xsl:include soit par l'lment xsl:import. Par exemple...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:include href="feuille_incluse.xsl" /> </xsl:stylesheet>

Les modles et variables dfinis dans la feuille de style ainsi incluse sont directement incorpors la feuille de style appelante. Quand on utilise xsl:import, s'il y a conflit entre une dclaration de template dans la feuille appelante et la feuille appele, c'est la premire qui est prioritaire. La syntaxe est la mme :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="feuille_incluse.xsl" /> </xsl:stylesheet>

16 / 16

XPath_XSLT

Das könnte Ihnen auch gefallen