Vous êtes sur la page 1sur 275

1

2
Sauf mention contraire, le contenu de cet ouvrage est publi sous la licence :
Creative Commons BY-NC-SA 2.0
La copie de cet ouvrage est autorise sous rserve du respect des conditions de la licence
Texte complet de la licence disponible sur : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
Mentions lgales :
Conception couverture : Fan Jiyong
Illustrations chapitres : Fan Jiyong
OpenClassrooms 2014 - ISBN : 979-10-90085-57-2

3
4
Avant-propos

prs une orientation post-bac dcevante, des amis mont fait dcouvrir linforma-
A tique en 2008 et mont conseill le Site du Zro, devenu aujourdhui OpenClass-
rooms. Comme beaucoup de Zros de lpoque, je me suis tourn vers le cours
de C crit par Mathieu NEBRA, lequel, avec le recul, tait trangement accessible en
dpit de la difficult de certaines notions abordes. Tout dbutant en C se souvient
forcment de sa rencontre avec les pointeurs !
Sduit par linformatique, jai dcid de me rorienter dans ce secteur en intgrant le
DUT Informatique de luniversit dOrsay, ce qui ma permis dapprhender de nom-
breux domaines et technologies, allant de la programmation au rseau, en passant
par les bases de donnes. Pendant toute la dure de mon DUT, OpenClassrooms et
sa communaut mont t dune grande aide. Pour tenter de les remercier, jai post
mes premiers commentaires sur le forum du site, puis jai dbut la rdaction de mon
premier tutoriel sur certains modules du langage Perl.
Aprs lobtention de mon DUT, jai intgr une cole dingnieur (lEFREI) o jai
suivi la filire Systme dInformation, option Architecture des Systmes dInformation.
Jy ai appris de nouveaux aspects de linformatique comme le JEE ou encore le Cloud
Computing. Paralllement mes tudes, jai dcouvert, avec lmergence des mobiles,
la programmation Android et Windows Phone et ainsi, les problmatiques dchanges
de donnes entre les serveurs et ces nouveaux clients. Le XML tant une solution pour
structurer les donnes afin deffectuer ces fameux changes, jai commenc mintres-
ser cette technologie en mme temps quau dveloppement de mes premires applica-
tions. Frachement diplm de lEFREI en 2013, jai dcid de faire du dveloppement
mobile mon mtier.
OpenClassrooms ne proposant pas de cours complet sur le XML, en juin 2012, jai
dcid dcrire mon second tutoriel pour le site. Ce tutoriel a t mis en avant sur le
site et est aujourdhui adapt en livre. Je suis heureux de pouvoir vous proposer ce
cours et jespre de tout cur quil rpondra vos attentes !

i
CHAPITRE 0. AVANT-PROPOS

Comment lire ce livre ?

Suivez lordre des chapitres

Lisez ce livre comme on lit un roman. Il a t conu pour cela.


Contrairement beaucoup de livres techniques o il est courant de lire en diagonale et
de sauter certains chapitres, il est ici trs fortement recommand de suivre lordre du
cours, moins que vous ne soyez dj un peu expriments.

Pratiquez en mme temps

Pratiquez rgulirement. Nattendez pas davoir fini de lire ce livre pour allumer votre
ordinateur et faire vos propres essais.

Utilisez les codes web !

Afin de tirer parti du Site du Zro dont ce livre est issu, celui-ci vous propose ce quon
appelle des codes web . Ce sont des codes six chiffres saisir sur une page du Site
du Zro pour tre automatiquement redirig vers un site web sans avoir en recopier
ladresse.
Pour utiliser les codes web, rendez-vous sur la page suivante :
http://www.siteduzero.com/codeweb
Un formulaire vous invite rentrer votre code web. Faites un premier essai avec le code
ci-dessous :

Tester le code web
B

Code web : 123456
Ces codes web ont deux intrts :
ils vous redirigent vers les sites web prsents tout au long du cours, vous permettant
ainsi dobtenir les logiciels dans leur toute dernire version ;
ils vous permettent de tlcharger les codes sources inclus dans ce livre, ce qui vous
vitera davoir recopier certains programmes un peu longs.
Ce systme de redirection nous permet de tenir jour le livre que vous avez entre les
mains sans que vous ayez besoin dacheter systmatiquement chaque nouvelle dition.
Si un site web change dadresse, nous modifierons la redirection mais le code web
utiliser restera le mme. Si un site web disparat, nous vous redirigerons vers une page
du Site du Zro expliquant ce qui sest pass et vous proposant une alternative.
En clair, cest un moyen de nous assurer de la prennit de cet ouvrage sans que vous
ayez faire quoi que ce soit !

ii
REMERCIEMENTS

Remerciements
Plus dun an sest coul entre lcriture des premires lignes de ce cours et sa publica-
tion sous la forme dun livre. Durant toute cette priode, de nombreuses personnes ont
particip plus ou moins directement ce projet. Cest pourquoi je voudrais remercier :
Ma famille, ma chrie et mes amis qui mont encourags du dbut la fin ;
Fumble pour ses relectures, ses conseils et ses encouragements tout au long de la
rdaction de ce cours ;
Anna Schurtz pour ses conseils afin de rendre ce cours plus pdagogique ;
Lensemble de lquipe de Simple IT ;
Les membres du site OpenClassRooms pour leurs nombreux commentaires et encou-
ragements.

iii
CHAPITRE 0. AVANT-PROPOS

iv
Sommaire

Avant-propos i
Quallez-vous apprendre en lisant ce livre ? . . . . . . . . . . . . . . . . . . . . ii
Comment lire ce livre ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii
Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii

I Les bases du XML 1

1 Quest-ce que le XML ? 3


Quest ce que le XML ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Origine et objectif du XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2 Les bons outils 7


Lditeur de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
EditiX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
<oXygen/> XML Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3 Les lments de base 15


Les balises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Les attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Les commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

4 Votre premier document XML 21


Structure dun document XML . . . . . . . . . . . . . . . . . . . . . . . . . . 22

v
SOMMAIRE

Un document bien form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23


Utilisation dEditiX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

5 TP : structuration dun rpertoire 29


Lnonc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Exemple de solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

II Crez des dfinitions pour vos documents XML 33

6 Introduction aux dfinitions et aux DTD 35


Quest-ce que la dfinition dun document XML ? . . . . . . . . . . . . . . . . 36
Dfinition dune DTD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Les lments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Structurer le contenu des balises . . . . . . . . . . . . . . . . . . . . . . . . . 40

7 DTD : les attributs et les entits 47


Les attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Les entits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

8 DTD : o les crire ? 57


Les DTD internes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Les DTD externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Un exemple avec EditiX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

9 TP : dfinition DTD dun rpertoire 67


Lnonc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Une solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

10 Schma XML : introduction 73


Les dfauts des DTD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Les apports des schmas XML . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Structure dun schma XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Rfrencer un schma XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

11 Schma XML : les lments simples 79


Les lments simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

vi
SOMMAIRE

Les attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

12 Schma XML : les types simples 85


Les types chanes de caractres . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Les types dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Les types numriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Les autres types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

13 Schma XML : les types complexes 101


Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Les contenus simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Les contenus "standards" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

14 Schma XML : aller plus loin 113


Le nombre doccurrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
La rutilisation des lements . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Lhritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Les identifiants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Un exemple avec EditiX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

15 TP : Schma XML dun rpertoire 141


Lnonc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Une solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

III Traitez vos donnes XML 145

16 DOM : Introduction lAPI 147


Quest-ce que LAPI DOM ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Larbre XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Le vocabulaire et les principaux lments . . . . . . . . . . . . . . . . . . . . 150

17 DOM : Exemple dutilisation en Java 155


Lire un document XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Ecrire un document XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

18 XPath : Introduction lAPI 169

vii
SOMMAIRE

Quest-ce que lAPI XPath ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170


Chemin relatif et chemin absolu . . . . . . . . . . . . . . . . . . . . . . . . . . 172

19 XPath : Localiser les donnes 175


Dissection dune tape . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Les axes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Les tests de nuds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Les prdicats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Un exemple avec EditiX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

20 TP : des expressions XPath dans un rpertoire 187


Lnonc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Une solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

IV Transformez vos documents XML 191

21 Introduction XSLT 193


Quest-ce que XSLT ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Structure dun document XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Rfrencer un document XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . 198

22 Les templates 201


Introduction aux templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Contenu dun template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Les fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
La fonction value-of . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
La fonction for-each . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
La fonction sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
La fonction if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
La fonction choose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
La fonction apply-templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

23 Les templates : aller plus loin 219


Les variables et la fonction call-template . . . . . . . . . . . . . . . . . . . . . 220
Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

viii
SOMMAIRE

La fonction call-template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223


Dautres fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Un exemple avec EditiX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

24 TP : des transformations XSLT dun rpertoire 237


Le sujet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Une solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240

V Annexes 241

25 Les espaces de noms 243


Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Utilisation dun espace de noms . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Quelques espaces de noms utiliss rgulirement . . . . . . . . . . . . . . . . . 247

26 Mettez en forme vos documents XML avec CSS 249


Ecrire un document CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Un exemple avec EditiX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
TP : mise en forme dun rpertoire . . . . . . . . . . . . . . . . . . . . . . . . 256

ix
SOMMAIRE

x
Premire partie

Les bases du XML

1
Chapitre 1
Quest-ce que le XML ?

Difficult :

Voici donc le tout premier chapitre de la longue srie que va comporter ce tutoriel.
Je vous propose de tout dabord faire connaissance avec cette technologie maintenant ge
de plus de 10 ans. Ce premier chapitre sera donc loccasion de dcouvrir ce quest le XML,
son origine et les besoins auxquels cette technologie devait rpondre au moment de son
laboration.

3
CHAPITRE 1. QUEST-CE QUE LE XML ?

Quest ce que le XML ?


Premire dfinition
Le XML ou eXtensible Markup Language est un langage informatique
de balisage gnrique.

Cette dfinition est mes yeux quelque peu barbare et technique, cest pourquoi, je
vous propose den dcortiquer les mots-clefs.

Un langage informatique

Vous ntes pas sans savoir quen informatique, il existe plusieurs centaines de langages
destins des utilisations trs diverses.
En vulgarisant un peu (beaucoup !), il est possible de les regrouper en 3 grandes cat-
gories :
Les langages de programmation.
Les langages de requte.
Les langages de description.
Les langages de programmation permettent de crer des programmes, des appli-
cations mobiles, des sites Internet, des systmes dexploitation, etc. Certains langages
de programmation sont extrmement populaires. En mai 2012, les 10 langages de pro-
grammation les plus populaires taient le C, le Java, le C++, lObjective-C, le C#, le
PHP, le Basic, le Python, le Perl et le Javascript.
Les langages de requtes permettent quant eux dinterroger des structures qui
contiennent des donnes. Parmi les langages de requte les plus connus, on peut par
exemple citer le SQL pour les bases de donnes relationnelles, le SPARQL pour les
graphes RDF et les ontologies OWL ou encore le XQuery pour les documents XML.
Enfin, les langages de description permettent de dcrire et structurer un ensemble
de donnes selon un jeu de rgles et des contraintes dfinies. On peut par exemple
utiliser ce type de langage pour dcrire lensemble des livres dune bibliothque, ou
encore la liste des chansons dun CD, etc. Parmi les langages de description les plus
connus, on peut citer le SGML, le XML ou encore le HTML.

Un langage de balisage gnrique

Un langage de balisage est un langage qui scrit grce des balises. Ces balises
permettent de structurer de manire hirarchise et organise les donnes dun docu-
ment.
Si vous ne savez pas ce quest une balise, ne vous inquitez pas, nous reviendrons sur
ce terme un peu plus loin dans le cours.
Le terme gnrique signifie que nous allons pouvoir crer nos propres balises. Nous
ne sommes pas obligs dutiliser un ensemble de balises existantes comme cest par

4
ORIGINE ET OBJECTIF DU XML

exemple le cas en HTML.

Une nouvelle dfinition


Aprs les explications que nous venons de voir ensemble, je vous propose une nouvelle
dfinition du langage XML bien moins technique que la premire donne au dbut de
ce cours.
Voici donc cette nouvelle dfinition : le langage XML est un langage qui permet de
dcrire des donnes laide de balises et de rgles que lon peut personnaliser.
Certaines notions peuvent encore vous sembler abstraites, mais ne vous inquitez pas,
tout sera expliqu dans la suite de ce tutoriel.

Origine et objectif du XML


La petite histoire du XML
Vous vous doutez bien que le langage XML na pas t cr dans le simple but de
samuser. Sa cration avait pour objectif de rpondre un besoin trs prcis : lchange
de donnes.
Aux dbuts dInternet, les ordinateurs et les programmes changeaient des donnes en
utilisant des fichiers. Malheureusement, ces fichiers avaient bien souvent des rgles de
formatage qui leur taient propres. Par exemple, les donnes taient spares par des
points, des virgules, des espaces, des tirets, etc.
Le problme avec ce systme est quil fallait sans cesse adapter les programmes au
format du fichier ce qui reprsentait une charge de travail importante. Il a donc fallu
rgler ce problme rapidement. Le langage SGML ou Standard Generalized Markup
Language est alors n. Cest un langage puissant, extensible et standard qui permet
de dcrire laide de balises un ensemble de donnes. Mais ce langage, trs complexe,
ntait pas forcment compatible pour effectuer des changes sur le web.
Un groupe dinformaticiens ayant de lexprience dans le SGML et le web a alors dcid
de se pencher sur le sujet. Le langage XML est donc n. Le XML 1.0 est devenu une
recommandation du W3C (le World Wild Web Consortium ) le 10 fvrier 1998.
Depuis, les spcifications du langage ont volu, et la version 1.1 a t publie le 4
fvrier 2004. Cest pourtant la version 1.0 du langage XML qui est encore la plus
utilise aujourdhui et cest cette version que nous allons tudier dans ce tutoriel.

Les objectifs du XML


Comme nous lavons vu, lobjectif du XML est de faciliter les changes de donnes
entre les machines. A cela sajoute un autre objectif important : dcrire les don-
nes de manire aussi bien comprhensible par les hommes qui crivent les

5
CHAPITRE 1. QUEST-CE QUE LE XML ?

documents XML que par les machines qui les exploitent.


Le XML se veut galement compatible avec le web afin que les changes de donnes
puissent se faire facilement travers le rseau Internet.
Le XML se veut donc standardis, simple, mais surtout extensible et configurable afin
que nimporte quel type de donnes puisse tre dcrit.

En rsum
Le XML a t cr pour faciliter les changes de donnes entre les machines et les
logiciels.
Le XML est un langage qui scrit laide de balises.
Le XML est une recommandation du W3C, il sagit donc dune technologie avec des
rgles strictes respecter.
Le XML se veut comprhensible par tous : les hommes comme les machines.
Le XML nous permet de crer notre propre vocabulaire grce un ensemble de rgles
et de balises personnalisables.

6
Chapitre 2
Les bons outils

Difficult :

Aprs ce premier chapitre, peu technique, destin vous introduire le XML, jespre que
lutilit de ce dernier est plus claire dans vos esprits. Dans ce second chapitre, nous allons
passer en revue les outils et tenter de comprendre les logiciels qui nous seront utiles pour
manipuler les diffrentes technologies que nous verrons tout au long de ce cours.
Lutilisation doutils spcialiss va nous faciliter la vie et nous permettre dtre beaucoup
plus productifs. En effet, tous proposent des fonctions clefs destines nous aider comme
par exemple la coloration syntaxique ou encore la validation de documents.
Je vous encourage essayer vous-mmes les diffrents logiciels qui seront prsents dans
ce chapitre et dadopter celui qui vous correspond le plus.

7
CHAPITRE 2. LES BONS OUTILS

Lditeur de texte
Il faut savoir quun document XML nest en ralit quun simple document texte.
Cest pourquoi, il est tout fait possible dutiliser un diteur de texte pour la rdaction
de nos documents XML.

Sous Windows
Sous Windows, un diteur de texte portant le nom de Bloc-notes est gnralement
install par dfaut. En thorie, il est suffisant et fonctionnel. Dans la pratique, les
fonctionnalits quil offre sont limites et des options trs utiles comme la coloration
syntaxique ou la numrotation des lignes manquent.
Je vous propose donc dutiliser Notepad++ qui est parfait pour ce que nous sou-
haitons raliser puisquil pallie idalement les manques du Bloc-notes. Il sagit dun
logiciel gratuit, nhsitez donc pas le tlcharger !

Tlcharger Notepad++
B

Code web : 480303
Je ne vais pas dtailler ici la procdure dinstallation qui est classique pour un logiciel
tournant sous Windows.
Une fois install, lancez le logiciel. Vous devriez avoir une fentre semblable la figure
2.1.

Figure 2.1 Notepad++

8
LDITEUR DE TEXTE

Afin dadapter la coloration syntaxiquee au langage XML, il vous suffit de slectionner


Langage dans la barre de menu puis XML dans la liste.
Lorsque vous enregistrerez vos documents, il suffira alors de prciser comme extension
".xml" pour conserver la coloration syntaxiquee dune fois sur lautre.

Sous GNU/Linux

Par dfaut, les distributions Linux sont souvent livres avec de trs bons diteurs de
texte. Si vous aimez la console, vous pouvez par exemple utiliser nano, emacs, vi
ou encore vim. Si vous prfrez les interfaces graphiques, je vous conseille dutiliser
lexcellent gedit qui normalement doit tre install par dfaut. Si jamais ce nest pas
le cas, la commande suivante vous permettra de linstaller en quelques instants :

sudo apt - get install gedit

Une fois ouvert, vous devriez voir apparaitre quelque chose ressemblant la figure 2.2.

Figure 2.2 gedit - photo issue du site officiel du projet

Afin dadapter la coloration syntaxique au langage XML, il vous suffit de slectionner


Affichage dans la barre de menu puis Mode de coloration et finalement de choisir
le XML dans la liste.
Lorsque vous enregistrerez vos documents, il suffira alors de prciser comme extension
".xml" pour conserver la coloration syntaxique une fois sur lautre.

9
CHAPITRE 2. LES BONS OUTILS

Sous MAC OS X
Pour les utilisateurs du systme dexploitation dApple, je vous conseille de vous tourner
vers jEdit.

Tlcharger jEdit
B

Code web : 866884
La figure 2.3 vous donne un aperu de son interface.

Figure 2.3 jEdit - photo issue du site officiel du projet

EditiX
Editix est un diteur XML qui fonctionne sur les plateformes Windows, GNU/Linux ou
Mac OS X. En plus de la coloration syntaxique essentielle lcriture de documents
XML, ce logiciel nous offre de nombreux outils qui nous seront utiles dans la suite de
ce tutoriel comme par exemple la validation des documents.

La version payante
Il existe plusieurs versions de ce logiciel. La dernire en date est EditiX 2013. Cette
version complte est payante, mais plusieurs licences sont disponibles. Les tudiants
peuvent par exemple bnficier de 50% de rduction.

10
EDITIX


Tlcharger EditiX 2013
B
Code web : 264135

La version gratuite
Heureusement, pour les pauvres Zros fauchs que nous sommes, une version gratuite
existe ! Il sagit dune version allge dEditix 2008. Notez bien que cette version est
rserve un usage non-commercial.

Tlcharger EditiX 2008, Lite
B Version
Code web : 265354
Puisque cest cette version que je vais en partie utiliser dans la suite du tutoriel, je
vous propose de dtailler la procdure de mise en place du logiciel sous GNU/Linux.
Je ne dtaille pas la procdure dinstallation sous Windows et MAC OS X puisquelle
est des plus classique.

La mise en place sous GNU/Linux


Tlchargement et installation

Enregistrez larchive sur votre bureau puis lancez votre plus beau terminal afin de
dbuter la procdure. Commencez par dplacer larchive editix-free-2008.tar.gz
frachement tlcharge dans le rpertoire /opt/ par la commande :

sudo mv ~/ Bureau / editix - free -2008. tar . gz / opt /

Dplacez vous maintenant dans le dossier /opt/ par la commande :

cd / opt /

Nous allons maintenant extraire les fichiers de larchive que nous avons tlcharge.
Pour ce faire, vous pouvez utiliser la commande :

sudo tar xvzf editix - free -2008. tar . gz

Un dossier nomm editix doit alors apparatre. Il contient les fichiers que nous venons
dextraire. Vous pouvez alors supprimer larchive via la commande :

sudo rm editix - free -2008. tar . gz

On pourrait choisir de sarrter l et lancer le logiciel en ligne de commande en se


rendant dans le rpertoire /opt/editix/bin/ et en excutant le script run.sh via la
commande :

./ run . sh

11
CHAPITRE 2. LES BONS OUTILS

Pour plus de confort, je vous propose plutt de crer un launcher.

Cration du launcher

Pour ce faire, faites un clic droit sur le menu Applications de votre tableau de bord
(ou sur le Menu si vous tes sur une LMDE par exemple) et cliquez sur Editer le
menu .
Dans la colonne de gauche, choisissez le menu Programmation puis cliquez sur le bouton
Nouvel lment dans la colonne de droite.
Une fentre devrait alors safficher (voir figure 2.4).

Figure 2.4 Crtation du launcher

Remplissez le formulaire avec les informations suivantes :


Type : Application
Nom : Editix
Commande : /opt/editix/bin/run.sh
Finalisez la cration du launcher en cliquant sur le bouton Valider. Editix devrait
maintenant apparatre dans vos applications et, plus particulirement, dans le menu
programmation.
Quel que soit votre systme dexploitation, la fentre du logiciel ressemble la figure
2.5 aprs son lancement.

<oXygen/> XML Editor


Concluons cette prsentation avec le logiciel <oXygen/> XML Editor (voir figure
2.6) qui, comme Editix, est multiplateformes. Contrairement EditiX, il nexiste pas
de version gratuite du logiciel, mais il reste possible de le tester gratuitement pendant
30 jours. Comme pour Editix , <oXygen/> XML Editor propose plusieurs types
de licences. Ainsi, les tudiants peuvent obtenir des rductions trs intressantes.

B Tlcharger <oXygen/>
Code web : 685988

12
<OXYGEN/> XML EDITOR

Figure 2.5 Page de dmarrage de EditiX 2008 Lite Version

Figure 2.6 <oXygen/> - photo issue du site officiel du projet

13
CHAPITRE 2. LES BONS OUTILS

En rsum
Mme si ce nest pas obligatoire, un logiciel spcialis est conseill.
Lutilisation de EditiX sera aborde rgulirement dans ce tutoriel.

14
Chapitre 3
Les lments de base

Difficult :

Avec les 2 prcdents chapitres, nous ne sommes pas encore rellement entrs dans le vif
du sujet, ils taient simplement destins prparer le terrain.
Maintenant, les choses srieuses commencent, nous allons entrer dans la partie pratique.
Dans ce chapitre, nous allons dcouvrir ensemble les bases du XML. Aprs lavoir lu, les
mots clefs balise et attribut nauront plus de secrets pour vous !

15
CHAPITRE 3. LES LMENTS DE BASE

Les balises
Dans le tout premier chapitre, je dfinissais le langage XML comme un langage in-
formatique de balisage. En effet, les balises sont les lments de base dun document
XML. Une balise porte un nom qui est entour de chevrons. Une balise commence
donc par un < et se termine par un >. Par exemple : <balise> dfinit une balise qui
sappelle balise .
En XML, on distingue 2 types de balises : les balises par paires et les balises
uniques.

Les balises par paires


Dfinition

Les balises par paires sont composes en ralit de 2 balises que lon appelle ou-
vrantes et fermantes. La balise ouvrante commence par < et se termine par >
tandis que la balise fermante commence par </ et se termine par >. Par exemple :
1 < balise > </ balise >

Il est extrmement important que les balises ouvrantes et fermantes aient


exactement le mme nom. XML est sensible la casse (cest--dire quil fait
la distinction entre les majuscules et les minuscules) ! Toute balise ouverte
doit imprativement tre ferme. Cest une rgle dor !

Bien videmment, on peut mettre des choses entre ces balises. On parle alors de
contenu. Par exemple :
1 < balise > Je suis le contenu de la balise </ balise >

Quelques rgles

Une balise par paires ne peut pas contenir nimporte quoi : elle peut contenir une
valeur simple comme par exemple une chane de caractres, un nombre entier, un
nombre dcimal, etc.
1 < balise1 > Ceci est une cha ne de caract res </ balise1 >
2 < balise2 > 10 </ balise2 >
3 < balise3 >7 . 5 </ balise3 >

Une balise par paires peut galement contenir une autre balise. On parle alors
darborescence.
1 < balise1 >
2 < balise2 > 10 </ balise2 >
3 </ balise1 >

16
LES BALISES

Faites cependant trs attention, si une balise peut en contenir une autre, il est
cependant interdit de les chevaucher. Lexemple suivant nest pas du XML !

1 < balise1 > < balise2 > Ceci est une cha ne de caract res </ balise1 > </
balise2 >

Enfin, une balise par paires peut contenir un mlange de valeurs simples et de
balises comme en tmoigne lexemple suivant :

1 < balise1 >


2 Ceci est une cha ne de caract res
3 < balise2 > 10 </ balise2 >
4 7.5
5 </ balise1 >

Les balises uniques

Une balise unique est en ralit une balise par paires qui na pas de contenu. Vous
le savez, les informaticiens sont des fainants ! Ainsi, plutt que de perdre du temps
ouvrir et fermer des balises sans rien crire entre, une syntaxe un peu spciale a t
mise au point :

1 < balise / >

Les rgles de nommage des balises

Ce qui rend le XML gnrique, cest la possibilit de crer votre propre langage balis.
Ce langage balis, comme son nom lindique, est un langage compos de balises sauf
quen XML, cest vous qui choisissez leurs noms.
Lexemple le plus connu des langages baliss de type XML est trs certainement le
xHTML qui est utilis dans la cration de sites Internet.
Il y a cependant quelques rgles de nommage respecter pour les balises de votre
langage balis :
Les noms peuvent contenir des lettres, des chiffres ou des caractres spciaux.
Les noms ne peuvent pas dbuter par un nombre ou un caractre de ponctuation.
Les noms ne peuvent pas commencer par les lettres XML (quelle que soit la casse).
Les noms ne peuvent pas contenir despaces.
On vitera les caractres - , ; . < et > qui peuvent tre mal interprts dans vos
programmes.

17
CHAPITRE 3. LES LMENTS DE BASE

Les attributs
Dfinition
Il est possible dajouter nos balises ce quon appelle des attributs. Tout comme
pour les balises, cest vous qui en choisissez le nom. Un attribut peut se dcrire
comme une option ou une donne cache. Ce nest pas linformation principale que
souhaite transmettre la balise, mais il donne des renseignements supplmentaires sur
son contenu.
Pour que ce soit un peu plus parlant, voici tout de suite un exemple :
1 < prix devise = " euro " > 25 . 3 </ prix >

Dans lexemple ci-dessus, linformation principale est le prix. Lattribut devise nous
permet dapporter des informations supplmentaires sur ce prix, mais ce nest pas
linformation principale que souhaite transmettre la balise <prix/>.
Une balise peut contenir 0 ou plusieurs attributs. Par exemple :
1 < prix devise = " euro " moyen_paiement = " ch que " > 25 . 3 </ prix >

Quelques rgles
Tout comme pour les balises, quelques rgles sont respecter pour les attributs :
Les rgles de nommage sont les mmes que pour les balises.
La valeur dun attribut doit imprativement tre dlimite par des guillemets, simples
ou doubles.
Dans une balise, un attribut ne peut-tre prsent quune seule fois.

Les commentaires
Avant de passer la cration de notre premier document XML, jaimerais vous parler
des commentaires.
Un commentaire est un texte qui permet de donner une indication sur ce que lon
fait. Il vous permet dannoter votre fichier et dexpliquer une partie de celui-ci.
En XML, les commentaires ont une syntaxe particulire. Cest une balise unique qui
commence par < ! et qui se termine par >.
1 <! -- Ceci est un commentaire ! -- >

Voyons tout de suite sur un exemple concret :


1 <! -- Description du prix -- >
2 < prix devise = " euro " > 12 . 5 </ prix >

Certes, sur cet exemple, les commentaires semblent un peu inutiles, mais je vous assure
quils vous seront dune grande aide pendant la rdaction de longs documents XML !

18
LES COMMENTAIRES

En rsum
Deux types de balises existent : les balises par paires et les balises uniques.
Les balises peuvent contenir des attributs.
Un document XML peut contenir des commentaires.

19
CHAPITRE 3. LES LMENTS DE BASE

20
Chapitre 4
Votre premier document XML

Difficult :

Dans le chapitre prcdent, nous avons dcouvert les lments de base du XML, mais vous
ignorez encore comment crire un document XML. Ne vous inquitez pas, ce chapitre a
pour objectif de corriger ce manque.
Dans ce chapitre, nous allons donc nous attaquer tout ce qui se rattache lcriture dun
document XML. Ce sera loccasion de dcouvrir la structure gnrale dun document ainsi
que nouvelles notions clefs. Nous finirons par nous lancer dans la pratique, seulement un
petit peu, rassurez-vous, travers lutilisation du logiciel EditiX afin dcrire notre premier
document XML en bonne et due forme !

21
CHAPITRE 4. VOTRE PREMIER DOCUMENT XML

Structure dun document XML


Un document XML peut tre dcoup en 2 parties : le prologue et le corps.

Le prologue
Le prologue correspond la premire ligne de votre document XML. Il donne des
informations de traitement.
Voici quoi notre prologue ressemble dans cette premire partie du tutoriel :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >

Comme vous pouvez le remarquer, le prologue est une balise unique qui commence par
< ?xml et qui se termine par ?>. Si vous ne comprenez pas cette ligne, pas de panique,
nous allons tout dcortiquer ensemble pas pas.

La version

Dans le prologue, on commence gnralement par indiquer la version de XML que lon
utilise pour dcrire nos donnes. Pour rappel, il existe actuellement 2 versions : 1.0 et
1.1.
noter : le prologue nest obligatoire que depuis la version 1.1, mais il est plus que
conseill de lajouter quand mme lorsque vous utilisez la version 1.0.
La diffrence entre les 2 versions est une amlioration dans le support des diffrentes
versions de lUnicode. Sauf si vous souhaitez utiliser des caractres chinois dans vos
documents XML, il conviendra dutiliser la version 1.0 qui est encore aujourdhui la
version la plus utilise.

Le jeu de caractres

La seconde information de mon prologue est encoding="UTF-8".


Il sagit du jeu de caractres utilis dans mon document XML. Par dfaut, lenco-
dage de XML est lUTF-8, mais si votre diteur de texte enregistre vos documents en
ISO8859-1, il suffit de la changer dans le prologue :
1 <? xml version = " 1 . 0 " encoding = " ISO8859 - 1 " standalone = " yes " ? >

Un document autonome

La dernire information prsente dans le prologue est standalone="yes".


Cette information permet de savoir si votre document XML est autonome ou si un
autre document lui est rattach.

22
UN DOCUMENT BIEN FORM

Il est encore un peu tt pour vous en dire plus. Nous reviendrons sur cette notion dans
la partie 2 du tutoriel. Pour le moment, acceptez le fait que nos documents sont tous
autonomes.

Le corps
Le corps dun document XML est constitu de lensemble des balises qui dcrivent les
donnes. Il y a cependant une rgle trs importante respecter dans la constitution
du corps : une balise en paires unique doit contenir toutes les autres. Cette balise est
appele lment racine du corps.
Voyons tout de suite un exemple :
1 < racine >
2 < balise_paire > texte </ balise_paire >
3 < balise_paire2 > texte </ balise_paire2 >
4 < balise_paire > texte </ balise_paire >
5 </ racine >

Bien videmment, lorsque vous crez vos documents XML, le but est dtre le plus
explicite possible dans le nommage de vos balises. Ainsi, le plus souvent, la balise
racine aura pour mission de dcrire ce quelle contient.
Si je choisis de dcrire un rpertoire, je peux par exemple nommer mes balises comme
dans lexemple suivant :
1 < repertoire >
2 < personne > Bernard </ personne >
3 < personne > Patrick </ personne >
4 </ repertoire >

Un document complet
Un document XML, certes simple, mais complet pourrait donc tre le suivant :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < repertoire >
3 < personne > Bernard </ personne >
4 < personne > Patrick </ personne >
5 </ repertoire >

Un document bien form


Quand vous entendrez parler de XML, vous entendrez souvent parler de document
XML bien form ou well-formed en anglais.
Cette notion dcrit en ralit un document XML conforme aux rgles syntaxiques d-
crites tout au long de cette premire partie du tutoriel.

23
CHAPITRE 4. VOTRE PREMIER DOCUMENT XML

On peut rsumer un document XML bien form un document XML avec une syntaxe
correcte, cest--dire :
Sil sagit dun document utilisant la version 1.1 du XML, le prologue est bien ren-
seign.
Le document XML ne possde quune seule balise racine.
Le nom des balises et des attributs est conforme aux rgles de nommage.
Toutes les balises en paires sont correctement fermes.
Toutes les valeurs des attributs sont entre guillemets simples ou doubles.
Les balises de votre document XML ne se chevauchent pas, il existe une arborescence
dans votre document.
Si votre document XML est bien form, flicitation, il est exploitable ! Dans le cas
contraire, votre document est inutilisable.

Utilisation dEditiX
Tout cela est bien beau, me direz-vous, mais depuis le dbut de ce tutoriel, nous parlons
du XML sans avoir encore utilis les logiciels du chapitre 2.
Nous allons les employer ds maintenant. Dans cette partie, nous allons crer notre
premier document XML grce au logiciel EditiX et vrifier quil est bien form.
Je vous propose dutiliser le document complet que nous avons construit auparavant :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < repertoire >
3 < personne > Robert </ personne >
4 < personne > John </ personne >
5 </ repertoire >

Crer un nouveau document


Commencez par lancer EditiX.
Pour crer un nouveau document, vous pouvez cliquer sur licne prsente la figure
 dans la barre de menu File puis New ou encore utiliser le raccourci
8.2 puisslectionner
clavier Ctrl + N .

Figure 4.1 Nouveau document

Dans la liste qui saffiche, slectionnez Standard XML document, comme indiqu
sur la figure 4.2.
Surprise ! Votre document XML nest pas vierge. Voici ce que vous devriez voir :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >

24
UTILISATION DEDITIX

Figure 4.2 Cration dun document XML

2
3 <! -- New document created with EditiX at Fri May 18 00 : 11 : 02
CEST 2012 -- >

Comme vous pouvez le constater, EditiX sest charg pour vous dcrire le prologue de
votre document XML. Il a galement pris en charge la rdaction dun petit commentaire
pour vous rappeler la date et lheure de cration de votre document.
Puisque notre document sera autonome, vous pouvez modifier le prologue pour lindi-
quer :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >

Vrification du document
Nous pouvons vrifier ds maintenant si notre document est bien form. Pour ce faire,
vous pouvez cliquer sur licne reprsente la figure 8.4 et slectionner dans la barre
de menu XML puis Check this document ou encore utiliser le raccourci clavier
Ctrl + K .

Figure 4.3 Vrification dun document

Vous devriez alors voir une erreur safficher. La ligne o se situe lerreur est reprsente
par un rectangle aux bords rouges sur notre espace de travail, comme indiqu sur la
figure 4.4.
Nous avons donc une erreur la ligne 6 de notre document. Pour en savoir plus sur
notre erreur, il suffit de regarder en bas de lcran. La figure 4.5 montre ce que vous
devriez voir.

25
CHAPITRE 4. VOTRE PREMIER DOCUMENT XML

Figure 4.4 Le document XML contient une erreur

Figure 4.5 Message derreur indiquant que le document nest pas bien form

Pour ceux qui ne parlent pas anglais, voici ce que dit le message : Un document bien
form ncessite un lment racine.
Il manque donc un lment racine. Compltons tout de suite notre document avec
les lments suivant :

1 < repertoire >


2 < personne > Robert </ personne >
3 < personne > John </ personne >
4 </ repertoire >

Lancez de nouveau la vrification du document. Vous devriez avoir le message prsent


la figure 26.4 lcran.

Figure 4.6 Message indiquant un document XML bien form

Flicitation, votre document est bien form !

Lindentation

Il est possible de demander Editix dindenter automatiquement vos documents


une fois crits. Pour ce faire, slectionnez dans la barre de menu
 XML
 puis Format
et Pretty format (default) ou utilisez le raccourci clavier Ctrl + R .
Dans ce mme menu, vous pouvez accder aux paramtres concernant la tabulation.

26
UTILISATION DEDITIX

Larborescence du document
Editix met votre disposition un outil fort sympathique qui vous permet de visualiser
larborescence du document en cours ddition (voir figure 4.7).

Figure 4.7 Arborescence du document XML

On sait ainsi que notre rpertoire contient 2 personnes : Robert et John.

Enregistrer votre document


Il est maintenant temps de clore ce chapitre en enregistrant votre document XML.
Pour ce faire, vous pouvez cliquer sur licne visible la figure 4.8 ou bien slectionner

dans
 la barre de menu File puis Save ou encore utiliser le raccourci clavier Ctrl +
S .

Figure 4.8 Enregistrement dun document

Dans la fentre de dialogue qui vient de souvrir, choisissez lemplacement dans lequel
vous souhaitez stocker votre fichier XML, tapez son nom et cliquez sur Enregistrer.

En rsum
Un document XML est compos de 2 parties : le prologue et le corps.
un document XML doit tre bien form pour tre exploitable.
EditiX permet de vrifier quun document est bien form en seulement quelques
clics.

27
CHAPITRE 4. VOTRE PREMIER DOCUMENT XML

28
Chapitre 5
TP : structuration dun rpertoire

Difficult :

Voici donc le premier TP de ce tutoriel ! Lobjectif de ces chapitres TP, un peu particuliers,
est de vous inviter vous lancer dans la pratique laide de tous les lments thoriques
que vous avez lu au cours des chapitres prcdents. Cela me semble indispensable pour
sassurer que vous avez bien compris toutes les notions abordes jusqu maintenant.
Dans ce premier TP, lobjectif est de vous montrer une utilisation concrte de structuration
de donnes via XML.

29
CHAPITRE 5. TP : STRUCTURATION DUN RPERTOIRE

Lnonc
Le but de ce TP est de crer un document XML structurant les donnes dun rpertoire.
Votre rpertoire doit comprendre au moins 2 personnes. Pour chaque personne, on
souhaite connatre les informations suivantes :
Son sexe (homme ou femme).
Son nom.
Son prnom.
Son adresse.
Un ou plusieurs numros de tlphone (tlphone portable, fixe, bureau, etc.).
Une ou plusieurs adresses e-mail (adresse personnelle, professionnelle, etc.).
Je ne vous donne aucune indication concernant le choix des balises, des attributs et de
larborescence choisir pour une raison trs simple : lorsque lon dbute en XML, le
choix des attributs, des balises et de larborescence est assez difficile.
Lobjectif est vraiment de vous laisser chercher et vous pousser vous poser les bonnes
questions sur lutilit dune balise, dun attribut, etc.

Exemple de solution
Je vous fais part de ma solution. Notez bien que ce nest quune solution parmi les
multiples solutions possibles !
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2
3 < repertoire >
4 <! -- John DOE -- >
5 < personne sexe = " masculin " >
6 < nom > DOE </ nom >
7 < prenom > John </ prenom >
8 < adresse >
9 < numero >7 </ numero >
10 < voie type = " impasse " > impasse du chemin </ voie >
11 < codePostal > 75015 </ codePostal >
12 < ville > PARIS </ ville >
13 < pays > FRANCE </ pays >
14 </ adresse >
15 < telephones >
16 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
17 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
18 </ telephones >
19 < emails >
20 < email type = " personnel " > john . doe@wanadoo . fr </ email >
21 < email type = " professionnel " > john . doe@societe . com </
email >
22 </ emails >

30
EXEMPLE DE SOLUTION

23 </ personne >


24
25 <! -- Marie POPPINS -- >
26 < personne sexe = " feminin " >
27 < nom > POPPINS </ nom >
28 < prenom > Marie </ prenom >
29 < adresse >
30 < numero > 28 </ numero >
31 < voie type = " avenue " > avenue de la r publique </ voie >
32 < codePostal > 13005 </ codePostal >
33 < ville > MARSEILLE </ ville >
34 < pays > FRANCE </ pays >
35 </ adresse >
36 < telephones >
37 < telephone type = " professionnel " > 04 05 06 07 08 </
telephone >
38 </ telephones >
39 < emails >
40 < email type = " professionnel " > contact@poppins . fr </
email >
41 </ emails >
42 </ personne >
43 </ repertoire >

Quelques explications
Le sexe

Comme vous pouvez le constater, jai fait le choix de renseigner le sexe dans un attribut
de la balise <personne/> et non den faire une balise part entire.
En effet, cette information est, je pense, plus utile lordinateur qui lira le document
qu toute personne qui prendrait connaissance de ce fichier. En effet, contrairement
une machine, nous avons la capacit de dduire que John est un prnom masculin et
Marie, un prnom fminin. Cette information nest donc pas cruciale pour les personnes
qui lisent le fichier.

Ladresse

Il est important que vos documents XML aient une arborescence logique. Cest pourquoi
jai dcid de reprsenter ladresse postale par une balise <adresse /> qui contient les
informations dtailles de ladresse de la personne comme le numro de limmeuble, la
voie, le pays, etc.
Jai galement fait le choix dajouter un attribut type dans la balise <voie />. Une
nouvelle fois, cet attribut est destin tre utilis par une machine.
En effet, une machine qui traitera ce fichier, pourra facilement accder au type de la
voie sans avoir rcuprer le contenu de la balise <voie/> et tenter danalyser sil

31
CHAPITRE 5. TP : STRUCTURATION DUN RPERTOIRE

sagit dune impasse, dune rue, dune avenue, etc. Cest donc un gain de temps dans
le traitement des donnes.

Numros de tlphone et adresses e-mails

Encore une fois, dans un soucis darborescence logique, jai dcid de crer les blocs
<telephones /> et <emails /> qui contiennent respectivement lensemble des num-
ros de tlphone et des adresses e-mail.
Pour chacune des balises <telephone/> et <email/>, jai dcid dy mettre un attribut
type. Cet attribut permet de renseigner si ladresse e-mail ou le numro de tlphone
est par exemple professionnel ou personnel.
Bien quindispensable aussi bien aux tres humains quaux machines, cette information
est place dans un attribut car ce nest pas linformation principale que lon souhaite
transmettre. Ici, linformation principale reste le numro de tlphone ou ladresse e-
mail et non son type.

32
Deuxime partie

Crez des dfinitions pour vos


documents XML

33
Chapitre 6
Introduction aux dfinitions et aux
DTD

Difficult :

Dans la premire partie, nous avons dcouvert ce qutait le XML. Pour ne rien vous
cacher, le XML est trs peu utilis seul et on prfre souvent lutiliser en parallle dautres
technologies permettant dtendre les possibilits de la technologie. Ltude de ces autres
technologies dbute donc maintenant ! Nous allons aborder les technologies qui permettent
de dfinir une structure stricte aux documents XML : les fichiers de dfinition.
Il existe plusieurs technologies qui permettent dcrire des fichiers de configuration, nous
en verrons 2 dans cette seconde partie. Dbutons tout de suite avec les DTD.

35
CHAPITRE 6. INTRODUCTION AUX DFINITIONS ET AUX DTD

Quest-ce que la dfinition dun document XML ?


Avant de foncer tte baisse dans la seconde partie de ce cours, il est indispensable de
revenir sur quelques termes qui seront importants pour la suite de ce tutoriel.

Quelques dfinitions
Dfinition dune dfinition

Une dfinition dun document XML est un ensemble de rgles que lon impose au
document. Ces rgles permettent de dcrire la faon dont le document XML doit tre
construit. Elles peuvent tre de natures diffrentes. Par exemple, ces rgles peuvent
imposer la prsence dun attribut ou dune balise, imposer lordre dapparition des
balises dans le document ou encore, imposer le type dune donne (nombre entier,
chane de caractres, etc.).

Un document valide

Dans la partie prcdente, nous avons vu ce qutait un document bien form. Cette
seconde partie est loccasion daller un peu plus loin et de voir le concept de document
valide.
Un document valide est un document bien form conforme une dfinition.
Cela signifie que le document XML respecte toutes les rgles qui lui sont imposes dans
les fameuses dfinitions.

Pourquoi crire des dfinitions ?


Vous vous demandez certainement quoi servent ces dfinitions et pourquoi on les
utilise, nest-ce pas ?
Associer une dfinition un document oblige une certaine rigueur dans lcriture de
vos donnes XML. Cest dautant plus important lorsque plusieurs personnes travaillent
sur un mme document. La dfinition impose ainsi une criture uniforme que tout le
monde doit respecter. On vite ainsi que lcriture dun document soit anarchique et,
par consquent, difficilement exploitable.

Exploitable oui ! Mais par qui ?

Le plus souvent, par un programme informatique ! Vous pouvez par exemple crire
un programme informatique qui traite les donnes contenues dans un document XML
respectant une dfinition donne. Imposer une dfinition aux documents que votre
programme exploite permet dassurer un automatisme et un gain de temps prcieux :

36
DFINITION DUNE DTD

Le document nest pas valide : je ne tente pas de lexploiter.


Le document est valide : je sais comment lexploiter.
Pour terminer cette longue introduction, sachez que vous avez le choix entre deux tech-
nologies pour crire les dfinitions de vos documents XML : les DTD ou les schmas
XML.

Dfinition dune DTD


Une dfinition rapide
Une Document Type Definition ou en franais une Dfinition de Type de Do-
cument, souvent abrg DTD, est la premire technologie que nous allons tudier
pour crire les dfinitions de nos documents XML.
Comme nous lavons dj prcis dans lintroduction de cette seconde partie, le but est
dcrire une dfinition de nos documents XML, cest--dire, de construire un ensemble
de rgles qui vont rgir la construction du document XML.
Grce lensemble de ces rgles, nous allons ainsi dfinir larchitecture de notre do-
cument XML et la hirarchie qui existe entre les balises de celui-ci. Ainsi, on pourra
prciser lenchanement et le contenu des balises et des attributs contenus dans le do-
cument XML.
Finalement, sachez quavec les DTD, vous ne pourrez pas toujours tout faire, la tech-
nologie commenant en effet vieillir. Mais comme elle est encore beaucoup utilise, il
est indispensable quelle soit tudie dans ce tutoriel.

O crire les DTD ?


Tout comme les fichiers XML, les DTD scrivent dans des fichiers.
Nous reviendrons sur ce point un peu plus tard, mais sachez ds prsent quil existe
2 types de DTD : les DTD externes et les DTD internes.
Les rgles des DTD internes scrivent directement dans le fichier XML quelles d-
finissent tandis que les rgles des DTD externes sont crites dans un fichier spar
portant lextension .dtd .
Maintenant que vous en savez un peu plus, je vous propose de rentrer dans le vif du
sujet.

Les lments
La syntaxe
Pour dfinir les rgles portant sur les balises, on utilise le mot clef ELEMENT.

37
CHAPITRE 6. INTRODUCTION AUX DFINITIONS ET AUX DTD

1 <! ELEMENT balise ( contenu ) >

Une rgle peut donc se dcouper en 3 mots clefs : ELEMENT, balise et contenu.

Retour sur la balise


Le mot-clef balise est remplacer par le nom de la balise laquelle vous souhaitez
appliquer la rgle. Pour exemple, reprenons une balise du TP de la partie 1 :
1 < nom > DOE </ nom >

On crira alors :
1 <! ELEMENT nom ( contenu ) >

Retour sur le contenu


Cet emplacement a pour vocation de dcrire ce que doit contenir la balise : est-ce une
autre balise ou est-ce une valeur ?

Cas dune balise en contenant une autre

Par exemple, regardons la rgle suivante :


1 <! ELEMENT personne ( nom ) >
2 <! -- suite de la DTD -- >

Cette rgle signifie que la balise <personne /> contient la balise <nom />.
Le document XML respectant cette rgle ressemble donc cela :
1 < personne >
2 < nom > John DOE </ nom >
3 </ personne >

Nous navons dfini aucune rgle pour la balise <nom/>. Le document nest,
par consquent, pas valide. En effet, dans une DTD, il est impratif de
dcrire tout le document sans exception. Des balises qui napparaissent
pas dans la DTD ne peuvent pas tre utilises dans le document XML.

Cas dune balise contenant une valeur

Dans le cas o notre balise contient une valeur simple, on utilisera la mot clef #PCDATA
Une valeur simple dsigne par exemple une chane de caractres, un entier, un nombre
dcimal, un caractre, etc.
En se basant sur lexemple exemple prcdent :

38
LES LMENTS

1 < personne >


2 < nom > John DOE </ nom >
3 </ personne >

nous avions dj dfini une rgle pour la balise <personne/> :


1 <! ELEMENT personne ( nom ) >

Nous pouvons maintenant complter notre DTD en ajoutant une rgle pour la balise
<nom/>. Par exemple, si lon souhaite que cette balise contienne une valeur simple, on
crira :
1 <! ELEMENT nom (# PCDATA ) >

Au final, la DTD de notre document XML est donc la suivante :


1 <! ELEMENT personne ( nom ) >
2 <! ELEMENT nom (# PCDATA ) >

Cas dune balise vide

Il est galement possible dindiquer quune balise ne contient rien grce au mot-clef
EMPTY. Prenons les rgles suivantes :
1 <! ELEMENT personne ( nom ) >
2 <! ELEMENT nom EMPTY >

Le document XML rpondant la dfinition DTD prcdente est le suivant :


1 < personne >
2 < nom / >
3 </ personne >

noter : lors de lutilisation du mot clef EMPTY, lusage des parenthses nest
pas obligatoire !

Cas dune balise pouvant tout contenir

Il nous reste un cas voir : celui dune balise qui peut tout contenir, cest dire, une
autre balise, une valeur simple ou tout simplement tre vide. Dans ce cas, on utilise le
mot-clef ANY
Prenons la rgle suivante :
1 <! ELEMENT personne ( nom ) >
2 <! ELEMENT nom ANY >

Les documents XML suivants sont bien valides :

39
CHAPITRE 6. INTRODUCTION AUX DFINITIONS ET AUX DTD

1 <! -- valeur simple -- >


2 < personne >
3 < nom > John DOE </ nom >
4 </ personne >
5
6 <! -- vide -- >
7 < personne >
8 < nom / >
9 </ personne >

Bien que le mot-clef ANY existe, il est souvent dconseill de lutiliser afin de
restreindre le plus possible la libert de rdaction du document XML.

Comme pour le mot-clef EMPTY, lusage des parenthses nest pas obligatoire
pour le mot-clef ANY !

Structurer le contenu des balises


Nous allons voir maintenant des syntaxes permettant dapporter un peu de gnricit
aux dfinitions DTD. Par exemple, un rpertoire contient gnralement un nombre
variable de personnes, il faut donc permettre au document XML dtre valide quel que
soit le nombre de personnes quil contient.

La squence
Une squence permet de dcrire lenchanement impos des balises. Il suffit dindiquer
le nom des balises en les sparant par des virgules.
1 <! ELEMENT balise ( balise2 , balise3 , balise4 , balise5 , etc .) >

Prenons lexemple suivant :


1 <! ELEMENT personne ( nom , prenom , age ) >
2 <! ELEMENT nom (# PCDATA ) >
3 <! ELEMENT prenom (# PCDATA ) >
4 <! ELEMENT age (# PCDATA ) >

Cette dfinition impose que la balise <personne /> contienne obligatoirement les ba-
lises <nom />, <prenom /> et <age /> dans cet ordre. Regardons alors la validit des
documents XML qui suivent :
1 <! -- valide -- >
2 < personne >
3 < nom > DOE </ nom >

40
STRUCTURER LE CONTENU DES BALISES

4 < prenom > John </ prenom >


5 < age > 24 </ age >
6 </ personne >
7
8 <! -- invalide -- >
9 <! -- les balises ne sont pas dans le bon ordre -- >
10 < personne >
11 < prenom > John </ prenom >
12 < nom > DOE </ nom >
13 < age > 24 </ age >
14 </ personne >
15
16 <! -- invalide -- >
17 <! -- il manque une balise -- >
18 < personne >
19 < prenom > John </ prenom >
20 < age > 24 </ age >
21 </ personne >
22
23 <! -- invalide -- >
24 <! -- il y a une balise en trop qui plus est n ' est pas d clar e
-->
25 < personne >
26 <nom > DOE </ nom >
27 < prenom > John </ prenom >
28 <age > 24 </ age >
29 < date > 12 / 12 / 2012 </ date >
30 </ personne >

La liste de choix
Une liste de choix permet de dire quune balise contient lune des balises dcrites. Il
suffit dindiquer le nom des balises en les sparant par une barre verticale.
1 <! ELEMENT balise ( balise2 | balise3 | balise4 | balise5 | etc .)
>

Prenons lexemple suivant :


1 <! ELEMENT personne ( nom | prenom ) >
2 <! ELEMENT nom (# PCDATA ) >
3 <! ELEMENT prenom (# PCDATA ) >

Cette dfinition impose que la balise <personne /> contienne obligatoirement la balise
<nom /> ou la balise <prenom />.
Regardons alors la validit des documents XML ci-dessous :
1 <! -- valide -- >
2 < personne >
3 < nom > DOE </ nom >

41
CHAPITRE 6. INTRODUCTION AUX DFINITIONS ET AUX DTD

4 </ personne >


5
6 <! -- valide -- >
7 < personne >
8 < prenom > John </ prenom >
9 </ personne >
10
11 <! -- invalide -- >
12 <! -- les 2 balises prenom et nom ne peuvent pas tre pr sentes
en m me temps . -- >
13 < personne >
14 < prenom > John </ prenom >
15 < nom > DOE </ nom >
16 </ personne >
17
18 <! -- invalide -- >
19 <! -- il manque une balise -- >
20 < personne / >

La balise optionnelle
Une balise peut tre optionnelle. Pour indiquer quune balise est optionnelle, on fait
suivre son nom par un point dinterrogation.
1 <! ELEMENT balise ( balise2 , balise3 ? , balise4 ) >

Prenons lexemple suivant :


1 <! ELEMENT personne ( nom , prenom ?) >
2 <! ELEMENT nom (# PCDATA ) >
3 <! ELEMENT prenom (# PCDATA ) >

Cette dfinition impose que la balise <personne /> contienne obligatoirement la balise
<nom /> puis ventuellement <prenom />. Regardons alors la validit de ces documents
XML :
1 <! -- valide -- >
2 < personne >
3 < nom > DOE </ nom >
4 </ personne >
5
6 <! -- valide -- >
7 < personne >
8 < nom > DOE </ nom >
9 < prenom > John </ prenom >
10 </ personne >
11
12 <! -- invalide -- >
13 <! -- l ' ordre des balises n ' est pas respect -- >
14 < personne >

42
STRUCTURER LE CONTENU DES BALISES

15 < prenom > John </ prenom >


16 < nom > DOE </ nom >
17 </ personne >

La balise rpte optionnelle


Une balise peut tre rpte plusieurs fois mme si elle est optionnelle. Pour indiquer
une telle balise, on fait suivre son nom par une toile.
1 <! ELEMENT balise ( balise2 , balise3 * , balise4 ) >

Soit lensemble de rgles suivant :


1 <! ELEMENT repertoire ( personne *) >
2 <! ELEMENT personne ( nom , prenom ) >
3 <! ELEMENT nom (# PCDATA ) >
4 <! ELEMENT prenom (# PCDATA ) >

Cette dfinition impose que la balise <repertoire /> contienne entre 0 et une infinit
de fois la balise <personne />. La balise <personne />, quant elle, doit obligatoire-
ment contenir les balises <nom /> et <prenom /> dans cet ordre.
Regardons alors la validit des documents XML :
1 <! -- valide -- >
2 < repertoire >
3 < personne >
4 < nom > DOE </ nom >
5 < prenom > John </ prenom >
6 </ personne >
7 < personne >
8 < nom > POPPINS </ nom >
9 < prenom > Marie </ prenom >
10 </ personne >
11 </ repertoire >
12
13 <! -- valide -- >
14 < repertoire >
15 < personne >
16 < nom > DOE </ nom >
17 < prenom > John </ prenom >
18 </ personne >
19 </ repertoire >
20
21 <! -- valide -- >
22 < repertoire / >
23
24 <! -- invalide -- >
25 <! -- il manque la balise prenom dans la seconde balise
personne -- >

43
CHAPITRE 6. INTRODUCTION AUX DFINITIONS ET AUX DTD

26 < repertoire >


27 < personne >
28 < nom > DOE </ nom >
29 < prenom > John </ prenom >
30 </ personne >
31 < personne >
32 < nom > POPPINS </ nom >
33 </ personne >
34 </ repertoire >

La balise rpte
Une balise peut tre rpte plusieurs fois. Pour indiquer une telle balise, on fait
suivre son nom par un plus.
1 <! ELEMENT balise ( balise2 , balise3 + , balise4 ) >

Prenons lexemple suivant :


1 <! ELEMENT repertoire ( personne +) >
2 <! ELEMENT personne ( nom , prenom ) >
3 <! ELEMENT nom (# PCDATA ) >
4 <! ELEMENT prenom (# PCDATA ) >

Cette dfinition impose que la balise <repertoire /> contienne au minimum une
fois la balise <personne />. La balise <personne /> quant elle doit obligatoirement
contenir les balises <nom /> et <prenom /> dans cet ordre.
Regardons alors la validit des documents XML suivants :
1 <! -- valide -- >
2 < repertoire >
3 < personne >
4 < nom > DOE </ nom >
5 < prenom > John </ prenom >
6 </ personne >
7 < personne >
8 < nom > POPPINS </ nom >
9 < prenom > Marie </ prenom >
10 </ personne >
11 </ repertoire >
12
13 <! -- valide -- >
14 < repertoire >
15 < personne >
16 < nom > DOE </ nom >
17 < prenom > John </ prenom >
18 </ personne >
19 </ repertoire >
20

44
STRUCTURER LE CONTENU DES BALISES

21 <! -- invalide -- >


22 <! -- la balise personne doit tre pr sente au moins une fois -- >
23 < repertoire / >

En rsum
Un document valide est un document bien form conforme une dfinition.
Un document conforme une dfinition est un document qui respecte toutes
les rgles qui lui sont imposes dans les fameuses dfinitions.
Il existe les DTD internes et les DTD externes .
Il est possible dcrire de nombreuses rgles grce aux DTD.
Le mot clef ELEMENT permet de dcrire les rgles relatives aux balises XML.

45
CHAPITRE 6. INTRODUCTION AUX DFINITIONS ET AUX DTD

46
Chapitre 7
DTD : les attributs et les entits

Difficult :

Dans le chapitre prcdent, nous avons vu comment dcrire les balises de nos documents
XML, mais ce nest pas suffisant pour pouvoir dcrire lintgralit dun document XML. En
effet, rappelez vous quune balise peut contenir ce quon appelle des attributs. Il convient
donc de dcrire les rgles relatives ces attributs. Cest ce que nous allons voir au cours
de ce chapitre.
Ce chapitre sera galement loccasion de dcouvrir une nouvelle notion dont je nai pas
encore parl : les entits. Je ne vous en dis pas plus pour le moment, je prfre garder un
peu de suspens autour de la dfinition de cette notion et son utilisation.

47
CHAPITRE 7. DTD : LES ATTRIBUTS ET LES ENTITS

Les attributs
Dans le chapitre prcdent, nous avons dcouvert la syntaxe permettant de dfinir des
rgles sur les balises de nos documents XML. Vous allez voir que le principe est le
mme pour dfinir des rgles nos attributs.

La syntaxe
Pour indiquer que notre rgle porte sur un attribut, on utilise le mot clef ATTLIST.
On utilise alors la syntaxe suivante :
1 <! ATTLIST balise attribut type mode >

Une rgle peut donc se diviser en 5 mots clefs : ATTLIST, balise, attribut, type et
mode.

Retour sur la balise et lattribut


Il nest pas ncessaire de sattarder trop longtemps sur le sujet, il suffit simplement
dcrire le nom de la balise et de lattribut concern par la rgle.
Par exemple, reprenons une balise du TP de la partie 1 :
1 < personne sexe = " masculin " / >

On crira alors :
1 <! ATTLIST personne sexe type mode >

Retour sur le type


Cet emplacement a pour vocation de dcrire le type de lattribut. Est-ce une valeur
bien prcise ? Est-ce du texte ? Un identifiant ?

Cas dun attribut ayant pour type la liste des valeurs possibles

Nous allons tudier ici le cas dun attribut ayant pour type une liste de valeurs.
Les diffrentes valeurs possibles pour lattribut sont spares par une barre verticale
.
1 <! ATTLIST balise attribut ( valeur 1 | valeur 2 | valeur 3 | etc
.) mode >

Reprenons une nouvelle fois la balise <personne />. Nous avons vu que cette balise
possde un attribut sexe. Nous allons ici imposer la valeur que peut prendre cette
attribut : soit masculin, soit fminin.
Voici ce quoi la rgle portant sur lattribut dans notre DTD doit ressembler :

48
LES ATTRIBUTS

1 <! ATTLIST personne sexe ( masculin | f minin ) mode >

Quelques exemple de documents XML possibles :


1 <! -- valide -- >
2 < personne sexe = " masculin " / >
3
4 <! -- valide -- >
5 < personne sexe = " f minin " / >
6
7 <! -- invalide -- >
8 < personne sexe = " autre " / >

Cas dun attribut ayant pour type du texte non pars

Derrire le terme texte non pars se cache en fait la possibilit de mettre ce


que lon veut comme valeur : un nombre, une lettre, une chane de caractres, etc.
Il sagit de donnes qui ne seront pas analyses par le parseur au moment de la
validation et/ou lexploitation de votre document XML.
Dans le cas o notre attribut contient du texte non pars , on utilise la mot clef
CDATA.
1 <! ATTLIST balise attribut CDATA mode >

Soit la rgle suivante :


1 <! ATTLIST personne sexe CDATA mode >

Notre document XML rpondant cette rgle peut ressembler cela :


1 <! -- valide -- >
2 < personne sexe = " masculin " / >
3
4 <! -- valide -- >
5 < personne sexe = " f minin " / >
6
7 <! -- valide -- >
8 < personne sexe = " autre " / >
9
10 <! -- valide -- >
11 < personne sexe = " 12 " / >

Cas dun attribut ayant pour type un identifiant unique

Il est tout fait possible de vouloir quune balise possde un attribut permettant de
lidentifier de manire unique.
Prenons par exemple lexemple dune course pied. Dans le classement de la course, il
y aura un unique vainqueur, un unique second et un unique troisime.

49
CHAPITRE 7. DTD : LES ATTRIBUTS ET LES ENTITS

Pour indiquer que la valeur de lattribut est unique, on utilise le mot clef ID
comme IDentifiant.
1 <! ATTLIST balise attribut ID mode >

Prenons par exemple la rgle suivante :


1 <! ATTLIST personne position ID mode >

Voici quelques exemples de documents XML :


1 <! -- valide -- >
2 < personne position = " POS - 1 " / >
3 < personne position = " POS - 2 " / >
4 < personne position = " POS - 3 " / >
5
6 <! -- invalide -- >
7 < personne position = " POS - 1 " / >
8 < personne position = " POS - 1 " / >
9 < personne position = " POS - 2 " / >

Cas dun attribut ayant pour type une rfrence un identifiant unique

Il est tout fait possible que dans votre document, un de vos attributs fasse rfrence
un identifiant. Cela permet souvent de ne pas crire 100 fois les mmes informations.
Par exemple, votre document XML peut vous servir reprsenter des liens de parent
entre des personnes. Grce aux rfrences, nous nallons pas devoir imbriquer des balises
XML dans tous les sens pour tenter de reprsenter le pre dune personne ou le fils
dune personne.
Pour faire rfrence un identifiant unique, on utilise le mot clef IDREF.
Prenons par exemple la rgle suivante :
1 <! ATTLIST father id ID mode >
2 <! ATTLIST child id ID mode
3 father IDREF mode
4 >

Cette rgle signifie que la balise personne a 2 attributs : id qui est lidentifiant unique
de la personne et father qui fait rfrence une autre personne.
Illustrons immdiatement avec un exemple XML :
1 <! -- valide -- >
2 < father id = " PER - 1 " / >
3 < child id = " PER - 2 " father = " PER - 1 " / >
4
5 <! -- invalide -- >
6 <! -- l ' identifiant PER - 0 n ' appara t nulle part -- >
7 < father id = " PER - 1 " / >
8 < child id = " PER - 2 " father = " PER - 0 " / >

50
LES ATTRIBUTS

Dans cet exemple, la personne PER-2 a pour pre la personne PER-1. Ainsi, on
matrialise bien le lien entre ces 2 personnes.

Retour sur le mode


Cet emplacement permet de donner une information supplmentaire sur lattribut
comme par exemple une indication sur son obligation ou sa valeur.

Cas dun attribut obligatoire

Lorsquon souhaite quun attribut soit obligatoirement renseign, on utilise le


mot clef #REQUIRED.
Par exemple, si lon souhaite que le sexe dune personne soit renseign, on utilisera la
rgle suivante :
1 <! ATTLIST personne sexe ( masculin | f minin ) # REQUIRED >

Voici alors quelques exemple de documents XML possibles :


1 <! -- valide -- >
2 < personne sexe = " masculin " / >
3
4 <! -- valide -- >
5 < personne sexe = " f minin " / >
6
7 <! -- invalide -- >
8 < personne / >

Cas dun attribut optionnel

Si au contraire on souhaite indiquer quun attribut nest pas obligatoire, on utilise


le mot clef #IMPLIED.
Si lon reprend lexemple prcdent, on peut indiquer quil nest pas obligatoire de
renseigner le sexe dune personne par la rgle suivante :
1 <! ATTLIST personne sexe CDATA # IMPLIED >

Voici alors quelques exemple de documents XML possibles :


1 <! -- valide -- >
2 < personne sexe = " masculin " / >
3
4 <! -- valide -- >
5 < personne sexe = " f minin " / >
6
7 <! -- valide -- >
8 < personne sexe = " 15 " / >

51
CHAPITRE 7. DTD : LES ATTRIBUTS ET LES ENTITS

9
10 <! -- valide -- >
11 < personne / >

Cas dune valeur par dfaut

Il est galement possible dindiquer une valeur par dfaut pour un attribut. Il suffit
tout simplement dcrire cette valeur en dur dans la rgle.
Par exemple, il est possible dindiquer quune personne dont lattribut sexe nest pas
renseign est un homme par dfaut grce la rgle suivante :
1 <! ATTLIST personne sexe CDATA " masculin " >

Voici alors quelques exemple de documents XML possibles :


1 <! -- valide -- >
2 < personne sexe = " masculin " / >
3
4 <! -- valide -- >
5 < personne sexe = " f minin " / >
6
7 <! -- valide -- >
8 <! -- l ' attribut sexe vaut " masculin " -->
9 < personne / >

Cas dune constante

Enfin, il est possible de rendre obligatoire un attribut et de fixer sa valeur grce


au mot clef #FIXED suivi de ladite valeur.
Cette situation peut par exemple se rencontrer lorsque lon souhaite travailler dans une
devise bien prcise et que lon souhaite quelle apparaisse dans le document.
Par exemple, la rgle suivante permet dindiquer que la devise doit obligatoirement
apparatre et a pour seule valeur possible leuro.
1 <! ATTLIST objet devise CDATA # FIXED " Euro " >

Voici alors quelques exemple de documents XML possibles :


1 <! -- valide -- >
2 < objet devise = " Euro " / >
3
4 <! -- invalide -- >
5 < objet devise = " Dollar " / >
6
7 <! -- invalide -- >
8 < objet / >

52
LES ENTITS

Les entits
Une autre notion assez importante concernant le DTD est la notion dentit.

Dfinition
Une entit peut-tre considre comme un alias permettant de rutiliser des informa-
tions au sein du document XML ou de la dfinition DTD.
Au cours de ce chapitre, nous reviendrons sur les 3 types dentits qui existent : les
entits gnrales, les entits paramtres et les entits externes.

Les entits gnrales


Dfinition

Les entits gnrales sont les entits les plus simples. Elles permettent dassocier un
alias une information afin de lutiliser dans le document XML.

La syntaxe

Voyons tout de suite la syntaxe dune entit gnrale :


1 <! ENTITY nom " valeur " >

Pour utiliser une entit gnrale dans notre document XML, il suffit dutiliser la syntaxe
suivante :
1 & nom ;

Afin dillustrer un peu plus clairement mes propos, voyons tout de suite un exemple :
1 <! ENTITY samsung " Samsung " >
2 <! ENTITY apple " Apple " >
3
4 < telephone >
5 < marque >& samsung ; </ marque >
6 < modele > Galaxy S3 </ modele >
7 </ telephone >
8 < telephone >
9 < marque >& apple ; </ marque >
10 < modele > iPhone 4 </ modele >
11 </ telephone >

Au moment de son interprtation, les rfrences aux entits seront remplaces par leurs
valeurs respectives, ce qui donne une fois interprt :
1 < telephone >
2 < marque > Samsung </ marque >

53
CHAPITRE 7. DTD : LES ATTRIBUTS ET LES ENTITS

3 < modele > Galaxy S3 </ modele >


4 </ telephone >
5 < telephone >
6 < marque > Apple </ marque >
7 < modele > iPhone 4 </ modele >
8 </ telephone >

Les entits paramtres

Dfinition

Contrairement aux entits gnrales qui apparaissent dans les documents XML, les
entits paramtres napparaissent que dans les dfinitions DTD. Elles permettent
dassocier un alias une partie de la dclaration de la DTD.

La syntaxe

Voyons tout de suite la syntaxe dune entit paramtre :

1 <! ENTITY % nom " valeur " >

Pour utiliser une entit paramtre dans notre DTD, il suffit dutiliser la syntaxe sui-
vante :

1 % nom ;

Prenons par exemple ce cas o des tlphones ont pour attribut une marque :

1 < telephone marque = " Samsung " / >


2 < telephone marque = " Apple " / >

Normalement, pour indiquer que lattribut marque de la balise <telephone/> est obli-
gatoire et quil doit contenir la valeur Samnsung ou Apple, nous devons crire la rgle
suivante :

1 <! ATTLIST telephone marque ( Samsung | Apple ) # REQUIRED >

laide dune entit paramtre, cette mme rgle scrit de la faon suivante :

1 <! ENTITY % listeMarques " marque ( Samsung | Apple ) # REQUIRED " >
2 <! ATTLIST telephone % listeMarques ; >

Encore une fois, au moment de son interprtation, les rfrences aux entits seront
remplaces par leurs valeurs respectives.

54
LES ENTITS

Les entits externes


Dfinition

Il existe en ralit 2 types dentits externes : les analyses et les non analyses.
Dans le cadre de ce cours, nous nous limiterons aux entits externes analyses.
Les entits externes analyses ont sensiblement le mme rle que les entits g-
nrales, cest dire quelles permettent dassocier un alias une information afin de
lutiliser dans le document XML. Mais, dans le cas des entits externes analyses, les
informations sont stockes dans un fichier spar.

La syntaxe

Voyons tout de suite la syntaxe dune entit externe :


1 <! ENTITY nom SYSTEM " URI " >

Pour utiliser une entit externe dans notre XML, il suffit dutiliser la syntaxe suivante :
1 & nom ;

Si lon reprend notre premier exemple, voici ce que cela donne :


1 <! ENTITY samsung SYSTEM " samsung . xml " >
2 <! ENTITY apple SYSTEM " apple . xml " >
3
4 < telephone >
5 & samsung ;
6 < modele > Galaxy S3 </ modele >
7 </ telephone >
8 < telephone >
9 & apple ;
10 < modele > iPhone 4 </ modele >
11 </ telephone >

Le contenu des fichiers samsung.xml et apple.xml sera par exemple le suivant :


1 <! -- Contenu du fichier samsung . xml -- >
2 < marque > Samsung </ marque >
3
4 <! -- Contenu du fichier apple . xml -- >
5 < marque > Apple </ marque >

Au moment de son interprtation, les rfrences aux entits seront remplaces par leurs
valeurs respectives, ce qui donne une fois interprt :
1 < telephone >
2 < marque > Samsung </ marque >
3 < modele > Galaxy S3 </ modele >
4 </ telephone >
5 < telephone >

55
CHAPITRE 7. DTD : LES ATTRIBUTS ET LES ENTITS

6 < marque > Apple </ marque >


7 < modele > iPhone 4 </ modele >
8 </ telephone >

En rsum
Le mot clef ATTLIST permet dcrire les rgles relatives aux attributs dune balise.
Les entits permettent de jouer les fainants en rutilisant des lments qui re-
viennent souvent dans un document.

56
Chapitre 8
DTD : o les crire ?

Difficult :

Au cours des derniers chapitres, nous avons tudi tout ce quil faut savoir ou presque sur
les DTD. Il vous reste cependant encore une chose apprendre avant que vous puissiez
tre indpendant et passer la pratique : o crire les DTD ?
Ce dernier chapitre avant un TP sera galement loccasion de vous rvler quil existe en
ralit plusieurs sortes de DTD.

57
CHAPITRE 8. DTD : O LES CRIRE ?

Les DTD internes


Comme je vous lai dj prcis dans le premier chapitre de cette seconde partie, on
distingue 2 types de DTD : les internes et les externes.
Commenons par tudier les DTD internes.

Dfinition
Une DTD interne est une DTD qui est crite dans le mme fichier que le document
XML. Elle est gnralement spcifique au document XML dans lequel elle est crite.

La syntaxe
Une DTD interne scrit dans ce quon appelle le DOCTYPE. On le place sous le
prologue du document et au dessus du contenu XML.
Voyons plus prcisment la syntaxe :
1 <! DOCTYPE racine [ ] >

La DTD interne est ensuite crite entre les []. Dans ce DOCTYPE, le mot racine
doit tre remplac par le nom de la balise qui forme la racine du document XML.

Illustrons avec un exemple


Afin que tout cela vous paraisse moins abstrait, je vous propose de voir un exemple.
Prenons lnonc suivant :

Une boutique possde plusieurs tlphones. Chaque tlphone est dune


certaine marque et dun certain modle reprsent par une chane de carac-
tre.

Un document XML rpondant cet nonc peut tre le suivant :


1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2
3 < boutique >
4 < telephone >
5 < marque > Samsung </ marque >
6 < modele > Galaxy S3 </ modele >
7 </ telephone >
8
9 < telephone >
10 < marque > Apple </ marque >
11 < modele > iPhone 4 </ modele >
12 </ telephone >
13

58
LES DTD EXTERNES

14 < telephone >


15 < marque > Nokia </ marque >
16 < modele > Lumia 800 </ modele >
17 </ telephone >
18 </ boutique >

La dfinition DTD est la suivante :


1 <! ELEMENT boutique ( telephone *) >
2 <! ELEMENT telephone ( marque , modele ) >
3 <! ELEMENT marque (# PCDATA ) >
4 <! ELEMENT modele (# PCDATA ) >

Le document XML complet avec la DTD interne sera par consquent le suivant :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2
3 <! DOCTYPE boutique [
4 <! ELEMENT boutique ( telephone *) >
5 <! ELEMENT telephone ( marque , modele ) >
6 <! ELEMENT marque (# PCDATA ) >
7 <! ELEMENT modele (# PCDATA ) >
8 ]>
9
10 < boutique >
11 < telephone >
12 < marque > Samsung </ marque >
13 < modele > Galaxy S3 </ modele >
14 </ telephone >
15
16 < telephone >
17 < marque > Apple </ marque >
18 < modele > iPhone 4 </ modele >
19 </ telephone >
20
21 < telephone >
22 < marque > Nokia </ marque >
23 < modele > Lumia 800 </ modele >
24 </ telephone >
25 </ boutique >

Maintenant que vous savez ce quest une DTD interne, passons sans plus attendre
la DTD externe !

Les DTD externes


Dfinition
Une DTD externe est une DTD qui est crite dans un autre document que le do-
cument XML. Si elle est crite dans un autre document, cest que souvent, elle est

59
CHAPITRE 8. DTD : O LES CRIRE ?

commune plusieurs documents XML qui lexploitent.


De manire gnrale, afin de bien sparer le contenu XML de sa dfinition DTD, on
prendra lhabitude de crer plusieurs fichiers afin de les sparer.
Un fichier contenant uniquement une DTD porte lextension .dtd.

La syntaxe
Ltude de la syntaxe dune DTD externe est loccasion de vous rvler quil existe
en ralit 2 types de DTD : les DTD externes PUBLIC et les DTD externes SYS-
TEM.
Dans les 2 cas et comme pour une DTD interne, cest dans le DOCTYPE que cela se
passe.

Les DTD externes PUBLIC

Les DTD externes PUBLIC sont gnralement utilises lorsque la DTD est une
norme. Cest par exemple cas dans les documents xHTML 1.0.
La syntaxe est la suivante :
1 <! DOCTYPE racine PUBLIC " identifiant " " url " >

Si on lapplique un document xHTML, on obtient alors le DOCTYPE suivant :


1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1 . 0 Strict // EN " " http
:// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - strict . dtd " >

Pour tre honnte, nous nallons jamais utiliser les DTD externes PUBLIC dans ce
tutoriel, cest pourquoi je vous propose de passer immdiatement aux DTD externes
SYSTEM.

Les DTD externes SYSTEM

Une DTD externe SYSTEM permet dindiquer au document XML ladresse du


document DTD. Cette adresse peut-tre relative ou absolue.
Voyons plus prcisment la syntaxe :
1 <! DOCTYPE racine SYSTEM " URI " >

Afin dillustrer mes propos, je vous propose de reprendre lexemple de la boutique de


tlphone que jai utilis dans la partie sur la DTD interne.
Voici un rappel de lnonc :

Une boutique possde plusieurs tlphones. Chaque tlphone est dune


certaine marque et dun certain modle, tous les 2 reprsents par une
chane de caractre.

60
LES DTD EXTERNES

Pour rappel, voici le fichier XML :


1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2
3 < boutique >
4 < telephone >
5 < marque > Samsung </ marque >
6 < modele > Galaxy S3 </ modele >
7 </ telephone >
8
9 < telephone >
10 < marque > Apple </ marque >
11 < modele > iPhone 4 </ modele >
12 </ telephone >
13
14 < telephone >
15 < marque > Nokia </ marque >
16 < modele > Lumia 800 </ modele >
17 </ telephone >
18 </ boutique >

Si la DTD ne change pas, elle doit cependant tre place dans un fichier part, par
exemple le fichier doc1.dtd. Voici son contenu :
1 <! ELEMENT boutique ( telephone *) >
2 <! ELEMENT telephone ( marque , modele ) >
3 <! ELEMENT marque (# PCDATA ) >
4 <! ELEMENT modele (# PCDATA ) >

Le document XML complet avec la DTD externe sera alors le suivant (on part ici du
principe que le fichier XML et DTD sont stocks au mme endroit) :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2
3 <! DOCTYPE boutique SYSTEM " doc1 . dtd " >
4
5 < boutique >
6 < telephone >
7 < marque > Samsung </ marque >
8 < modele > Galaxy S3 </ modele >
9 </ telephone >
10
11 < telephone >
12 < marque > Apple </ marque >
13 < modele > iPhone 4 </ modele >
14 </ telephone >
15
16 < telephone >
17 < marque > Nokia </ marque >
18 < modele > Lumia 800 </ modele >
19 </ telephone >
20 </ boutique >

61
CHAPITRE 8. DTD : O LES CRIRE ?

Retour sur le prologue


Dans la partie prcdente de ce tutoriel, voici ce que je vous avais dit propos du fait
que nos documents XML soient autonomes ou non :

La dernire information prsente dans le prologue est standalone="yes".


Cette information permet de savoir si votre document XML est auto-
nome ou si un autre document lui est rattach.
Il est encore un peu tt pour vous en dire plus. Nous reviendrons sur
cette notion dans la partie 2 du tutoriel. Pour le moment, acceptez le fait
que nos documents sont tous autonomes.

Il est maintenant temps de lever le mystre !


Dans le cas dune DTD externe, nos documents XML ne sont plus autonomes, en effet,
ils font rfrence un autre fichier qui fournit la DTD. Afin que le document contenant
la DTD soit bien pris en compte, nous devons lindiquer en passant simplement la
valeur de lattribut standalone no .
Voici ce que cela donne :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " no " ? >
2
3 <! DOCTYPE boutique SYSTEM " doc1 . dtd " >
4
5 < boutique >
6 < telephone >
7 < marque > Samsung </ marque >
8 < modele > Galaxy S3 </ modele >
9 </ telephone >
10
11 < telephone >
12 < marque > Apple </ marque >
13 < modele > iPhone 4 </ modele >
14 </ telephone >
15
16 < telephone >
17 < marque > Nokia </ marque >
18 < modele > Lumia 800 </ modele >
19 </ telephone >
20 </ boutique >

Un exemple avec EditiX


Pour clore ce chapitre, je vous propose de voir ensemble comment crire une DTD ex-
terne SYSTEM avec EditiX. Pour faire simple, je vous propose de garder lexemple
prcdent de la boutique de tlphone.

62
UN EXEMPLE AVEC EDITIX

Cration du document XML


La cration du document XML na rien de bien compliqu puisque nous lavons
dj vu ensemble dans la partie prcdente. Pour ceux qui ne sen souviennent pas,
vous pouvez y jeter un coup dil la page 21.
Voici le document que vous devez crire :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " no " ? >
2
3 <! DOCTYPE boutique SYSTEM " boutique . dtd " >
4
5 < boutique >
6 < telephone >
7 < marque > Samsung </ marque >
8 < modele > Galaxy S3 </ modele >
9 </ telephone >
10
11 < telephone >
12 < marque > Apple </ marque >
13 < modele > iPhone 4 </ modele >
14 </ telephone >
15
16 < telephone >
17 < marque > Nokia </ marque >
18 < modele > Lumia 800 </ modele >
19 </ telephone >
20 </ boutique >

Si vous essayez de lancer la vrification du document, vous devriez normalement obtenir


un message derreur, comme celui indiqu la figure 8.1.

Figure 8.1 Message derreur indiquant que le document DTD est introuvable

Ce message est, pour le moment, compltement normal puisque nous navons pas encore
cr notre document DTD.

Cration du document DTD


Pour crer un nouveau document, vous pouvez cliquer sur licne visible la figure 8.2,
slectionner
  dans la barre de menu File puis New ou encore utiliser le raccourci clavier
Ctrl  N .
+
Dans la liste qui saffiche, slectionnez DTD (voir la figure 8.3).
Votre document DTD nest normalement pas vierge. Voici ce que vous devriez avoir :

63
CHAPITRE 8. DTD : O LES CRIRE ?

Figure 8.2 Nouveau document

Figure 8.3 Cration dun document DTD

1 <! -- DTD created at Wed Sep 12 14 : 49 : 47 CEST 2012 with EditiX .


Please insert an encoding attribute header for converting
any DTD -- >
2
3 <! ELEMENT tag (# PCDATA ) >
4 <! ATTLIST tag attribute CDATA # REQUIRED >

Replacez le contenu par notre vritable DTD :


1 <! ELEMENT boutique ( telephone *) >
2 <! ELEMENT telephone ( marque , modele ) >
3 <! ELEMENT marque (# PCDATA ) >
4 <! ELEMENT modele (# PCDATA ) >

Enregistrez ensuite votre document avec le nom boutique.dtd au mme endroit que
votre document XML.

Vrification de la DTD
Vous pouvez vrifier que votre DTD na pas derreur de syntaxe en cliquant sur licne
visible la figure 8.4 ou bien en slectionnant dans la barre de menu DTD/Schema puis
Check this DTD ou encore en utilisant le raccourci clavier Ctrl + K .

Figure 8.4 Vrification de la syntaxe

64
UN EXEMPLE AVEC EDITIX

Vous devriez normalement avoir un message dinformation (voir figure 8.5).

Figure 8.5 Message indiquant que le document DTD est correcte

Vrification du document XML


Il est maintenant temps de vrifier que le document XML est valide !
Pour ce faire, slectionnez dans la barre de menu XML puis Check this document ou
encore en utilisant le raccourci clavier Ctrl + K .
Le message visible la figure 26.4 doit normalement safficher.

Figure 8.6 Message indiquant que le document XML est valide

En rsum
Les DTD internes scrivent dans le document XML.
Les DTD externes scrivent dans un fichier diffrent de celui du document XML
dont lextension est .dtd.
EditiX permet en quelque cliques de vrifier quun document DTD est correct et
quun document XML est valide.

65
CHAPITRE 8. DTD : O LES CRIRE ?

66
Chapitre 9
TP : dfinition DTD dun rpertoire

Difficult :

Votre apprentissage des DTD arrive donc son terme et rien ne vaut un TP pour le
conclure ! Je vous propose donc de raliser la dfinition DTD dun rpertoire. Lobjectif est
de mettre en pratique toutes les notions vues dans les parties prcdentes sur les DTD.

67
CHAPITRE 9. TP : DFINITION DTD DUN RPERTOIRE

Lnonc
Le but de ce TP est de crer la DTD du rpertoire labor dans le premier TP.
Pour rappel, voici les informations que lon souhaite connatre pour chaque personne :
Son sexe (homme ou femme).
Son nom.
Son prnom.
Son adresse.
Un ou plusieurs numros de tlphone (tlphone portable, fixe, bureau, etc.).
Une ou plusieurs adresses e-mail (adresse personnelle, professionnelle, etc.).
Voici le document XML que nous avions construit :

1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2
3 < repertoire >
4 <! -- John DOE -- >
5 < personne sexe = " masculin " >
6 < nom > DOE </ nom >
7 < prenom > John </ prenom >
8 < adresse >
9 < numero >7 </ numero >
10 < voie type = " impasse " > impasse du chemin </ voie >
11 < codePostal > 75015 </ codePostal >
12 < ville > PARIS </ ville >
13 < pays > FRANCE </ pays >
14 </ adresse >
15 < telephones >
16 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
17 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
18 </ telephones >
19 < emails >
20 < email type = " personnel " > john . doe@wanadoo . fr </ email >
21 < email type = " professionnel " > john . doe@societe . com </
email >
22 </ emails >
23 </ personne >
24
25 <! -- Marie POPPINS -- >
26 < personne sexe = " feminin " >
27 < nom > POPPINS </ nom >
28 < prenom > Marie </ prenom >
29 < adresse >
30 < numero > 28 </ numero >
31 < voie type = " avenue " > avenue de la r publique </ voie >
32 < codePostal > 13005 </ codePostal >
33 < ville > MARSEILLE </ ville >
34 < pays > FRANCE </ pays >

68
UNE SOLUTION

35 </ adresse >


36 < telephones >
37 < telephone type = " bureau " > 04 05 06 07 08 </ telephone >
38 </ telephones >
39 < emails >
40 < email type = " professionnel " > contact@poppins . fr </
email >
41 </ emails >
42 </ personne >
43 </ repertoire >

Une dernire consigne : la DTD doit tre une DTD externe !

Une solution
Une fois de plus, je vous fais part de ma solution !
Le fichier XML avec le DOCTYPE :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " no " ? >
2
3 <! DOCTYPE repertoire SYSTEM " repertoire . dtd " >
4
5 < repertoire >
6 <! -- John DOE -- >
7 < personne sexe = " masculin " >
8 < nom > DOE </ nom >
9 < prenom > John </ prenom >
10 < adresse >
11 < numero >7 </ numero >
12 < voie type = " impasse " > impasse du chemin </ voie >
13 < codePostal > 75015 </ codePostal >
14 < ville > PARIS </ ville >
15 < pays > FRANCE </ pays >
16 </ adresse >
17 < telephones >
18 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
19 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
20 </ telephones >
21 < emails >
22 < email type = " personnel " > john . doe@wanadoo . fr </ email >
23 < email type = " professionnel " > john . doe@societe . com </
email >
24 </ emails >
25 </ personne >
26
27 <! -- Marie POPPINS -- >
28 < personne sexe = " feminin " >
29 < nom > POPPINS </ nom >

69
CHAPITRE 9. TP : DFINITION DTD DUN RPERTOIRE

30 < prenom > Marie </ prenom >


31 < adresse >
32 < numero > 28 </ numero >
33 < voie type = " avenue " > avenue de la r publique </ voie >
34 < codePostal > 13005 </ codePostal >
35 < ville > MARSEILLE </ ville >
36 < pays > FRANCE </ pays >
37 </ adresse >
38 < telephones >
39 < telephone type = " professionnel " > 04 05 06 07 08 </
telephone >
40 </ telephones >
41 < emails >
42 < email type = " professionnel " > contact@poppins . fr </
email >
43 </ emails >
44 </ personne >
45 </ repertoire >

Le fichier DTD :
1 <! -- Racine -- >
2 <! ELEMENT repertoire ( personne *) >
3
4 <! -- Personne -- >
5 <! ELEMENT personne ( nom , prenom , adresse , telephones , emails ) >
6 <! ATTLIST personne sexe ( masculin | feminin ) # REQUIRED >
7
8 <! -- Nom et pr nom -- >
9 <! ELEMENT nom (# PCDATA ) >
10 <! ELEMENT prenom (# PCDATA ) >
11
12 <! -- Bloc adresse -- >
13 <! ELEMENT adresse ( numero , voie , codePostal , ville , pays ) >
14 <! ELEMENT numero (# PCDATA ) >
15
16 <! ELEMENT voie (# PCDATA ) >
17 <! ATTLIST voie type CDATA # REQUIRED >
18
19 <! ELEMENT codePostal (# PCDATA ) >
20 <! ELEMENT ville (# PCDATA ) >
21 <! ELEMENT pays (# PCDATA ) >
22
23 <! -- Bloc t l phone -- >
24 <! ELEMENT telephones ( telephone +) >
25 <! ELEMENT telephone (# PCDATA ) >
26 <! ATTLIST telephone type CDATA # REQUIRED >
27
28 <! -- Bloc email -- >
29 <! ELEMENT emails ( email +) >
30 <! ELEMENT email (# PCDATA ) >

70
UNE SOLUTION

31 <! ATTLIST email type CDATA # REQUIRED >



Copier la correction
B
Code web : 786477

Un bref commentaire
Dans cette solution, je suis all au plus simple en indiquant que pour les types de
tlphones, de-mails et de voies, jaccepte toutes les chanes de caractres. Libre
vous de crer de nouvelles rgles si vous souhaitez que, par exemple, le choix du type
de la voie ne soit possible quentre rue, avenue, impasse, etc.

71
CHAPITRE 9. TP : DFINITION DTD DUN RPERTOIRE

72
Chapitre 10
Schma XML : introduction

Difficult :

Dans les chapitres prcdents, nous avons tudi lune des technologies permettant dcrire
les dfinitions de documents XML : les DTD. Mais, comme je vous le disais dans le
tout premier chapitre, une autre technologie permet elle aussi dcrire des dfinitions : les
Schmas XML.
Cette seconde technologie offre davantage de possibilits que les DTD, il va donc falloir
vous accrocher !

73
CHAPITRE 10. SCHMA XML : INTRODUCTION

Les dfauts des DTD


Peut-tre lavez vous remarqu dans les prcdents chapitres, mais les DTD ont quelques
dfauts.

Un nouveau format

Tout dabord, les DTD ne sont pas au format XML. Nous avons d apprendre un
nouveau langage avec sa propre syntaxe et ses propres rgles.
La principale consquence est que, pour exploiter une DTD, nous allons tre oblig
dutiliser un outil diffrent de celui qui exploite un fichier XML. Il est vrai que dans
notre cas, nous avons utilis le mme outil, savoir EditiX, mais vos futurs pro-
grammes, logiciels ou applications mobiles devront forcment exploiter la DTD et le
fichier XML diffremment, laide, par exemple, dune API diffrente.

Le typage de donnes

Le second dfaut que lon retiendra dans ce cours est que les DTD ne permettent pas
de typer des donnes. Comme vous avez pu le voir, on se contente dindiquer quune
balise contient des donnes, mais impossible de prciser si lon souhaite que a soit un
nombre entier, un nombre dcimal, une date, une chane de caractres, etc.

Les apports des schmas XML


Cest pour pallier les dfauts des DTD que les Schmas XML ont t crs. Sils pro-
posent au minimum les mmes fonctionnalits que les DTD, ils en apportent galement
de nouvelles. En voici quelques unes ple-mle.

Le typage des donnes

Les Schmas XML permettent tout dabord de typer les donnes. Nous verrons ga-
lement dans la suite de ce tutoriel, quil est possible daller plus loin en crant nos
propres types de donnes.

Les contraintes

Nous dcouvrirons aussi que les Schmas XML permettent dtre beaucoup plus pr-
cis que les DTD lors de lcriture des diffrentes contraintes qui rgissent un document
XML.

74
STRUCTURE DUN SCHMA XML

Des dfinitions XML


Un des principaux avantages des Schmas XML est quils scrivent grce au XML.
Ainsi, pour exploiter un document XML et le Schma qui lui est associ, vous navez
en thorie plus besoin de plusieurs outils. Dornavant un seul suffit !

Structure dun schma XML


Maintenant que vous en savez un peu plus sur les Schmas XML, je vous propose de
voir les bases qui permettent de dfinir un Schma XML.

Lextension du fichier
Comme pour les DTD, nous prendrons lhabitude de sparer les donnes formates
avec XML et le Schma XML associ dans 2 fichiers distincts.
Bien que cest les Schmas XML soient crits avec un langage de type XML, le fichier na
pas cette extension. Un fichier dans lequel est crit un Schma XML porte lextension
.xsd .

Le prologue
Puisque cest le XML qui est utilis, il ne faut pas droger la rgle du prologue.
Ainsi, la premire ligne dun Schma XML est :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >

Je ne dtaille pas ici les diffrents lments du prologue puisque je lai dj fait lors
de la premire partie dans le chapitre traitant de la structure dun document XML. Si
vous avez des doutes, je vous encourage vivement relire cette partie !

Le corps
Comme pour un fichier XML classique, le corps dun Schma XML est constitu
dun ensemble de balises dont nous verrons le rle dans les prochains chapitres.
Cependant, une chose ne change pas : la prsence dun lment racine, cest--dire
la prsence dune balise qui contient toutes les autres. Mais, contrairement un fichier
XML, son nom nous est impos.
1 <! -- Prologue -- >
2 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
3
4 <! -- El ment racine -- >
5 < xsd : schema xmlns : xsd = " http :// www . w3 . org / 2001 / XMLSchema " >
6

75
CHAPITRE 10. SCHMA XML : INTRODUCTION

7 </ xsd : schema >

Comme vous pouvez le voir dans le code prcdent, llment racine est <xsd:schema
/>.
Si lon regarde de plus prt, on remarque la prsence de lattribut xmlns :xsd. xmlns
nous permet de dclarer un espace de noms. Si ce vocabulaire ne vous parle pas, je
vous encourage lire le chapitre ddi cette notion en annexe de ce tutoriel.
A travers la dclaration de cet espace de noms, tous les lments doivent commencer
par xsd :.

Rfrencer un schma XML


Le rfrencement dun schma XML se fait au niveau de llment racine du fichier
XML grce lutilisation de 2 attributs.

Lespace de noms
1 xmlns : xsi = " http :// www . w3 . org / 2001 / XMLSchema - instance "

La location
Le second attribut nous permet dindiquer notre fichier XML o se situe le fichier
contenant le Schma XML.
2 possibilits soffrent alors nous : les schmas XML qui dcrivent un espace de noms
et ceux qui ne dcrivent pas un espace de noms.

Schma XML dcrivant un espace de noms

1 xsi : schemaLocation = " chemin_vers_fichier . xsd " >

Schma XML ne dcrivant pas un espace de noms

Dans les prochains chapitre, cest ce type de Schma XML que nous allons utiliser.
On utilisera alors la syntaxe suivante :
1 xsi : n o N a m es p a c e S c h e m a Lo c a t i o n = " chemin_vers_fichier . xsd " >

Pour rsumer
Pour rsumer, voici ce quoi nos fichiers XML ressembleront :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2

76
RFRENCER UN SCHMA XML

3 < racine xmlns : xsi = " http :// www . w3 . org / 2001 / XMLSchema - instance "
4 xsi : n o N a m e sp a c e S c h e m a Lo c a t i o n = " chemin_vers_fichier . xsd "
>
5
6 </ racine >

En rsum
Les Schmas XML offrent plus de possibilits que les DTD.
Les Schmas XML scrivent laide dun langage de type XML.
Un fichier dans lequel est crit un Schma XML porte lextension .xsd .

77
CHAPITRE 10. SCHMA XML : INTRODUCTION

78
Chapitre 11
Schma XML : les lments simples

Difficult :

Dans le chapitre prcdent, nous avons vu que les Schmas XML permettent de pallier
les faiblesses des DTD. Aprs avoir galement vu la structure dun Schma XML, je vous
propose daborder lcriture dun Schma XML proprement parler.
La premire notion que nous allons aborder ce que lon appelle les lments simples.

79
CHAPITRE 11. SCHMA XML : LES LMENTS SIMPLES

Les lments simples


Dfinition
Un lment simple est un lment qui ne contient quune valeur dont le type est dit
simple. Il ne contient pas dautres lments.
Un lment simple peut donc tre une balise qui ne contient aucun attribut et dans
laquelle aucune autre balise nest imbrique. Un attribut dune balise peut galement
tre considr comme un lment simple. En effet, la valeur dun attribut est un type
simple.
Nous verrons la liste complte des types simples un peu plus loin dans ce tutoriel, mais
je peux dj vous citer quelques exemple afin de tenter dclaircir les choses. Un type
simple, cest par exemple un chiffre, une date ou encore une chane de caractres.

Quelques exemples
Prenons quelques exemples de fichiers XML, et regardons ensemble sils peuvent tre
considrs comme des types simples :
1 <! -- Ne contient ni attribut ni aucun autre l ment = > l ment
simple -- >
2 < nom > ROBERT </ nom >
3
4 <! -- Contient un attribut = > n ' est pas un l ment simple -->
5 <! - - Cependant l ' attribut " sexe " est un l ment simple -- >
6 < personne sexe = " masculin " > Robert DUPONT </ personne >
7
8 <! -- La balise personne contient d ' autres l ments ( les balises
nom et pr nom ) = > n ' est pas un l ment simple -- >
9 < personne >
10 <! -- Ne contient ni attribut ni aucun autre l ment = > l
ment simple -- >
11 < nom > DUPONT </ nom >
12
13 <! -- Ne contient ni attribut ni aucun autre l ment = > l
ment simple -- >
14 < prenom > Robert </ prenom >
15 </ personne >

Jespre que ces exemples vous permettent de mieux comprendre ce quest un lment
simple.

Dclarer une balise comme un lment simple


Si vous souhaitez dclarer une balise en tant qulment simple, cest le mot clef
element quil faut utiliser. Noubliez pas de prcder son utilisation par xsd :

80
LES LMENTS SIMPLES

Cette balise prend 2 attributs : un nom et un type.


1 < xsd : element name = " mon_nom " type = " xsd : mon_type " / >

Voyons tout de suite un exemple. Soit les lments simples suivants :


1 < nom > DUPONT </ nom >
2 < prenom > Robert </ prenom >
3 < age > 38 </ age >

Au sein dun Schma XML, les lments prcdents seront dclars de la sorte :
1 < xsd : element name = " nom " type = " xsd : string " / >
2 < xsd : element name = " prenom " type = " xsd : string " / >
3 < xsd : element name = " age " type = " xsd : int " / >

Que sont ces int et ces strings ?

String est utilis pour qualifier une chane de caractres et int est utilis pour
qualifier un nombre entier.
La liste complte des types quil est possible dutiliser est fournie un peu plus loin dans
ce tutoriel.

Valeur par dfaut et valeur inchangeable


Avant que lon regarde ensemble la liste des types, jaimerais revenir sur 2 concepts qui
sont les valeurs par dfaut et les valeurs inchangeables.

Valeur par dfaut

Comme ctait dj le cas dans les DTD, il est tout fait possible dindiquer dans
les Schmas XML quun lment a une valeur par dfaut. Pour rappel, la valeur par
dfaut est la valeur que va prendre automatiquement un lment si aucune valeur nest
indique au niveau du fichier XML.
Pour indiquer une valeur par dfaut, cest lattribut default qui est utilis au niveau
de la balise <element /> du Schma XML. Par exemple, si je souhaite indiquer qu
dfaut dtre renseign, le prnom dune personne est Robert, je vais crire la rgle
suivante :
1 < xsd : element name = " prenom " type = " xsd : string " default = " Robert " /
>

Voici alors quelques exemple de documents XML possibles :


1 <! -- valide -- >
2 < prenom > Jean </ prenom >

81
CHAPITRE 11. SCHMA XML : LES LMENTS SIMPLES

3
4 <! -- valide -- >
5 < prenom > Marie </ prenom >
6
7 <! -- valide -- >
8 <! -- la balise prenom vaut " Robert " -- >
9 < prenom / >

Valeur constante

Sil est possible dindiquer une valeur par dfaut, il est galement possible dimposer
une valeur. Cette valeur inchangeable est appele constante.
Pour indiquer une valeur constante, cest lattribut fixed qui est utilis au niveau de
la balise <element /> du Schma XML. Par exemple, si je souhaite obliger toute les
personnes de mon document XML porter le prnom Robert, voici la rgle crire :
1 < xsd : element name = " prenom " type = " xsd : string " fixed = " Robert " / >

Voyons alors la validit des lignes XML suivantes :


1 <! -- valide -- >
2 < prenom > Robert </ prenom >
3
4 <! -- invalide -- >
5 < prenom > Marie </ prenom >
6
7 <! -- invalide -- >
8 < prenom / >

Les attributs
Comme je vous le disais un peu plus tt dans ce tutoriel, dans un Schma XML, tous
les attributs dune balise XML sont considrs comme des lments simples. En
effet, ils ne peuvent prendre comme valeur quun type simple, cest--dire un nombre,
une chane de caractre, une date, etc.

Dclarer un attribut
Bien quun attribut soit un lment simple, nous nallons pas utiliser le mot clef
element pour dclarer un attribut. Cest le mot attribut qui est utilis. Encore une
fois, noubliez pas de faire prcder son utilisation par xsd :
Cette balise prend 2 attributs : un nom et un type.
1 < xsd : attribut name = " mon_nom " type = " xsd : mon_type " / >

Prenons par exemple la ligne XML suivante :

82
LES ATTRIBUTS

1 < personne sexe = " masculin " > Robert DUPONT </ personne >

Je ne vais pas dtailler ici comment dclarer la balise. En effet, puisquelle contient un
attribut, cest ce quon appelle un lment complexe et nous verrons comment faire
un peu plus tard. Cependant, voici comment dclarer lattribut dans notre Schma
XML :
1 < xsd : attribut name = " sexe " type = " xsd : string " / >

Valeur par dfaut, obligatoire et inchangeable


Valeur par dfaut

Comme ctait dj le cas dans les DTD, il est tout fait possible dindiquer dans
les Schmas XML quun attribut a une valeur par dfaut. Pour rappel, la valeur
par dfaut est la valeur prise automatiquement par un attribut si aucune valeur nest
indique au niveau du fichier XML.
Pour indiquer une valeur par dfaut, cest lattribut default qui est utilis au niveau
de la balise <attribut /> du Schma XML. Par exemple, si je souhaite indiquer qu
dfaut dtre renseign, le prnom dune personne est Robert, je vais crire la rgle
suivante :
1 < xsd : attribut name = " prenom " type = " xsd : string " default = " Robert "
/>

Valeur constante

Sil est possible dindiquer une valeur par dfaut, il est galement possible dimposer
une valeur. Cette valeur inchangeable est appele constante.
Pour indiquer une valeur constante, cest lattribut fixed qui est utilis au niveau de
la balise <attribut /> du Schma XML. Par exemple, si je souhaite obliger toutes les
personnes de mon document XML porter le prnom Robert, voici la rgle crire :
1 < xsd : attribut name = " prenom " type = " xsd : string " fixed = " Robert " / >

Attribut obligatoire

Tels que nous les dclarons depuis le dbut de ce chapitre, les attributs sont, par dfaut,
optionnels.
Pour indiquer quun attribut est obligatoire, nous devons renseigner la proprit use
laquelle nous affectons la valeur required. Par exemple, si je souhaite obliger lutilisa-
tion de lattribut prenom, voici la rgle crire :
1 < xsd : attribut name = " prenom " type = " xsd : string " use = " required " / >

83
CHAPITRE 11. SCHMA XML : LES LMENTS SIMPLES

En rsum
Un lment simple est un lment qui ne contient quune valeur dont le type est
dit simple comme par exemple une balise qui ne contient aucun attribut et dans
laquelle aucune autre balise nest imbrique.
Pour dcrire un lment simple, on utilise la balise <xsd:element />.
Il est possible de dfinir une valeur par dfaut ou une valeur constante un lment
simple.
Un attribut est galement un lment simple.
Pour dcrire un attribut, on utilise la balise <xsd:attribut />.
Il est possible de dfinir une valeur par dfaut, une valeur constante un lment
simple ou rendre obligatoire un attribut.

84
Chapitre 12
Schma XML : les types simples

Difficult :

Dans le chapitre prcdent, nous avons vu comment dcrire les lments simples et les
attributs. Nous avons galement appris que les valeurs possibles sont des valeurs dites de
types simples comme par exemple un nombre entier ou une chane de caractres.
Dans ce chapitre, nous allons voir en dtails les 4 grandes catgories des types simples,
savoir les les chanes de caractres, les dates et les nombres. Ils manque une catgorie,
me direz-vous. Vous avez raison ! Une quatrime catgorie intitule divers , regroupe
les autres types simples quil est possible dutiliser.

85
CHAPITRE 12. SCHMA XML : LES TYPES SIMPLES

Les types chanes de caractres

Le tableau rcapitulatif

Type Description Commentaire


string reprsente une chane de carac- attention aux caractres
tres spciaux
normalizedString reprsente une chane de carac- bas sur le type string
tres normalise
token reprsente une chane de carac- bas sur le type normali-
tres normalise sans espace au zedString
dbut et la fin
language reprsente le code dune langue bas sur le type token
NMTOKEN reprsente une chane de carac- bas sur le type token ap-
tre "simple" plicable uniquement aux
attributs
NMTOKENS reprsente une liste de NMTO- applicable uniquement
KEN aux attributs
Name reprsente un nom XML bas sur le type token
NCName reprsente un nom XML sans le bas sur le type Name
caractre :
ID reprsente un identifiant unique bas sur le type NC-
Name applicable unique-
ment aux attributs
IDREF rfrence un identifiant bas sur le type NC-
Name applicable unique-
ment aux attributs
IDREFS rfrence une liste didentifiants applicable uniquement
aux attributs
ENTITY reprsente une entit dun docu- bas sur le type NC-
ment DTD Name applicable unique-
ment aux attributs
ENTITIES reprsente une liste dentits applicable uniquement
aux attributs

Plus en dtails
Le type string

Le type string est lun des premiers types que nous ayons vu ensemble. Il reprsente
une chane de caractres et peut donc contenir un peu tout et nimporte quoi. Il est
cependant important de noter que certains caractres spciaux comme le & doivent
tre crits avec leur notation HTML.

86
LES TYPES CHANES DE CARACTRES

Une liste des caractres spciaux et de leur notation HTML est disponible sur le site
de CommentaMarche.

Voir la liste
B
Code web : 888700


Bien que nous ayons dj vu plusieurs exemples ensemble, je vous en propose un nou-
veau afin que ce type nait plus aucun secret pour vous. Soit la rgle de Schma XML
suivante :
1 < xsd : element name = " string " type = " xsd : string " / >

Les diffrentes lignes XML ci-dessous sont alors valides :


1 < string > France </ string >
2
3 < string > Site du z ro ! </ string >
4
5 < string >& </ string >

Le type normalizedString

Le type normalizedString est bas sur le type string et reprsente une chane de
caractres normalise, cest--dire, une chane de caractres qui peut contenir tout et
nimporte quoi lexception de tabulations, de sauts de ligne et de retours chariot.
Dans la pratique, il nest pas interdit de les crire, mais ils seront automatiquement
remplacs par des espaces.
Puisque le type normalizedString est bas sur le type string, toutes les rgles du type
string sapplique galement au type normalizedString. Ainsi, les caractres spciaux
comme le & doivent tre crits avec leur notation HTML.
Je ne le prciserai pas chaque fois, mais cette rgle est toujours vraie. Un type hrite
toujours de toutes les rgles du type sur lequel il se base.

Le type token

Le type token est bas sur le type normalizedString et reprsente une chane de
caractres normalise sans espace au dbut ni la fin. Une nouvelle fois, dans la pra-
tique, il nest pas interdit de les crire. Les espaces prsents au dbut et la fin seront
automatiquement supprims.

Le type language

Le type language est bas sur le type token et reprsente, comme son nom le laisse
deviner, une langue. Cette langue doit tre identifie par 2 lettres (selon la norme ISO
639). Ces 2 caractres peuvent ventuellement tre suivi dun code pays (selon la norme
ISO 3166).
Considrons la rgle suivante :

87
CHAPITRE 12. SCHMA XML : LES TYPES SIMPLES

1 < xsd : element name = " langue " type = " xsd : language " / >

Les diffrentes lignes XML ci-dessous sont alors valides :


1 < langue > fr </ langue >
2
3 < langue > en </ langue >
4
5 < langue >en - GB </ langue >
6
7 < langue >en - US </ langue >

Le type NMTOKEN

Le type NMTOKEN est bas sur le type token et reprsente une chane de caractres
simp le", c est--dire une chane de caractres sans espace qui ne contient que les
symboles suivants :
Des lettres.
Des chiffres.
Les caractres spciaux . - _ et :
Si la chane de caractres contient des espaces au dbut ou la fin, ils seront automa-
tiquement supprims.
Afin dassurer une compatibilit entre les Schmas XML et les DTD, il convient de
nutiliser le type NMTOKEN que pour un attribut.

Le type NMTOKENS

Le type NMTOKENS reprsente une liste de NMTOKEN spars par un espace.


Une nouvelle fois, afin dassurer une compatibilit entre les Schmas XML et les DTD,
il convient de nutiliser le type NMTOKENS seulement pour un attribut.
Soit la rgle suivante issue dun Schma XML :
1 < xsd : attribut name = " liste " type = " xsd : NMTOKENS " / >

Les diffrentes lignes XML ci-dessous sont alors valides :


1 < balise list = " A : 1_B C - 2 . " > contenu de la balise </ balise >
2
3 < balise list = " AZERTY 123456 QSDFGH " > contenu de la balise </
balise >

Le type Name

Le type Name est bas sur le type token et reprsente un nom XML, cest--dire
une chane de caractres sans espace qui ne contient que les symboles suivants :

88
LES TYPES CHANES DE CARACTRES

Des lettres.
Des chiffres.
Les caractres spciaux . - _ et :
La diffrence avec le type NMTOKEN est quune chane de caractres de type Name
doit obligatoirement commencer par une lettre, ou lun des 2 caractres spciaux sui-
vants : _ et :

Le type NCName

Le type NCName est bas sur le type Name. Il hrite donc de toutes les rgles du
type Name auxquelles une nouvelle rgles doit tre ajoute : le type NCName ne
peut pas contenir le caractre spcial :

Le type ID

Le type ID est bas sur le type NCName, il hrite donc de toutes les rgles de ce
type. Comme son nom le laisse deviner, un ID reprsente un identifiant. Il doit donc
contenir des valeurs uniques. A ce titre, il est impossible de lui dfinir une valeur fixe
ou par dfaut.
Comme pour dautres types vu prcdemment, un ID ne doit tre utilis quavec les
attributs afin dassurer une compatibilit entre les Schmas XML et les DTD.

Le type IDREF

Le type IDREF fait rfrence un ID existant dans le document XML. Tout comme
le type ID, il est bas sur le type NCName et hrite donc de toutes les rgles de ce
type. Puisque le type ID nest utilisable quavec des attributs, il en est naturellement
de mme pour le type IDREF.

Le type IDREFS

Si le type NMTOKENS reprsente une liste de NMTOKEN spars par un espace,


le type IDREFS reprsente lui une liste de IDREF spars par un espace.
Afin dassurer une compatibilit entre les Schmas XML et les DTD, il convient de
nutiliser le type IDREFS que pour un attribut.
Illustrons son utilisation avec un exemple :
1 < xsd : attribut name = " enfants " type = " xsd : IDREFS " / >

1 < personne num = " P1 " > Paul </ personne >
2 < personne num = " P2 " > Marie </ personne >
3
4 < personne enfants = " P1 P2 " > Jeanne </ personne

89
CHAPITRE 12. SCHMA XML : LES TYPES SIMPLES

Le type ENTITY

Le type ENTITY permet de faire rfrence une entit le plus souvent non XML et
dclar dans des fichiers DTD. Ce type est bas sur le type NCName, il hrite donc
de toutes ses rgles.
Une nouvelle fois, afin dassurer une compatibilit entre les Schmas XML et les DTD,
il convient de nutiliser le type ENTITY que pour un attribut.
Une nouvelle fois, je vous propose dillustrer son utilisation par un exemple :

1 < xsd : attribut name = " marque " type = " xsd : ENTITY " / >

1 <! ENTITY samsung " Samsung " >


2 <! ENTITY apple " Apple " >
3
4 < telephone marque = " apple " > iPhone </ personne >
5 < telephone marque = " samsung " > Galaxy SII </ personne >

Le type ENTITIES

Finalement, le dernier type que nous verrons dans cette catgorie est le type ENTI-
TIES. Il permet de faire rfrence une liste dENTITY spars par un espace.
Puisque ctait dj le cas pour le type ENTITY, le type ENTITIES nchappe pas
la rgle et ne doit tre utilis quavec un attribut.

Les types dates

Le tableau rcapitulatif

Type Description
duration reprsente une dure
date reprsente une date
time reprsente une heure
dateTime reprsente une date et un temps
gYear reprsente une anne
gYearMonth reprsente une anne et un mois
gMonth reprsente un mois
gMonthDay reprsente un mois et un jour
gDay reprsente un jour

90
LES TYPES DATES

Plus en dtails
Le type duration

Le type duration, comme son nom le laisse deviner, reprsente une dure. Cette dure
sexprime en nombre dannes, de mois, de jours, dheures, de minutes et de secondes
selon une expression qui nest pas des plus simples savoir PnYnMnDTnHnMnS.
Je vous propose de la dcortiquer :
P marque le dbut de lexpression.
nY reprsente le nombre dannes (year) o n est un nombre entier.
nM reprsente le nombre de mois (month) o n est un nombre entier.
nD reprsente le nombre de jours (day) o n est un nombre entier.
T permet de sparer la partie date de lexpression de sa partie heure.
nH reprsente le nombre dheures (hour) o n est un nombre entier.
nM reprsente le nombre de minutes (minute) o n est un nombre entier.
nS reprsente le nombre de secondes (second) o n est un nombre entier ou dcimal.
Lexpression peut-tre prcd du signe - dans le cas o lon souhaite exprimer une dure
ngative. Bien videmment, tous les champs ne doivent pas forcment tre renseigns.
Ainsi, il est possible de ne renseigner que les heures, les minutes, etc. Dans le cas o
lexpression nexprime quune date, le symbole T ne doit plus figurer.
Je vous accorde que toutes ces rgles ne sont pas facile assimiler, cest pourquoi je
vous propose de voir quelques exemples :
1 < xsd : element name = " duree " type = " xsd : duration " / >

1 <! -- 42 ans et 6 minutes -- >


2 < duree > P42YT6M </ duree >
3
4 <! -- -2 heures -- >
5 < duree > - PT2H </ duree >
6
7 <! -- 2 jours -- >
8 < duree > P2D </ duree >
9
10 <! -- 10 . 5 secondes -- >
11 < duree > PT10 . 5S </ duree >

Le type date

Le type date permet dexprimer une date. A limage du type duration, une date
sexprime selon une expression bien spcifique savoir YYYY-MM-DD.
Une nouvelle fois, je vous propose de dcortiquer tout a :
YYYY reprsente lanne (year) sur 4 chiffres ou plus.
MM reprsente le mois (month) sur 2 chiffres.
DD reprsente le jour (day) galement sur 2 chiffres.

91
CHAPITRE 12. SCHMA XML : LES TYPES SIMPLES

Dans le cas o lon souhaite exprimer une date avant Jsus-Christ, un signe - peut-tre
plac devant lexpression.
Voyons ensemble quelques exemples :
1 < xsd : element name = " madate " type = " xsd : date " / >

1 <! -- 13 janvier 1924 -- >


2 < madate > 1924 - 01 - 13 </ madate >
3
4 <! -- 12 d cembre 34 avant JC -- >
5 < madate > - 0034 - 12 - 12 </ madate >
6
7 <! -- 4 novembre 12405 -- >
8 < madate > 12405 - 11 - 04 </ madate >

Le type time

Le type time permet dexprimer une heure. Encore une fois, une expression bien sp-
cifique doit tre respecte : hh :mm :ss.
Pour continuer avec nos bonnes habitudes, dcortiquons ensemble cette expression :
hh reprsente les heures (hour) sur 2 chiffres.
mm reprsente les minutes (minute) sur 2 chiffres.
ss reprsente les secondes (second) sur 2 chiffres entiers ou virgule.
Voici quelques exemples :
1 < xsd : element name = " monheure " type = " xsd : time " / >

1 <! -- 10 heures et 24 minutes -- >


2 < monheure > 10 : 24 : 00 </ monheure >
3
4 <! -- 2 , 5 secondes -- >
5 < monheure > 00 : 00 : 02 . 5 </ monheure >

Le type dateTime

Le type dateTime peut tre considr comme un mlange entre le type date et le type
time. Ce nouveau type permet donc de reprsenter une date ET une heure. Une nou-
velle fois, une expression particulire doit tre respecte : YYYY-MM-DDThh :mm :ss.
Je ne vais pas spcifiquement revenir sur cette expression. En effet, comme vous pouvez
le constater, il sagit des expressions du type date et du type time spares par la lettre
T. Je vous laisse vous rfrer aux types date et time pour les rgles appliquer.

Le type gYear

Le type gYear reprsente une anne sur 4 chiffres ou plus. Dans le cas o lon souhaite
exprimer une anne avant Jsus-Christ, un signe - peut-tre plac devant lexpression.

92
LES TYPES DATES

Le type gYearMonth

Le type gYearMonth reprsente une anne et un mois. Comme pour tous les types
que nous venons de voir dans ce chapitre, le type gYearMonth doit respecter une
expression particulire : YYYY-MM.
Vous laurez compris, les rgles sont toujours les mmes. Je vous laisse donc vous
reporter au paragraphe traitant du type date pour plus dinformations.

Le type gMonth

Le type gMonth reprsente un mois sur 2 chiffres prcds du symbole .


Non, ce nest pas une erreur de frappe, le symbole est bien . Voyons un exemple :
1 < xsd : element name = " mois " type = " xsd : gMonth " / >

1 <! -- mars -- >


2 < mois > -- 03 </ mois >
3
4 <! -- d cembre -- >
5 < mois > -- 12 </ mois >

Le type gMonthDay

Le type gMonthDay reprsente un mois et un jour. Une nouvelle fois, une expression
particulire doit tre utilise afin dexprimer ce nouveau type : MM-DD.
Une nouvelle fois, les rgles sont les mmes que celles que nous avons dj utilis
prcdemment notamment pour le type date et me type gYearMonth.

Le type gDay

Finalement, nous allons terminer ce chapitre avec le type gDay qui reprsente un jour
sur 2 chiffres prcds du symbole .
Afin de terminer ce chapitre en beaut, voici quelques exemples :
1 < xsd : element name = " journee " type = " xsd : gDay " / >

1 <! -- le troisi me jour du mois -- >


2 < journee > --- 03 </ journee >
3
4 <! -- le douzi me jour du mois -- >
5 < journee > --- 12 </ journee >

93
CHAPITRE 12. SCHMA XML : LES TYPES SIMPLES

Les types numriques

Le tableau rcapitulatif

Type Description Commentaire


float reprsente un nombre flottant
sur 32 bits conforme la norme
IEEE 754
double reprsente un nombre flottant
sur 64 bits conforme la norme
IEEE 754
decimal reprsente une nombre dcimal
integer reprsente un nombre entier bas sur le type decimal
long reprsente un nombre entier bas sur le type integer
int reprsente un nombre entier bas sur le type long
short reprsente un nombre entier bas sur le type int
byte reprsente un nombre entier bas sur le type short
nonPositiveInteger reprsente un nombre entier non bas sur le type integer
positif
negativeInteger reprsente un nombre entier n- bas sur le type nonPositi-
gatif veInteger
nonNegativeInteger reprsente un nombre entier non bas sur le type integer
ngatif
positiveInteger reprsente un nombre entier po- bas sur le type nonNega-
sitif tiveInteger
unsignedLong reprsente un nombre entier po- bas sur le type nonNega-
sitif tiveInteger
unsignedInt reprsente un nombre entier po- bas sur le type unsigned-
sitif Long
unsignedShort reprsente un nombre entier po- bas sur le type unsigne-
sitif dInt
unsignedByte reprsente un nombre entier po- bas sur le type unsigned-
sitif Short

Comme bien souvent en informatique, il convient dcrire les nombres dci-


maux avec un point et non une virgule. Par exemple 4.2, 5.23, etc.

94
LES TYPES NUMRIQUES

Plus en dtails
Le type float

Comme vous avez dj pu le lire dans le tableau rcapitulatif, le type float reprsente
un nombre flottant sur 32 bits et conforme la norme IEEE 754. Je suis parfaite-
ment conscient que cette dfinition est incomprhensible pour la plupart des gens, cest
pourquoi nous allons grandement la simplifier.
Le type float t emprunt aux langages de programmation comme le langage C et
est encore aujourdhui utilis dans des langages plus rcents comme Java ou C#. Il
reprsente un nombre flottant, cest--dire un nombre entier ou dcimal, se trouvant
entre les valeurs 3.4x10^-38 et 3.4x10^38.
A cette plage de valeurs, 3 autres peuvent tre ajoutes :
-INF pour moins linfini.
+INF pour plus linfini.
NaN pour Not a Number, cest--dire pour dsigner une valeur non numrique.
Il est tout fait possible dcrire un nombre de type float avec des exposants. Il
convient alors dutiliser la notation E ou e.
Pour mieux comprendre toutes ces rgles, je vous propose de regarder ensemble quelques
exemples :
1 < xsd : element name = " nombre " type = " xsd : float " / >

1 < nombre > 42 </ nombre >


2
3 < nombre > - 42 . 25 </ nombre >
4
5 < nombre > 3E4 </ nombre >
6
7 < nombre >10e - 5 </ nombre >

Le type double

Le type double est trs proche du type float, si ce nest quil reprsente un nombre
flottant sur 64 bits et conforme la norme IEEE 754 au lieu des 32 bits du type float.
Concrtement, cette diffrence se traduit par le fait quun nombre de type double se
trouvant entre les valeurs 1.7x10^-308 et 1.7x10^308.
Comme pour le type float, les 3 valeurs suivantes peuvent tre ajoutes la liste :
-INF pour moins linfini.
+INF pour plus linfini.
NaN pour Not a Number, cest--dire pour dsigner une valeur non numrique.
On retrouve galement la rgle de lexposant. Je vous laisse vous rfrer la dfinition
du type float pour plus de dtails.

95
CHAPITRE 12. SCHMA XML : LES TYPES SIMPLES

Le type decimal

Comme son nom le laisse deviner, le type decimal reprsente un nombre dcimal,
cest--dire un nombre qui peut-tre entier ou virgule. Ce nombre peut-tre positif ou
ngatif et donc tre prcd du symbole + ou -. Dans le cas dun nombre o la partie
entire est gale zro, il nest pas obligatoire de lcrire.
Voyons tout de suite quelques exemples afin dillustrer cette dfinition :
1 < xsd : element name = " nombre " type = " xsd : decimal " / >

1 < nombre > 42 </ nombre >


2
3 < nombre > - 42 . 25 </ nombre >
4
5 < nombre > +. 42 </ nombre >
6
7 < nombre > 00042 . 420000 </ nombre >

Le type integer

Le type integer est bas sur le type decimal et reprsente un nombre entier, cest--
dire un nombre sans virgule. Comme pour le type dcimal, un nombre de type integer
peut tre prcd par le symbole + ou -.

Le type long

Le type long est bas sur le type integer si ce nest quun nombre de type long doit
forcment tre compris entre les valeurs -9 223 372 036 854 775 808 et 9 223 372 036
854 775 807.

Le type int

Le type int est bas sur le type long si ce nest quun nombre de type int doit forcment
tre compris entre les valeurs -2 147 483 648 et 2 147 483 647.

Le type short

Le type short est bas sur le type int si ce nest quun nombre de type short doit
forcment tre compris entre les valeurs -32 768 et 32 768.

Le type byte

Le type byte est bas sur le type short si ce nest quun nombre de type byte doit
forcment tre compris entre les valeurs -128 et 127.

96
LES TYPES NUMRIQUES

Le type nonPositiveInteger

Bas sur le type integer, le type nonPositiveInteger reprsente un nombre entier


qui nest pas positif. Concrtement, cela correspond un nombre ngatif ou au nombre
zro.
Voyons ensemble un exemple :
1 < xsd : element name = " nombre " type = " xsd : nonPositiveInteger " / >

1 < nombre > - 42 </ nombre >


2
3 < nombre >0 </ nombre >
4
5 < nombre > - 00042 </ nombre >

Le type negativeInteger

Bas sur le type nonPositiveInteger, le type negativeInteger reprsente un nombre


entier strictement ngatif, cest--dire strictement infrieur zro.

Le type nonNegativeInteger

Bas sur le type integer, le type nonNegativeInteger reprsente un nombre entier


qui nest pas ngatif, cest--dire un nombre suprieur ou gal zro.
Soit lexemple suivant :
1 < xsd : element name = " nombre " type = " xsd : nonPositiveInteger " / >

1 < nombre > 42 </ nombre >


2
3 < nombre >0 </ nombre >
4
5 < nombre >+ 00042 </ nombre >

Le type positiveInteger

Bas sur le type nonNegativeInteger, le type positiveIntegerreprsente un nombre


entier strictement positif, cest--dire strictement suprieur zro.

Le type unsignedLong

Le type unsignedLong est bas sur le type nonNegativeInteger et reprsente un


entier compris entre les valeurs 0 et 18 446 744 073 709 551 615.

97
CHAPITRE 12. SCHMA XML : LES TYPES SIMPLES

Le type unsignedInt

Le type unsignedInt est bas sur le type unsignedLong et reprsente un entier


compris entre les valeurs 0 et 4 294 967 295.

Le type unsignedShort

Le type unsignedShort est bas sur le type unsignedInt et reprsente un entier


compris entre les valeurs 0 et 65 535.

Le type unsignedByte

Le type unsignedByte est bas sur le type unsignedShort et reprsente un entier


compris entre les valeurs 0 et 255.

Les autres types


Le tableau rcapitulatif

Type Description
boolean reprsente ltat vrai ou faux
QName reprsente un nom qualifi
NOTATION reprsente une notation
anyURI reprsente une URI
base64Binary reprsente une donne binaire au format Base64
hexBinary reprsente une donne binaire au format hexadecimal

Plus en dtails
Le type boolean

Le type boolean, comme son nom le laisse deviner, reprsente un boolen. Pour ceux
qui ignorent de quoi il sagit, un boolen permet dindiquer lun des 2 tats suivant :
vrai ou faux.
Si 2 tats sont possibles, 4 valeurs sont en ralits acceptes :
true qui reprsente ltat vrai.
false qui reprsente ltat faux.
1 qui reprsente ltat vrai.
0 qui reprsente ltat faux.
Conscient que cette notion nest pas forcment facile comprendre lorsque cest la
premire fois quon la rencontre, je vais tenter de lillustrer avec un exemple. Notre

98
LES AUTRES TYPES

exemple va nous permettre, via un attribut, de savoir si une personne est un animal
ou pas.
1 < xsd : attribute name = " animal " type = " xsd : boolean " / >

1 <! -- Victor Hugo n ' est pas un animal -->


2 < personne animal =" false " > Victor Hugo </ personne >
3
4 <! - - Zozor est bien un animal -->
5 < personne animal =" true " > Zozor </ personne >

Le type QName

Le type QName reprsente un nom qualifi. Cest un concept qui sappuie sur luti-
lisation des espaces de nom.

Le type NOTATION

Le type NOTATION permet didentifier et dcrire du contenu XML ou non comme


par exemple une image.

Le type anyURI

Comme son nom lindique, le type anyURI reprsente une URI (Uniform Resource
Identifier). Une URI est une chane de caractre qui permet didentifier une ressource.
On distingue gnralement 2 types dURI :
Les URL (Uniform Resource Locator) est probablement la forme dURI la plus
connue et je suis sr que ce nom vous parle. En effet, les URL sont utiliss pour dcrire
ladresse dune ressource sur un rseau. Par exemple http://www.monsite.com et
ftp://ftp.monftp.com/notes.txt sont deux URL possibles.
Les URN (Uniform Resource Name) sont quant eux utiliss pour identifier une
ressource dans un espace de noms. Je ne vais pas mattarder sur les URN car nous
reviendrons plus tard dans ce cours sur la notion des espaces de nom.
Une URI permet didentifier une ressource de manire relative ou absolue.
Voyons ensemble quelques exemples :
1 < xsd : attribute name = " adresse " type = " xsd : anyURI " / >

1 <! -- URI absolu -- >


2 < image adresse = " http :// www . siteduzero . com / bundles / common / images
/ spreadsheetV32 . png " / >
3
4 <! -- URI relatif -- >
5 < image adresse = " ../ bundles / common / images / spreadsheetV32 . png " / >

99
CHAPITRE 12. SCHMA XML : LES TYPES SIMPLES

Le type base64Binary

Le type base64Binary reprsente une donne binaire au format Base64.


Comme de nombreux types que nous avons vu, le type base64Binary impose le respect
de plusieurs rgles :
Seules les lettres (majuscules ou minuscules), les chiffres et les symboles + / et =
sont autoriss.
Le nombre de caractres qui composent la chane doit tre un multiple de 4.
Dans le cas o le symbole = est utilis, de nouvelles rgles doivent tre respectes :
Il ne peut apparatre quen fin de chane, une fois ou deux.
Dans le cas o il est utilis quune seule fois, il doit forcment tre prcd des
caractres A Q g ou w.
Dans le cas o il est utilis 2 fois, il doit forcment tre prcd des caractres A E
I M Q U Y c g k o s w 0 (zro) 4 ou 8.

Le type hexBinary

Le type hexBinary reprsente une donne binaire au format hexadecimal.


Si comme pour le type base64Binary quelques rgles sont respecter, elles sont bien
plus simples dans le cas du type hexBinary. Ainsi, seuls les lettres entre A et F
(majuscules ou minuscules), ainsi que les chiffres sont autoriss. A noter : le nombre
de caractres composant la chane doit forcment tre un multiple de 2.

En rsum
Les 4 grandes familles de types simples permettent dtre trs prcis quant la des-
cription des lments simples et des attributs.

100
Chapitre 13
Schma XML : les types complexes

Difficult :

Dans les chapitres prcdents, nous avons vu les lments simples et les diffrentes familles
de types simples. Malheureusement, toutes ces connaissances ne sont pas suffisantes si lon
souhaite pouvoir dcrire toutes les structures que les documents XML offrent.
Pour pallier ce manque, nous allons maintenant aborder la suite du cours via ltude dun
nouveau type dlment : les lments complexes.

101
CHAPITRE 13. SCHMA XML : LES TYPES COMPLEXES

Dfinition
Bref rappel
Au cours des chapitres prcdents, nous avons vu ensemble ce quest un lment
simple, savoir un lment qui ne contient quune valeur dont le type est dit simple.
Un lment simple ne contient pas dautres lments ni aucun attribut.
Nous avons galement vu comment dclarer un lment simple ainsi quun attribut.
Cependant nous navons pas vu comment dclarer un attribut dans un lment. En
effet, un lment qui possde un attribut nest plus un lment simple. On parle alors
dlment complexe.

Les lments complexes


Un lment complexe est un lment qui contient dautres lments ou des attributs.
Bien videmment les lments contenus dans un lments peuvent galement contenir
des lments ou des attributs. Jespre que vous suivez toujours !
Je vous propose de voir quelques exemples dlments XML qui dans un Schma XML
sont considrs comme complexes :
1 <! -- la balise personne contient d ' autres balises = > l ment
complexe -->
2 < personne >
3 <! - - la balise nom est un l ment simple -->
4 <nom > ROBERT </ nom >
5 <! - - la balise prenom est un l ment simple -->
6 < prenom > Axel </ prenom >
7 </ personne >
8
9 <! - - la balise personne poss de un attribut = > l ment complexe
-->
10 < personne sexe =" feminin " > Axel ROBERT </ personne >

Abordons maintenant diffrents exemples qui vont nous permettre de voir et de com-
prendre comment dclarer des lments complexes dans un Schma XML.

Dclarer un lment complexe


Si vous souhaitez dclarer une balise en tant qulment complexe, cest le mot clef
complexType quil faut utiliser associ celui que nous connaissons dj : element.
Noubliez pas de prcder son utilisation par xsd :
1 < xsd : element name = " mon_nom " >
2 < xsd : complexType >
3 <! -- contenu ici -- >
4 < xsd : complexType >
5 </ xsd : element >

102
LES CONTENUS SIMPLES

Nous reviendrons juste aprs sur la notion de contenu, ne vous inquitez pas. Repre-
nons lun des lments de type complexe que nous avons vu un peu plus haut :
1 < personne >
2 < nom > ROBERT </ nom >
3 < prenom > Axel </ prenom >
4 </ personne >

Voici comment le dclarer :


1 < xsd : element name = " personne " >
2 < xsd : complexType >
3 <! -- contenu ici -- >
4 </ xsd : complexType >
5 </ xsd : element >

Les contenus des types complexes


Concernant les types complexes, il est important de noter quil existe 3 types de conte-
nus possibles :
Les contenus simples.
Les contenus standards .
Les contenus mixtes.

Les contenus simples

Dfinition
Le premier type de contenu possible pour un lment complexe est le contenu simple.
On appelle contenu simple, le contenu dun lment complexe qui nest compos que
dattributs et dun texte de type simple.

Quelques exemples
Je vous propose de voir quelques exemples dlments complexes dont le contenu est
dit simple.
1 <! -- contient un attribut et du texte -- >
2 < prix devise = " euros " > 35 </ prix >
3
4 <! -- contient un attribut et du texte -- >
5 < voiture marque = " Renault " > Clio </ voiture >

103
CHAPITRE 13. SCHMA XML : LES TYPES COMPLEXES

Du ct du Schma XML
La syntaxe

Pour dclarer un lment complexe faisant rfrence une balise contenant des attributs
et du texte, voici la syntaxe utiliser :
1 < xsd : element name = " mon_nom " >
2 < xsd : complexType >
3 < xsd : simpleContent >
4 < xsd : extension base = " mon_type " >
5 < xsd : attribute name = " mon_nom " type = " mon_type " /
>
6 </ xsd : extension >
7 </ xsd : simpleContent >
8 </ xsd : complexType >
9 </ xsd : element >

Un exemple

Reprenons lexemple dun prix prenant pour attribut une devise :


1 < prix devise = " euros " > 35 </ prix >

Voici alors le schma XML associ :


1 < xsd : element name = " prix " >
2 < xsd : complexType >
3 < xsd : simpleContent >
4 < xsd : extension base = " xsd : positiveInteger " >
5 < xsd : attribute name = " devise " type = " xsd : string "
/>
6 </ xsd : extension >
7 </ xsd : simpleContent >
8 </ xsd : complexType >
9 </ xsd : element >

Dans le cas o la balise que lon cherche dcrire contient plusieurs attributs, il convient
de tout simplement les lister entre les balises <xsd:extension/>. Par exemple :
1 < voiture marque = " Renault " type = " essence " > Clio </ voiture >

1 < xsd : element name = " voiture " >


2 < xsd : complexType >
3 < xsd : simpleContent >
4 < xsd : extension base = " xsd : string " >
5 < xsd : attribut name = " marque " type = " xsd : string " /
>
6 < xsd : attribut name = " type " type = " xsd : string " / >
7 </ xsd : extension >

104
LES CONTENUS "STANDARDS"

8 < xsd : simpleContent >


9 </ xsd : complexType >
10 </ xsd : element >

Comme vous pouvez le constater, on se contente de mettre la suite les diffrents


attributs qui composent llment. noter que lordre dans lequel les attributs sont
dclars dans le Schma XML na aucune importance.

Les contenus "standards"


Dfinition
Aprs les contenus simples, nous allons monter la barre dun cran et nous attaquer aux
contenus standards .

Il est important de noter que cette appellation nest nullement officielle. Cest
une appellation maison car il sagit du cas de figure qui tendance revenir
le plus souvent.

Ce que jappelle contenu standard , cest le contenu dun lment complexe qui
nest compos que dautres lments (simples ou complexes) ou uniquement dattributs.

Quelques exemples
Comme pour le contenu simple, voyons quelques exemples de contenu standard :
1 <! -- contient d ' autres l ments -->
2 < personne >
3 <nom > DUPONT </ nom >
4 < prenom > Robert </ prenom >
5 </ prenom >
6
7 <! - - contient un attribut -->
8 < voiture marque =" Renault " / >

Balise contenant un ou plusieurs attributs


Je vous propose de dbuter par le cas de figure le plus simple, savoir celui dun
lment complexe qui ne contient que des attributs.
Reprenons lexemple de notre voiture du dessus :
1 < voiture marque = " Renault " / >

Voici alors le Schma XML associ :

105
CHAPITRE 13. SCHMA XML : LES TYPES COMPLEXES

1 < xsd : element name = " voiture " >


2 < xsd : complexType >
3 < xsd : attribut name = " marque " type = " xsd : string " / >
4 </ xsd : complexType >
5 </ xsd : element >

Il ny a, pour le moment, rien de bien compliqu. On se contente dimbriquer une balise


<xsd:attribut /> dans une balise <xsd:complexType />.
Si lon tente de complexifier un petit peu les choses, nous allons nous rendre compte
que, dans le fond, rien ne change. Prenons par exemple le cas dune balise contenant
plusieurs attributs :
1 < voiture marque = " Renault " modele = " Clio " / >

Regardons alors le Schma XML :


1 < xsd : element name = " voiture " >
2 < xsd : complexType >
3 < xsd : attribut name = " marque " type = " xsd : string " / >
4 < xsd : attribut name = " modele " type = " xsd : string " / >
5 </ xsd : complexType >
6 </ xsd : element >

Comme vous pouvez le constater, on se contente de mettre la suite les diffrents


attributs qui composent llment. Une fois de plus, lordre dans lequel les balises
<xsd:attribut /> sont places na aucune importance.

Balise contenant dautres lments


Il est maintenant temps de passer la suite et de jeter un coup dil aux balises qui
contiennent dautres lments.

La squence

Une squence est utilise lorsque lon souhaite spcifier que les lments contenus dans
un type complexe doivent apparatre dans un ordre prcis.
Voici comment se dclare une squence au niveau dun Schma XML :
1 < xsd : element name = " mon_nom " >
2 < xsd : complexType >
3 < xsd : sequence >
4 <! -- liste des l ments -- >
5 </ xsd : sequence >
6 <! -- listes des attributs -- >
7 </ xsd : complexType >
8 </ xsd : element >

Voyons tout de suite un exemple :

106
LES CONTENUS "STANDARDS"

1 < xsd : element name = " personne " >


2 < xsd : complexType >
3 < xsd : sequence >
4 < xsd : element name = " nom " type = " xsd : string " / >
5 < xsd : element name = " prenom " type = " xsd : string " / >
6 </ xsd : sequence >
7 < xsd : attribute name = " sexe " type = " xsd : string " / >
8 </ xsd : complexType >
9 </ xsd : element >

Cet extrait signifie que la balise <personne /> qui possde lattribut sexe, contient
les balises <nom /> et <prenom /> dans cet ordre.
Illustrons alors cet exemple :
1 <! -- valide -- >
2 < personne sexe = " masculin " >
3 < nom > DUPONT </ nom >
4 < prenom > Robert </ prenom >
5 </ personne >
6
7 <! -- invalide = > les balises nom et prenom sont invers es -- >
8 < personne sexe = " masculin " >
9 < prenom > Robert </ prenom >
10 < nom > DUPONT </ nom >
11 </ personne >

Le type all

Le type all est utilis lorsque lon veut spcifier que les lments contenu dans un type
complexe peuvent apparatre dans nimporte quel ordre. Ils doivent cependant tous
apparatre une et une seule fois.
Voici comment se dclare le type all au niveau dun Schma XML :
1 < xsd : element name = " mon_nom " >
2 < xsd : complexType >
3 < xsd : all >
4 <! -- liste des l ments -- >
5 </ xsd : all >
6 <! -- listes des attributs -- >
7 </ xsd : complexType >
8 </ xsd : element >

Voyons tout de suite un exemple :


1 < xsd : element name = " personne " >
2 < xsd : complexType >
3 < xsd : all >
4 < xsd : element name = " nom " type = " xsd : string " / >
5 < xsd : element name = " prenom " type = " xsd : string " / >

107
CHAPITRE 13. SCHMA XML : LES TYPES COMPLEXES

6 </ xsd : all >


7 </ xsd : complexType >
8 </ xsd : element >

Cet extrait signifie donc que la balise <personne /> contient les balises <nom /> et
<prenom /> dans nimporte quel ordre.
Illustrons alors cet exemple :
1 <! -- valide -- >
2 < personne sexe = " masculin " >
3 < nom > DUPONT </ nom >
4 < prenom > Robert </ prenom >
5 </ prenom >
6
7 <! -- valide -- >
8 < personne sexe = " masculin " >
9 < prenom > Robert </ prenom >
10 < nom > DUPONT </ nom >
11 </ prenom >

Le choix

Un choix est utilis lorsque lon veut spcifier quun lment contenu dans un type
complexe soit choisi dans une liste pr-dfinie.
Voici comment se dclare un choix au niveau dun Schma XML :
1 < xsd : element name = " mon_nom " >
2 < xsd : complexType >
3 < xsd : choice >
4 <! -- liste des l ments -- >
5 </ xsd : choice >
6 <! -- listes des attributs -- >
7 </ xsd : complexType >
8 </ xsd : element >

Voyons sans plus tarder un exemple :


1 < xsd : element name = " personne " >
2 < xsd : complexType >
3 < xsd : choice >
4 < xsd : element name = " nom " type = " xsd : string " / >
5 < xsd : element name = " prenom " type = " xsd : string " / >
6 </ xsd : choice >
7 </ xsd : complexType >
8 </ xsd : element >

Cet extrait signifie donc que la balise <personne /> contient soit la balise <nom />,
soit <prenom />.
Illustrons cet exemple :

108
LES CONTENUS "STANDARDS"

1 <! -- valide -- >


2 < personne sexe = " masculin " >
3 < nom > DUPONT </ nom >
4 </ prenom >
5
6 <! -- valide -- >
7 < personne sexe = " masculin " >
8 < prenom > Robert </ prenom >
9 </ prenom >
10
11 <! -- invalide = > les 2 balises prenom et nom ne peuvent pas
appara tre en m me temps -- >
12 < personne sexe = " masculin " >
13 < prenom > Robert </ prenom >
14 < nom > DUPONT </ nom >
15 </ prenom >

Cas dun type complexe encapsulant un type complexe


Avant de terminer cette partie, il nous reste un cas voir : celui dun type complexe
encapsulant galement un type complexe.
Prenons par exemple le document XML suivant :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < personne >
3 < identite >
4 < nom > NORRIS </ nom >
5 < prenom > Chuck </ prenom >
6 </ identite >
7 </ personne >

Ce document XML permet didentifier une personne via son nom et son prnom. Voyons
alors le Schma XML qui dfinit notre document XML :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < xsd : schema xmlns : xsd = " http :// www . w3 . org / 2001 / XMLSchema " >
3 < xsd : element name = " personne " >
4 < xsd : complexType >
5 < xsd : sequence >
6 < xsd : element name = " identite " >
7 < xsd : complexType >
8 < xsd : sequence >
9 < xsd : element name = " nom " type = " xsd :
string " / >
10 < xsd : element name = " prenom " type = " xsd
: string " / >
11 </ xsd : sequence >
12 </ xsd : complexType >
13 </ xsd : element >

109
CHAPITRE 13. SCHMA XML : LES TYPES COMPLEXES

14 </ xsd : sequence >


15 </ xsd : complexType >
16 </ xsd : element >
17 </ xsd : schema >

En soit, il ny a rien de compliqu. Il convient juste de reprer que lorsque lon place un
lment complexe au sein dun autre lment complexe, dans notre cas, une identit
dans une personne, il convient dutiliser une squence, un choix ou un type all.

Dfinition
Il est temps de conclure ce chapitre avec le dernier type de contenu possible : les
contenus mixtes.
Un contenu mixte est le contenu dun lment complexe qui est compos dattributs,
dlments et de texte.

Un exemple
Afin dillustrer cette dfinition, je vous propose de nous appuyer sur un exemple :
1 < balise1 >
2 Ceci est une cha ne de caract res
3 < balise2 > 10 </ balise2 >
4 7.5
5 </ balise1 >

Du ct du Schma XML
La syntaxe

Pour dclarer un lment complexe au contenu mixte, voici la syntaxe utiliser :


1 < xsd : element name = " mon_nom " >
2 < xsd : complexType mixed = " true " >
3 <! -- liste des l ments -- >
4 </ xsd : complexType >
5 <! -- liste des attributs -- >
6 </ xsd : element >

La nouveaut est donc lutilisation du mot clef mixed.

Un exemple

Prenons lexemple dune facture fictive dans laquelle on souhaite identifier lacheteur
et la somme quil doit payer.

110
LES CONTENUS "STANDARDS"

1 < facture > < acheteur > Zozor </ acheteur > , doit payer < somme > 1000 </
somme > euros . </ facture >

Voici comment le traduire au sein dun Schma XML :


1 < xsd : element name = " facture " >
2 < xsd : complexType mixed = " true " >
3 < xsd : sequence >
4 < xsd : element name = " acheteur " type = " xsd : string " / >
5 < xsd : element name = " somme " type = " xsd : int " / >
6 </ xsd : sequence >
7 </ xsd : complexType >
8 </ xsd : element >

Comme vous pouvez le remarquer, jai utilis la balise <xsd:sequence /> pour encap-
suler la liste des balises contenues dans la balise <facture />, mais vous pouvez bien
videmment adapter votre cas de figure et choisir parmi les balises que nous avons
vu dans le chapitre prcdent, savoir :
<xsd:sequence />.
<xsd:all />.
<xsd:choice />.

En rsum
Un lment complexe est un lment qui contient dautres lments ou des attri-
buts.
Un lment complexe est dcrit grce la balise<xsd:complexType />.
Un lment complexe a 3 types de contenus possibles : les contenus simples,
standards et mixtes.

111
CHAPITRE 13. SCHMA XML : LES TYPES COMPLEXES

112
Chapitre 14
Schma XML : aller plus loin

Difficult :

Le prochain chapitre est loccasion de terminer notre apprentissage des Schmas XML.
Ce chapitre regroupe de nombreuses notions qui vous seront utiles pour dcrire tous les
documents XML possibles et imaginables.
Ce chapitre sannonce trs dense, accrochez-vous, le rsultat en vaut la peine ! Au pro-
gramme : la gestion du nombre doccurrences dun lment, la rutilisation des l-
ments, lhritage, les identifiants et pour terminer EditiX !

113
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

Le nombre doccurrences
Dans le chapitre prcdent, nous avons vu comment crire des lments de type com-
plexe. Je peux maintenant vous avouer que je vous ai cach quelques petites choses.
Nous allons les dcouvrir ensemble ds prsent.
La premire concerne le nombre doccurrences dune balise. Pour vous aider
bien comprendre cette notion, je vous propose dtudier un morceau de Schma XML
que nous avons dj vu. Il sagit de celui dune personne qui possde un nom et un
prnom :

1 < xsd : complexType name = " personne " >


2 < xsd : sequence >
3 < xsd : element name = " nom " type = " xsd : string " / >
4 < xsd : element name = " prenom " type = " xsd : string " / >
5 </ xsd : sequence >
6 </ xsd : complexType >

Comme je vous le disais prcdemment, cet extrait signifie que la balise <personne />
contient les balises <nom /> et <prenom /> dans cet ordre.
La notion doccurrence va nous permettre de prciser si les balises, dans le cas de
notre exemple <nom /> et <prenom />, peuvent apparatre plusieurs fois, voire pas du
tout.

Le cas par dfaut

Le cas par dfaut est celui que nous avons vu jusqu maintenant. Lorsque le nombre
doccurrences nest pas prcis, la balise doit apparatre une et une seule fois.

Le nombre minimum doccurrences

Pour indiquer le nombre minimum doccurrences dun lment, on utilise lattribut


minOccurs. Comme nous lavons dj vu plus haut, sa valeur par dfaut est 1. A
noter : dans le cas o il est utilis, sa valeur doit obligatoirement tre suprieure
zro.

Le nombre maximum doccurrences

Pour indiquer le nombre maximum doccurrences dun lment, on utilise lattribut


maxOccurs. Comme pour le nombre minimum doccurrences, la valeur par dfaut est
1. Une nouvelle fois, dans le cas o il est utilis, sa valeur doit obligatoirement tre
suprieure zro. A noter : il galement possible de ne pas spcifier un nombre maximal
doccurrences grce au mot clef unbounded.

114
LA RUTILISATION DES LEMENTS

Exemple
Je vous propose de terminer ce chapitre en lillustrant par un exemple.
1 < xsd : complexType name = " personne " >
2 < xsd : sequence >
3 < xsd : element name = " nom " type = " xsd : string " / >
4 < xsd : element name = " prenom " type = " xsd : string " minOccurs =
" 2 " maxOccurs = " unbounded " / >
5 </ xsd : sequence >
6 </ xsd : complexType >

Dans lextrait de Schma XML ci-dessus, on remarque que pour llment prenom, le
nombre minimum doccurrences est 2 tandis quil ny a pas de maximum. Cela signifie,
que dans notre fichier XML, cette balise devra apparatre entre 2 et une infinit de fois
comme en tmoigne les extraits de fichier XML suivants :
1 < personne >
2 < nom > Zozor </ nom >
3 < prenom > Robert </ prenom >
4 < prenom > Bernard </ prenom >
5 </ personne >
6
7 < personne >
8 < nom > Zozor </ nom >
9 < prenom > Robert </ prenom >
10 < prenom > Bernard </ prenom >
11 < prenom > Paul </ prenom >
12 < prenom > Pierre </ prenom >
13 </ personne >

La rutilisation des lements


Avant dattaquer la notion dhritage, nous allons voir comment rutiliser des types
complexes afin den crire le moins possible. Cest bien connu, les informaticiens sont
des fainants !

Pourquoi ne pas tout crire dun seul bloc ?


Puisquun exemple est souvent bien plus parlant que de longues explications, je vous
propose dtudier le document XML suivant :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < banque >
3 <! -- 1er client de la banque -- >
4 < client >
5 <! -- identit du client -- >
6 < identite >

115
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

7 < nom > NORRIS </ nom >


8 < prenom > Chuck </ prenom >
9 </ identite >
10
11 <! -- liste des comptes bancaires du client -- >
12 < comptes >
13 < livretA >
14 < montant > 2500 </ montant >
15 </ livretA >
16 < courant >
17 < montant > 4000 </ montant >
18 </ courant >
19 </ comptes >
20 </ client >
21 </ banque >

Ce document XML reprsente une banque et ses clients. Pour chaque client, on connat
son identit, le montant de son livret A ainsi que le montant de son compte courant.
Avec nos connaissances actuelles, voici ce quoi ressemble le Schma XML qui dcrit
ce document XML :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < xsd : schema xmlns : xsd = " http :// www . w3 . org / 2001 / XMLSchema " >
3 < xsd : element name = " banque " >
4 < xsd : complexType >
5 < xsd : sequence >
6 < xsd : element name = " client " >
7 < xsd : complexType >
8 < xsd : sequence >
9 < xsd : element name = " identite " maxOccurs = " unbounded
" >
10 < xsd : complexType >
11 < xsd : sequence >
12 < xsd : element name = " nom " type = " xsd : string " /
>
13 < xsd : element name = " prenom " type = " xsd : string
" />
14 </ xsd : sequence >
15 </ xsd : complexType >
16 </ xsd : element >
17 < xsd : element name = " comptes " >
18 < xsd : complexType >
19 < xsd : sequence >
20 < xsd : element name = " livretA " >
21 < xsd : complexType >
22 < xsd : sequence >
23 < xsd : element name = " montant " type = " xsd
: double " / >
24 </ xsd : sequence >
25 </ xsd : complexType >

116
LA RUTILISATION DES LEMENTS

26 </ xsd : element >


27 < xsd : element name = " courant " >
28 < xsd : complexType >
29 < xsd : sequence >
30 < xsd : element name = " montant " type = " xsd
: double " / >
31 </ xsd : sequence >
32 </ xsd : complexType >
33 </ xsd : element >
34 </ xsd : sequence >
35 </ xsd : complexType >
36 </ xsd : element >
37 </ xsd : sequence >
38 </ xsd : complexType >
39 </ xsd : element >
40 </ xsd : sequence >
41 </ xsd : complexType >
42 </ xsd : element >
43 </ xsd : schema >

Cette construction dun seul bloc, galement appel construction en poupes


russes nest pas des plus lisibles. Afin de rendre notre Schma XML un peu plus
clair et comprhensible, je vous propose de le diviser. Sa lecture en sera grandement
facilite.

Diviser un Schma XML


Quelques explications

Dans cette partie nous allons voir comment casser cette criture en poupes
russes afin de rendre notre Schma XML plus comprhensible et plus accessible.
Lide est assez simple dans son ensemble. On dclare de manire globale les diffrents
lments qui composent notre Schma XML, puis, dans nos structures complexes, on
y fait rfrence.

La syntaxe

La dclaration dun lment ne change pas par rapport ce que nous avons vu jusqu
maintenant, quil sagisse dun lment simple ou dun lment complexe.
tablir une rfrence est alors trs simple grce au mot clef ref :
1 < xsd : element ref = " mon_nom " / >

Je vous propose dillustrer lutilisation de ce nouveau mot clef via un exemple. Nous
allons dcomposer lidentit dun client. Pour rappel, voici ce que nous avons crit dans
notre premier essai :

117
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

1 < xsd : element name = " identite " maxOccurs = " unbounded " >
2 < xsd : complexType >
3 < xsd : sequence >
4 < xsd : element name = " nom " type = " xsd : string " / >
5 < xsd : element name = " prenom " type = " xsd : string " / >
6 </ xsd : sequence >
7 </ xsd : complexType >
8 </ xsd : element >

Nous allons donc faire une dclaration globale des lments nom et prenom afin dy
faire rfrence dans llment complexe identite.
1 <! -- d claration globale de certains l ments -- >
2 < xsd : element name = " nom " type = " xsd : string " / >
3 < xsd : element name = " prenom " type = " xsd : string " / >
4
5 < xsd : element name = " identite " maxOccurs = " unbounded " >
6 < xsd : complexType >
7 < xsd : sequence >
8 < xsd : element ref = " nom " / >
9 < xsd : element ref = " prenom " / >
10 </ xsd : sequence >
11 </ xsd : complexType >
12 </ xsd : element >

Comme vous pouvez le constater, lensemble est dj plus lisible. Cette mthode nous
permet galement de rutiliser des lments qui reviennent plusieurs fois comme par
exemple llment montant prsent dans le compte courant et le livret A dun client.

Mise jour de notre banque et ses clients

Mettons alors jour notre Schma XML afin de le dcouper le plus possible :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < xsd : schema xmlns : xsd = " http :// www . w3 . org / 2001 / XMLSchema " >
3 <! -- d claration des l ments -- >
4 < xsd : element name = " nom " type = " xsd : string " / >
5 < xsd : element name = " prenom " type = " xsd : string " / >
6 < xsd : element name = " montant " type = " xsd : double " / >
7
8 < xsd : element name = " banque " >
9 < xsd : complexType >
10 < xsd : sequence >
11 < xsd : element name = " client " >
12 < xsd : complexType >
13 < xsd : sequence >
14 < xsd : element name = " identite " maxOccurs = " unbounded
" >
15 < xsd : complexType >
16 < xsd : sequence >

118
LA RUTILISATION DES LEMENTS

17 < xsd : element ref = " nom " / >


18 < xsd : element ref = " prenom " / >
19 </ xsd : sequence >
20 </ xsd : complexType >
21 </ xsd : element >
22 < xsd : element name = " comptes " >
23 < xsd : complexType >
24 < xsd : sequence >
25 < xsd : element name = " livretA " >
26 < xsd : complexType >
27 < xsd : sequence >
28 < xsd : element ref = " montant " / >
29 </ xsd : sequence >
30 </ xsd : complexType >
31 </ xsd : element >
32 < xsd : element name = " courant " >
33 < xsd : complexType >
34 < xsd : sequence >
35 < xsd : element ref = " montant " / >
36 </ xsd : sequence >
37 </ xsd : complexType >
38 </ xsd : element >
39 </ xsd : sequence >
40 </ xsd : complexType >
41 </ xsd : element >
42 </ xsd : sequence >
43 </ xsd : complexType >
44 </ xsd : element >
45 </ xsd : sequence >
46 </ xsd : complexType >
47 </ xsd : element >
48 </ xsd : schema >

Comme vous pouvez le constater, cest mieux, mais selon moi, ce nest pas encore
a. Plutt que de dclarer globalement uniquement des lments simples comme le
montant, le nom ou le prenom, pourquoi ne pas dclarer globalement des lments
complexes comme lidentit du client ou encore le livret A ou le compte courant.
Voyons alors le rsultat :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < xsd : schema xmlns : xsd = " http :// www . w3 . org / 2001 / XMLSchema " >
3 <! -- d claration des l ments -- >
4 < xsd : element name = " montant " type = " xsd : double " / >
5
6 < xsd : element name = " identite " maxOccurs = " unbounded " >
7 < xsd : complexType >
8 < xsd : sequence >
9 < xsd : element name = " nom " type = " xsd : string " / >
10 < xsd : element name = " prenom " type = " xsd : string " / >
11 </ xsd : sequence >

119
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

12 </ xsd : complexType >


13 </ xsd : element >
14
15 < xsd : element name = " livretA " >
16 < xsd : complexType >
17 < xsd : sequence >
18 < xsd : element ref = " montant " / >
19 </ xsd : sequence >
20 </ xsd : complexType >
21 </ xsd : element >
22
23 < xsd : element name = " courant " >
24 < xsd : complexType >
25 < xsd : sequence >
26 < xsd : element ref = " montant " / >
27 </ xsd : sequence >
28 </ xsd : complexType >
29 </ xsd : element >
30
31 < xsd : element name = " comptes " >
32 < xsd : complexType >
33 < xsd : sequence >
34 < xsd : element ref = " livretA " / >
35 < xsd : element ref = " courant " / >
36 </ xsd : sequence >
37 </ xsd : complexType >
38 </ xsd : element >
39
40 < xsd : element name = " client " >
41 < xsd : complexType >
42 < xsd : sequence >
43 < xsd : element ref = " identite " / >
44 < xsd : element ref = " comptes " / >
45 </ xsd : sequence >
46 </ xsd : complexType >
47 </ xsd : element >
48
49 <! -- Sch ma XML -- >
50 < xsd : element name = " banque " >
51 < xsd : complexType >
52 < xsd : sequence >
53 < xsd : element ref = " client " / >
54 </ xsd : sequence >
55 </ xsd : complexType >
56 </ xsd : element >
57 </ xsd : schema >

Cest tout de mme plus lisible, non ?

120
LA RUTILISATION DES LEMENTS

Crer ses propres types


Grce aux rfrences, nous sommes arrivs un rsultat satisfaisant, mais si lon
regarde en dtail, on se rend vite compte que notre Schma XML nest pas optimis.
En effet, les diffrents comptes de notre client, savoir le livret A et le compte courant,
ont des structures identiques et pourtant, nous les dclarons 2 fois.
Dans cette partie, nous allons donc apprendre crer nos propres types pour encore et
toujours en crire le moins possible !

La syntaxe

Dclarer un nouveau type, nest pas plus compliqu que ce que nous avons vu jusqu
prsent. Il est cependant important de noter une petite chose. Les types que nous allons
crer peuvent tre de 2 natures : simple ou complexe.
Dbutons avec la cration et lutilisation dun type simple. La cration dun type
simple est utile lorsque par exemple dans un Schma XML, plusieurs chanes de ca-
ractres ou plusieurs nombres ont des restrictions similaires.
1 <! -- cr ation -- >
2 < xsd : simpleType name = " mon_type_perso " >
3 < xsd : restriction base = " mon_type " >
4 <! -- liste des restrictions -- >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7
8 <! -- utilisation -- >
9 < xsd : element name = " mon_nom " type = " mon_type_perso " / >

Continuons avec la cration et lutilisation dun type complexe :


1 <! -- cr ation -- >
2 < xsd : ComplexeType name = " mon_type_perso " >
3 <! -- personnalisation du type complexe -- >
4 </ xsd : ComplexeType >
5
6 <! -- utilisation -- >
7 < xsd : element name = " mon_nom " type = " mon_type_perso " / >

Mise jour de notre banque et ses clients

Je vous propose de mettre jour notre Schma XML en crant un type compte que
lon pourra utiliser pour le livret A et le compte courant des clients de notre banque.
Voici alors ce que a donne :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < xsd : schema xmlns : xsd = " http :// www . w3 . org / 2001 / XMLSchema " >
3 <! -- d claration des l ments -- >

121
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

4 < xsd : element name = " montant " type = " xsd : double " / >
5
6 < xsd : element name = " identite " >
7 < xsd : complexType >
8 < xsd : sequence >
9 < xsd : element name = " nom " type = " xsd : string " / >
10 < xsd : element name = " prenom " type = " xsd : string " / >
11 </ xsd : sequence >
12 </ xsd : complexType >
13 </ xsd : element >
14
15 < xsd : complexType name = " compte " >
16 < xsd : sequence >
17 < xsd : element ref = " montant " / >
18 </ xsd : sequence >
19 </ xsd : complexType >
20
21 < xsd : element name = " comptes " >
22 < xsd : complexType >
23 < xsd : sequence >
24 < xsd : element name = " livretA " type = " compte " / >
25 < xsd : element name = " courant " type = " compte " / >
26 </ xsd : sequence >
27 </ xsd : complexType >
28 </ xsd : element >
29
30 < xsd : element name = " client " >
31 < xsd : complexType >
32 < xsd : sequence >
33 < xsd : element ref = " identite " / >
34 < xsd : element ref = " comptes " / >
35 </ xsd : sequence >
36 </ xsd : complexType >
37 </ xsd : element >
38
39 <! -- Sch ma XML -- >
40 < xsd : element name = " banque " >
41 < xsd : complexType >
42 < xsd : sequence >
43 < xsd : element ref = " client " maxOccurs = " unbounded "
/>
44 </ xsd : sequence >
45 </ xsd : complexType >
46 </ xsd : element >
47 </ xsd : schema >

Notre Schma XML est bien plus lisible maintenant !

122
LHRITAGE

Lhritage
Lhritage est un concept que lon retrouve dans la plupart des langages de pro-
grammation orient objet. Certes le XML nest pas un langage de programmation,
mais a ne lempche pas dassimiler cette notion.
Pour faire simple, lhritage permet de rutiliser des lments dun Schma XML pour
en construire de nouveaux. Si vous avez encore du mal comprendre le concept, ne
vous inquitez pas, nous allons utiliser des exemples afin de lillustrer.
En XML, 2 types dhritages sont possibles :
Par restriction.
Par extension.
Dans les 2 cas, cest le mot clef base que nous utiliserons pour indiquer un hritage.

Lhritage par restriction


La premire forme dhritage que nous allons voir est celle par restriction.

Dfinition

Une restriction est une notion qui peut sappliquer aussi bien aux lments quaux
attributs et qui permet de dterminer plus prcisment la valeur attendue via la dter-
mination dun certain nombre de contraintes.
Par exemple, jusqu maintenant, nous sommes capables de dire quun lment ou quun
attribut doit contenir un nombre entier strictement positif. Grce aux restrictions,
nous allons pouvoir pousser le concept jusquau bout en indiquant quun lment quun
attribut doit contenir un nombre entier strictement positif compris entre 1 et 100.
Lorsque lon dclare une restriction sur un lment, la syntaxe suivante doit tre res-
pecte :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 <! -- d tail de la restriction -- >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

La syntaxe est quasiment identique dans le cas dun attribut :


1 < xsd : attribute name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 <! -- d tail de la restriction -- >
5 </ xsd : restriction >
6 </ xsd : simpleType >

123
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

7 </ xsd : attribute >

Vous avez trs probablement remarqu lattribut base dans la balise <restriction
/>. Il sagit du type de votre balise et donc de votre restriction. Il suffit donc de choisir
un type simple dans la liste de ceux que nous avons vu dans les chapitres prcdents
(xsd:string, xsd:int, etc.).

Le tableau rcapitulatif

Nom de la restriction Description


minExclusive permet de dfinir une valeur minimale exclusive
minInclusive permet de dfinir une valeur minimale inclusive
maxExclusive permet de dfinir une valeur maximale exclusive
maxInclusive permet de dfinir une valeur maximale inclusive
totalDigits permet de dfinir le nombre exact de chiffres qui com-
posent un nombre
fractionDigits permet de dfinir le nombre de chiffres autoriss aprs
la virgule
length permet de dfinir le nombre exact de caractres dune
chane
minLength permet de dfinir le nombre minimum de caractres
dune chane
maxLength permet de dfinir le nombre maximum de caractres
dune chane
enumeration permet dnumrer la liste des valeurs possibles
whiteSpace permet de dterminer le comportement adopter avec
les espaces
pattern permet de dfinir des expressions rationnelles

Plus en dtails

Pour dcrire la syntaxe des diffrentes restrictions, je vais mappuyer sur


la balise <xsd:element />, mais noubliez pas que toutes les rgles que
nous voyons dans ce chapitre sont galement valables pour la balise
<xsd:attribute />.

La restriction minExclusive
La restriction minExclusive sapplique un lment de type numrique et permet
de dfinir sa valeur minimale. Comme son nom le laisse deviner, la valeur indique est
exclue des valeurs que peut prendre llment.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >

124
LHRITAGE

2 < xsd : simpleType >


3 < xsd : restriction base = " type_de_base " >
4 < xsd : minExclusive value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

Afin dillustrer cette premire restriction, prenons par exemple lge dune personne
que lon souhaite obligatoirement majeure :
1 < xsd : complexType name = " personne " >
2 < xsd : attribute name = " age " >
3 < xsd : simpleType >
4 < xsd : restriction base = " xsd : nonNegativeInteger " >
5 < xsd : minExclusive value = " 17 " / >
6 </ xsd : restriction >
7 </ xsd : simpleType >
8 </ xsd : attribute >
9 </ xsd : complexType >

1 <! -- valide -- >


2 < personne age = " 18 " / >
3
4 <! -- valide -- >
5 < personne age = " 43 " / >
6
7 <! -- invalide -- >
8 < personne age = " 17 " / >

La restriction minInclusive
La restriction minInclusive ressemble normment la restriction minExclusive que
nous venons de voir si ce nest que la valeur indique peut-tre prise par llment.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 < xsd : minInclusive value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

La restriction maxExclusive
La restriction maxExclusive sapplique un lment de type numrique et permet
de dfinir sa valeur maximale. Comme son nom le laisse deviner, la valeur indique est
exclue des valeurs que peut prendre llment.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >

125
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

2 < xsd : simpleType >


3 < xsd : restriction base = " type_de_base " >
4 < xsd : maxExclusive value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

La restriction maxInclusive
La restriction maxInclusive ressemble normment la restriction maxExclusive
que nous venons de voir si ce nest que la valeur indique peut-tre prise par llment.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 < xsd : maxInclusive value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

La restriction totalDigits
La restriction totalDigits sapplique un lment de type numrique et permet de
dfinir le nombre exact de chiffres qui composent le nombre. Sa valeur doit obligatoi-
rement tre suprieure zro.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 < xsd : totalDigits value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

Je vous propose dillustrer tout de suite cette restriction avec un exemple. Une nouvelle
fois prenons lge dune personne. Imaginons un contexte dans lequel lge dune per-
sonne doit obligatoirement tre compris entre 10 et 99. Il doit donc tre obligatoirement
compos de 2 chiffres :
1 < xsd : complexType name = " personne " >
2 < xsd : attribute name = " age " >
3 < xsd : simpleType >
4 < xsd : restriction base = " xsd : nonNegativeInteger " >
5 < xsd : totalDigits value = " 2 " / >
6 </ xsd : restriction >
7 </ xsd : simpleType >
8 </ xsd : attribute >
9 </ xsd : complexType >

126
LHRITAGE

1 <! -- valide -- >


2 < personne age = " 18 " / >
3
4 <! -- valide -- >
5 < personne age = " 43 " / >
6
7 <! -- invalide -- >
8 < personne age = " 4 " / >

La restriction fractionDigits
La restriction fractionDigits sapplique un lment de type numrique et permet de
dfinir le nombre maximal de chiffres qui composent une dcimale. Sa valeur peut-tre
suprieure ou gale zro.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 < xsd : fractionDigits value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

La restriction length
La restriction length permet de dfinir le nombre exact de caractres qui composent
une chane. La valeur renseigne doit obligatoirement tre suprieure ou gale zro.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 < xsd : length value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

Pour illustrer lutilisation de la La restriction length, prenons par exemple une em-
preinte SHA1. Pour faire simple, une empreinte SHA1 est un nombre hexadcimal
compos de 40 caractres :
1 < xsd : complexType name = " sha1 " >
2 < xsd : simpleType >
3 < xsd : restriction base = " xsd : hexBinary " >
4 < xsd : length value = " 40 " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : complexType >

1 <! -- valide -- >

127
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

2 < sha1 > e d f 7 a 6 0 2 9 d 6 b d f b 6 8 4 4 7 6 7 7 a 1 d 7 6 6 3 9 7 2 5 f 7 9 5 f 1 </ sha1 >


3
4 <! -- valide -- >
5 < sha1 > a 9 4 a 8 f e 5 c c b 1 9 b a 6 1 c 4 c 0 8 7 3 d 3 9 1 e 9 8 7 9 8 2 f b b d 3 </ sha1 >
6
7 <! -- invalide -- >
8 < sha1 > test </ sha1 >

La restriction minLength
La restriction minLength permet de dfinir le nombre minimum de caractres qui
composent une chane. La valeur renseigne doit obligatoirement tre suprieure ou
gale zro.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 < xsd : minLength value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

La restriction maxLength
La restriction maxLength permet de dfinir le nombre maximum de caractres qui
composent une chane. La valeur renseigne doit obligatoirement tre suprieure ou
gale zro.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 < xsd : maxLength value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

La restriction enumeration
La restriction enumeration, comme son nom le laisse deviner, cette restriction permet
dnumrer la liste des valeurs possibles pour un lment ou un attribut.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 < xsd : enumeration value = " valeur1 " / >
5 < xsd : enumeration value = " valeur2 " / >
6 <! -- liste des valeurs ... -- >
7 </ xsd : restriction >

128
LHRITAGE

8 </ xsd : simpleType >


9 </ xsd : element >

Afin dillustrer cette restriction, prenons lexemple dune personne comme nous lavons
dj fait plusieurs reprises dans ce tutoriel. Une personne possde un nom, un prnom,
et est normalement un homme ou une femme. crivons alors la rgle dun Schma XML
permettant de dcrire une personne :
1 < xsd : complexType name = " personne " >
2 < xsd : sequence >
3 < xsd : element name = " nom " type = " xsd : string " / >
4 < xsd : element name = " prenom " type = " xsd : string " / >
5 </ xsd : sequence >
6 < xsd : attribute name = " sexe " >
7 < xsd : simpleType >
8 < xsd : restriction base = " xsd : string " >
9 < xsd : enumeration value = " masculin " / >
10 < xsd : enumeration value = " feminin " / >
11 </ xsd : restriction >
12 </ xsd : simpleType >
13 </ xsd : attribute >
14 </ xsd : complexType >

1 <! -- valide -- >


2 < personne sexe = " masculin " >
3 < nom > DUPONT </ nom >
4 < prenom > Robert </ prenom >
5 </ personne >
6
7 <! -- valide -- >
8 < personne sexe = " feminin " >
9 < nom > DUPONT </ nom >
10 < prenom > Robert </ prenom >
11 </ personne >
12
13 <! -- invalide -- >
14 < personne sexe = " pomme " >
15 < nom > DUPONT </ nom >
16 < prenom > Robert </ prenom >
17 </ personne >

La restriction whiteSpace
La restriction whiteSpace permet de spcifier le comportement adopter par un
lment lorsquil contient des espaces. Les espaces peuvent tre de diffrentes formes
comme par exemple les tabulations, les retours la ligne, etc.
3 valeurs sont possibles :
Preserve : cette valeur permet de prserver tous les espaces.
Replace : cette valeur permet de remplacer tous les espaces (tabulations, retour
la ligne, etc.) par des espaces simples .

129
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

Collapse : cette valeur permet de supprimer les espaces en dbut et fin de chane,
de remplacer les tabulations et les retours la ligne par un espace simple et de
remplacer les espaces multiples par un espace simple .
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 < xsd : whiteSpace value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

La restriction pattern
La restriction pattern permet de dfinir des expressions rationnelles (galement ap-
peles expressions rgulires). Une expression rationnelle est un motif qui permet de
dcrire le contenu attendu. Ainsi laide des expressions rationnelles, il est possible de
dire que le contenu attendu doit forcment dbuter par une majuscule, se terminer un
point, dbuter par un caractre spcial, ne pas contenir la lettre z , etc.
Les expressions rationnelles sont un langage part entire sur lequel nous nallons
pas revenir dans ce cours, mais ne vous inquitez pas, vous trouverez facilement sur
Internet de nombreuses ressources francophones sur le sujet.
Voici sa syntaxe :
1 < xsd : element name = " mon_nom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " type_de_base " >
4 < xsd : pattern value = " ma_valeur " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : element >

Afin dillustrer cette dernire restriction, prenons lexemple du prnom non compos
dune personne. On souhaite quil dbute par une majuscule et soit suivi par plusieurs
caractres minuscules :
1 < xsd : complexType name = " prenom " >
2 < xsd : simpleType >
3 < xsd : restriction base = " xsd : string " >
4 < xsd : pattern value = " [A - Z ][ a - z ]+ " / >
5 </ xsd : restriction >
6 </ xsd : simpleType >
7 </ xsd : complexType >

1 <! -- valide -- >


2 < prenom > Robert </ prenom >
3
4 <! -- valide -- >
5 < prenom > Zozor </ prenom >

130
LHRITAGE

6
7 <! -- invalide -- >
8 < prenom > bernard </ prenom >

Lhritage par extension


Dans cette seconde partie, nous allons voir le second type dhritage : lhritage par
extension.

Dfinition

Une extension est une notion qui permet dajouter des informations un type existant.
On peut, par exemple, vouloir ajouter un lment ou un attribut.
Lorsque lon dclare une extension sur un lment, cest toujours le mot clef base
qui est utilis :
1 <! -- contenu complexe -- >
2 < xsd : complexType name = " mon_nom " >
3 < xsd : complexContent >
4 < xsd : extension base = " type_de_base " >
5 <! -- d tail de l ' extension -->
6 </ xsd : restriction >
7 </ xsd : complexContent >
8 </ xsd : complexType >
9
10 <! - - contenu simple -->
11 < xsd : complexType name =" mon_nom " >
12 < xsd : simpleContent >
13 < xsd : extension base =" type_de_base " >
14 <! - - d tail de l ' extension -- >
15 </ xsd : restriction >
16 </ xsd : complexContent >
17 </ xsd : complexType >

Exemple

Je vous propose de mettre en application cette nouvelle notion dhritage par exten-
sion au travers dun exemple. Reprenons les donnes clientes dune banque que nous
manipulions dans le chapitre prcdent. Dans cette exemple, nous avions dfini un type
compte appliqu au compte courant et au livret A de notre client :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < xsd : schema xmlns : xsd = " http :// www . w3 . org / 2001 / XMLSchema " >
3 <! -- d claration des l ments -- >
4 < xsd : element name = " montant " type = " xsd : double " / >
5

131
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

6 < xsd : element name = " identite " maxOccurs = " unbounded " >
7 < xsd : complexType >
8 < xsd : sequence >
9 < xsd : element name = " nom " type = " xsd : string " / >
10 < xsd : element name = " prenom " type = " xsd : string " / >
11 </ xsd : sequence >
12 </ xsd : complexType >
13 </ xsd : element >
14
15 < xsd : complexType name = " compte " >
16 < xsd : sequence >
17 < xsd : element ref = " montant " / >
18 </ xsd : sequence >
19 </ xsd : complexType >
20
21 < xsd : element name = " comptes " >
22 < xsd : complexType >
23 < xsd : sequence >
24 < xsd : element name = " livretA " type = " compte " / >
25 < xsd : element name = " courant " type = " compte " / >
26 </ xsd : sequence >
27 </ xsd : complexType >
28 </ xsd : element >
29
30 < xsd : element name = " client " >
31 < xsd : complexType >
32 < xsd : sequence >
33 < xsd : element ref = " identite " / >
34 < xsd : element ref = " comptes " / >
35 </ xsd : sequence >
36 </ xsd : complexType >
37 </ xsd : element >
38
39 <! -- Sch ma XML -- >
40 < xsd : element name = " banque " >
41 < xsd : complexType >
42 < xsd : sequence >
43 < xsd : element ref = " client " / >
44 </ xsd : sequence >
45 </ xsd : complexType >
46 </ xsd : element >
47 </ xsd : schema >

Imaginons maintenant que le compte courant et le livret A soient un peu diffrents.


Par exemple, un compte courant na gnralement pas de taux dintrts tandis que le
livret A en a un. Malgr ce petit changement, le livret A et le compte courant restent
sensiblement identiques. Cest l que lhritage par extension intervient. Nous allons
tendre le type compte en y ajoutant un attribut pour crer ainsi un nouveau type :
celui dun compte avec des intrts.

132
LES IDENTIFIANTS

1 <! -- le montant -- >


2 < xsd : element name = " montant " type = " xsd : double " / >
3
4 <! -- compte sans int r ts -- >
5 < xsd : complexType name = " compte " >
6 < xsd : sequence >
7 < xsd : element ref = " montant " / >
8 </ xsd : sequence >
9 </ xsd : complexType >
10
11 <! -- compte avec int r ts gr ce l 'h ritage par extension -->
12 < xsd : complexType name =" compteInteret " >
13 < xsd : complexContent >
14 < xsd : extension base =" compte " >
15 < xsd : attribute name =" interet " type =" xsd : float " / >
16 </ xsd : extension >
17 </ xsd : complexContent >
18 </ xsd : complexType >

Les identifiants
Nous avons dj vu que dans un Schma XML, il est possible didentifier des ressources
et dy faire rfrence grce aux mots clefs ID et IDREF.
Il est cependant possible daller plus loin et dtre encore plus prcis grce 2 nouveaux
mots clefs : key et keyref.

Pour bien comprendre la suite de chapitre, il est ncessaire de connatre le


fonctionnement dune technologie quon appelle XPath, technologie que nous
aborderons en plus en dtail dans la prochaine partie. Pour le moment, retenez
simplement que cette technologie nous permet de slectionner avec prcision
des lments formant un document XML.

La syntaxe
Llment key

Au sein dun Schma XML, llment <key /> est compos :


Dun lment <selector /> contenant une expression XPath afin dindiquer ll-
ment rfrencer.
Dun ou plusieurs lments <field /> contenant une expression XPath afin dindi-
quer lattribut servant didentifiant.
Ce qui nous donne :
1 < xsd : key name = " nom_identifiant " >

133
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

2 < selector xpath = " expression_XPath " / >


3 <! -- liste d ' l ments field -->
4 < field xpath =" expression_XPath " / >
5 </ xsd : key >

Llment keyref

Llment <keyref /> se construit sensiblement comme llment <key />. Il est donc
compos :
Dun lment <selector /> contenant une expression XPath afin dindiquer ll-
ment rfrencer.
Dun ou plusieurs lments <field /> contenant une expression XPath afin dindi-
quer lattribut servant didentifiant.
Ce qui nous donne :
1 < xsd : keyref name = " nom " refer = " nom_identifiant " >
2 < selector xpath = " expression_XPath " / >
3 <! -- liste d ' l ments field -->
4 < field xpath =" expression_XPath " / >
5 </ xsd : keyref >

Exemple
Afin dillustrer cette nouvelle notion, je vous propose de dtudier le document XML
suivant :
1 < famille >
2 < pere id = " PER - 1 " / >
3 < enfant id = " PER - 2 " pere = " PER - 1 " / >
4 </ famille >

Dans cet exemple, une famille est compose dun pre et dun enfant dont chacun
possde un identifiant unique au travers de lattribut id. Lenfant possde galement
un attribut pere qui contient lidentifiant de son pre.
Je vous propose de construire ensemble le Schma XML correspond au document XML.
Commenons par dcrire llment <pere /> :
1 < xsd : element name = " pere " >
2 < xsd : complexType >
3 < xsd : attribut name = " id " type = " xsd : NCName " / >
4 </ xsd : complexType >
5 </ xsd : element >

Continuons avec llment <enfant /> :


1 < xsd : element name = " enfant " >
2 < xsd : complexType >

134
LES IDENTIFIANTS

3 < xsd : attribut name = " id " type = " xsd : NCName " / >
4 < xsd : attribut name = " pere " type = " xsd : NCName " / >
5 </ xsd : complexType >
6 </ xsd : element >

Terminons avec llment <famille /> :

1 < xsd : element name = " famille " >


2 < xsd : complexType >
3 < xsd : sequence >
4 < xsd : element ref = " pere " / >
5 < xsd : element ref = " enfant " / >
6 </ xsd : sequence >
7 </ xsd : complexType >
8 </ xsd : element >

Modifions ce dernier lment afin dy ajouter nos identifiants. Pour le moment, je vous
demande daccepter les expressions XPath prsentes dans le Schma XML. Dans la
partie suivante, vous serez normalement en mesure de les comprendre.

1 < xsd : element name = " famille " >


2 < xsd : complexType >
3 < xsd : sequence >
4 < xsd : element ref = " pere " / >
5 < xsd : element ref = " enfant " / >
6 </ xsd : sequence >
7 </ xsd : complexType >
8
9 <! -- identifiant du p re -- >
10 < xsd : key name = " pereId " >
11 < xsd : selector xpath = " ./ pere " / >
12 < xsd : field xpath = " @id " / >
13 </ xsd : key >
14
15 <! -- identifiant de l ' enfant -->
16 < xsd : key name =" enfantId " >
17 < xsd : selector xpath ="./ enfant " / >
18 < xsd : field xpath =" @id " / >
19 </ xsd : key >
20
21 <! - - r f rence l ' identifiant du p re dans l ' l ment
enfant -->
22 < xsd : key name =" pereIdRef " refer =" pereId " >
23 < xsd : selector xpath ="./ enfant " / >
24 < xsd : field xpath =" @pere " / >
25 </ xsd : key >
26 </ xsd : element >

135
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

Un exemple avec EditiX


Pour conclure ce chapitre, je vous propose de voir ensemble comment crire un
Schma XML avec EditiX.
Pour faire simple, reprenons lexemple de notre banque vu dans le chapitre sur la
rutilisation des types.

Cration du document XML


La cration du document XML na rien de bien compliqu, nous lavons dj vu
ensemble dans la partie prcdente.
Pour ceux qui ne sen souviennent pas, vous pouvez y jeter un coup dil la page 21.
Voici le document que vous devez crire :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < banque xsi : n o N a m e s p a ce S c h e m a L o c at i o n = " banque . xsd " xmlns : xsi = "
http :// www . w3 . org / 2001 / XMLSchema - instance " >
3 <! -- 1er client de la banque -- >
4 < client >
5 <! -- identit du client -- >
6 < identite >
7 < nom > NORRIS </ nom >
8 < prenom > Chuck </ prenom >
9 </ identite >
10
11 <! -- liste des comptes bancaires du client -- >
12 < comptes >
13 < livretA >
14 < montant > 2500 </ montant >
15 </ livretA >
16 < courant >
17 < montant > 4000 </ montant >
18 </ courant >
19 </ comptes >
20 </ client >
21 </ banque >

Si vous essayez de lancer la vrification du document, vous devriez normalement avoir


le message derreur suivant (voir la figure 14.1).

Figure 14.1 Message derreur indiquant que le Schma XML est introuvable

Ce message est pour le moment compltement normal puisque nous navons pas encore
cr notre document XSD.

136
UN EXEMPLE AVEC EDITIX

Cration du document XSD


Pour crer un nouveau document, vous pouvez slectionner
  dans la barre de menu File
puis New ou encore utiliser le raccourci clavier Ctrl + N .
Dans la liste qui saffiche, slectionnez W3C XML Schema, ainsi quindiqu sur la
figure 14.2.

Figure 14.2 Cration dun Schma XML

Votre document XSD nest normalement pas vierge. Voici ce que vous devriez avoir :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2
3 < xs : schema xmlns : xs = " http :// www . w3 . org / 2001 / XMLSchema " >
4
5 </ xs : schema >

Replacez le contenu par notre vritable Schma XML :


1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < xsd : schema xmlns : xsd = " http :// www . w3 . org / 2001 / XMLSchema " >
3 <! -- d claration des l ments -- >
4 < xsd : element name = " montant " type = " xsd : double " / >
5
6 < xsd : element name = " identite " >
7 < xsd : complexType >
8 < xsd : sequence >
9 < xsd : element name = " nom " type = " xsd : string " / >
10 < xsd : element name = " prenom " type = " xsd : string " / >
11 </ xsd : sequence >
12 </ xsd : complexType >
13 </ xsd : element >
14
15 < xsd : complexType name = " compte " >
16 < xsd : sequence >

137
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

17 < xsd : element ref = " montant " / >


18 </ xsd : sequence >
19 </ xsd : complexType >
20
21 < xsd : element name = " comptes " >
22 < xsd : complexType >
23 < xsd : sequence >
24 < xsd : element name = " livretA " type = " compte " / >
25 < xsd : element name = " courant " type = " compte " / >
26 </ xsd : sequence >
27 </ xsd : complexType >
28 </ xsd : element >
29
30 < xsd : element name = " client " >
31 < xsd : complexType >
32 < xsd : sequence >
33 < xsd : element ref = " identite " / >
34 < xsd : element ref = " comptes " / >
35 </ xsd : sequence >
36 </ xsd : complexType >
37 </ xsd : element >
38
39 <! -- Sch ma XML -- >
40 < xsd : element name = " banque " >
41 < xsd : complexType >
42 < xsd : sequence >
43 < xsd : element ref = " client " maxOccurs = " unbounded "
/>
44 </ xsd : sequence >
45 </ xsd : complexType >
46 </ xsd : element >
47 </ xsd : schema >

Enregistrez ensuite votre document avec le nom banque.xsd au mme endroit que
votre document XML.

Vrification du Schma XML


Vous pouvez vrifier que votre Schma XML na pas derreur de syntaxe en slection-
nant dans la barre de menu XML
 puis Check this document ou encore en utilisant
le raccourci clavier Ctrl + K . Vous devriez normalement avoir le message suivant
(voir figure 23.2).

Vrification du document XML


Il est maintenant temps de vrifier que le document XML est valide !
Pour ce faire, cliquez sur licne adquate ou slectionnez dans la barre de menu XML

138
UN EXEMPLE AVEC EDITIX

Figure 14.3 Message indiquant que le Schma XML ne contient aucune erreur de
syntaxe

 
puis Check this document ou utilisez le raccourci clavier Ctrl + K .
Un message doit normalement safficher (voir la figure 23.2).

Figure 14.4 Message indiquant que le document XML est valide

En rsum
Le nombre doccurrences dun lment sexprime grce aux mots clefs minOccurs
et maxOccurs.
Le mot clef ref permet de faire rfrence des lments dans le but de les rutiliser
plusieurs fois au sein du Schma XML.
Lhritage permet de rutiliser des lments dun Schma XML pour en construire
de nouveaux.
Il existe 2 types dhritages : lhritage par restriction et lhritage par exten-
sion.

139
CHAPITRE 14. SCHMA XML : ALLER PLUS LOIN

140
Chapitre 15
TP : Schma XML dun rpertoire

Difficult :

Souvenez vous, lorsque nous avons tudi les DTD, nous avions mis en pratique notre
apprentissage travers la dfinition DTD dun rpertoire.
Pour ce nouveau TP, le sujet ne change pas, il convient toujours dcrire la dfinition dun
rpertoire. Ce qui change cest la technologie utiliser. Cette fois-ci, cest un Schma XML
que je vous demande dcrire !

141
CHAPITRE 15. TP : SCHMA XML DUN RPERTOIRE

Lnonc
Le but de ce TP est de crer le Schma XML du rpertoire que nous avons dj vu.
Pour rappel, voici les informations que lon souhaite connatre pour chaque personne :
Son sexe (homme ou femme).
Son nom.
Son prnom.
Son adresse.
Un ou plusieurs numros de tlphone (tlphone portable, fixe, bureau, etc.).
Une ou plusieurs adresses e-mail (adresse personnelle, professionnelle, etc.).
Voici le document XML que nous avions construit :

1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2
3 < repertoire >
4 <! -- John DOE -- >
5 < personne sexe = " masculin " >
6 < nom > DOE </ nom >
7 < prenom > John </ prenom >
8 < adresse >
9 < numero >7 </ numero >
10 < voie type = " impasse " > impasse du chemin </ voie >
11 < codePostal > 75015 </ codePostal >
12 < ville > PARIS </ ville >
13 < pays > FRANCE </ pays >
14 </ adresse >
15 < telephones >
16 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
17 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
18 </ telephones >
19 < emails >
20 < email type = " personnel " > john . doe@wanadoo . fr </ email >
21 < email type = " professionnel " > john . doe@societe . com </
email >
22 </ emails >
23 </ personne >
24
25 <! -- Marie POPPINS -- >
26 < personne sexe = " feminin " >
27 < nom > POPPINS </ nom >
28 < prenom > Marie </ prenom >
29 < adresse >
30 < numero > 28 </ numero >
31 < voie type = " avenue " > avenue de la r publique </ voie >
32 < codePostal > 13005 </ codePostal >
33 < ville > MARSEILLE </ ville >
34 < pays > FRANCE </ pays >

142
UNE SOLUTION

35 </ adresse >


36 < telephones >
37 < telephone type = " bureau " > 04 05 06 07 08 </ telephone >
38 </ telephones >
39 < emails >
40 < email type = " professionnel " > contact@poppins . fr </
email >
41 </ emails >
42 </ personne >
43 </ repertoire >

Une solution
Comme chaque fois, je vous fais part de ma solution. Mais tant donn quelle est un
peu longue, je vous invite utiliser le code web suivant pour y accder.

Voir ma solution
B

Code web : 776572

Un bref commentaire
Dans cette solution, je suis all au plus simple. Libre vous de crer de nouvelles rgles
si vous souhaitez par exemple utiliser un pattern prcis pour les numros de tlphone
ou les adresses e-mails.

143
CHAPITRE 15. TP : SCHMA XML DUN RPERTOIRE

144
Troisime partie

Traitez vos donnes XML

145
Chapitre 16
DOM : Introduction lAPI

Difficult :

Dans la seconde partie, nous avons eu loccasion dtudier 2 technologies permettant


dcrire la dfinition dun document XML. Cette troisime partie est galement loccasion
de dcouvrir 2 nouvelles technologies quil est possible dutiliser en parallle dun document
XML : lAPI DOM et XPath.
Ces 2 technologies vont nous permettre dextraire et exploiter les informations contenu
dans un document XML. Dbutons immdiatement la premire des deux : lAPI DOM.

147
CHAPITRE 16. DOM : INTRODUCTION LAPI

Quest-ce que LAPI DOM ?

La petite histoire de DOM

DOM ou Document Object Model, son nom complet, est ce quon appelle un
parseur XML, cest--dire, une technologie grce laquelle il est possible de lire un
document XML et den extraire diffrentes informations (lments, attributs, commen-
taires, etc. . .) afin de les exploiter.
Comme pour la plupart des technologies abordes dans ce tutoriel, DOM est un stan-
dard du W3C et ce, depuis sa premire version en 1998. Au moment o jcris ces
lignes, la technologie en est sa troisime version.
Il est trs important de noter que DOM est une recommandation compltement ind-
pendante de toute plate-forme et langage de programmation. Au travers de DOM, le
W3C fournit une recommandation, cest--dire une manire dexploiter les documents
XML.
Aujourdhui, la plupart des langages de programmation propose leur implmentation
de DOM :
C.
C ++.
Java.
C#.
Perl.
PHP.
etc.

Dans les chapitres suivants, les exemples seront illustrs laide du langage
Java.

Larbre XML
Dans le chapitre prcdent, je vous disais que DOM est une technologie compltement
indpendante de toute plate-forme et langage de programmation et quelle se contente
de fournir une manire dexploiter les documents XML.
En ralit, lorsque votre document XML est lu par un parseur DOM, le document est
reprsent en mmoire sous la forme dun arbre dans lequel les diffrents lments sont
lis les uns aux autres par une relation parent/enfant. Il est ensuite possible de passer
dun lment un autre via un certain nombre de fonctions que nous verrons dans le
chapitre suivant.
Je vous propose dillustrer cette notion darbre grce un exemple. Soit le document
XML suivant :

148
LARBRE XML

1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < repertoire >
3 <! -- John DOE -- >
4 < personne sexe = " masculin " >
5 < nom > DOE </ nom >
6 < prenom > John </ prenom >
7 < telephones >
8 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
9 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
10 </ telephones >
11 </ personne >
12 </ repertoire >

Voici la figure 18.3 ce quoi ressemble larbre une fois modlis.

Figure 16.1 Modlisation dun arbre XML

Pour bien comprendre quoi correspondent les couleurs et les formes, voici la lgende
en figure 18.2.
Dans nos futurs programmes cest donc ce genre darbres que nous allons parcourir
afin dobtenir les informations que lon souhaite exploiter en passant dun lment
un autre. Mais avant de voir comment procder, je vous propose de revenir sur le
vocabulaire utilis par DOM.

149
CHAPITRE 16. DOM : INTRODUCTION LAPI

Figure 16.2 Lgende des icnes utilises dans larbre XML

Le vocabulaire et les principaux lments

Dans ce chapitre, nous allons dcouvrir ensemble le vocabulaire utilis par le parseur
DOM. Nous allons galement en profiter pour faire le tour des principaux lments en
terme de programmation.

Lors de la description des diffrents lments, je vais tenter dtre le plus


neutre possible en me dtachant de tout langage de programmation. Ce-
pendant, des connaissances en programmation objet sont ncessaires pour
comprendre ce chapitre.

Document

Dfinition

Le document comme son nom le laisse deviner dsigne le document XML dans son
ensemble. Il est donc compos :
Du prologue.
Du corps.

La classe

Grce la classe Document nous allons pouvoir exploiter aussi bien le prologue que
le corps de nos documents XML. Cette classe va galement se rvler indispensable
lorsque nous allons vouloir crer ou modifier des documents XML. En effet, via les
nombreuses mthodes proposes, nous allons pouvoir ajouter des lments, des com-
mentaires, des attributs, etc.

150
LE VOCABULAIRE ET LES PRINCIPAUX LMENTS

Node

Dfinition

Un Node ou Nud en franais peut-tre vritablement considr comme llment


de base dun arbre XML. Ainsi, toute branche ou feuille est un nud. Un lment est
donc un nud, tout comme une valeur et un attribut.
Je vous propose de reprendre le schma vu prcdemment et de tenter didentifier 3
nuds parmi tous ceux prsents (voir la figure 16.3).

Figure 16.3 Des nuds

La classe

La classe Node nous permet dobtenir un certain nombre dinformations lors de lex-
ploitation dun document XML. Ainsi, il est possible dobtenir le type du nud (attri-
but, valeur, etc.) son nom, sa valeur, la liste des nuds fils, le nud parent, etc. Cette
classe propose galement un certain nombre de mthodes qui vont nous aider crer
et modifier un document XML en offrant par exemple la possibilit de supprimer un
nud, ou den remplacer un par un autre, etc.

151
CHAPITRE 16. DOM : INTRODUCTION LAPI

Element
Dfinition

Un Element reprsente une balise dun document XML. Si lon reprend le schma de
larbre XML du dessus, les lments sont en bleu.

La classe

La classe Element, en plus de nous fournir le nom de la balise, nous offre de nombreuses
fonctionnalits comme par exemple la possibilit de rcuprer les informations dun
attribut ou encore de rcuprer la listes des noeuds dun lment portant un nom
spcifique.

Attr
Dfinition

Un Attr dsigne un attribut. Si lon reprend le schma de larbre XML du dessus, les
attributs sont en orange.

La classe

La classe Attr, permet dobtenir un certain nombre dinformation concernant les at-
tributs comme son nom ou encore sa valeur. Cette classe va galement nous tre utile
lorsque lon voudra crer ou modifier des documents XML.

Text
Dfinition

Un Text dsigne le contenu dune balise. Si lon reprend le schma de larbre XML du
dessus, ils sont en vert.

La classe

En plus de la donne textuelle, la classe Text, permet de facilement modifier un docu-


ment XML en proposant par exemple des mthodes de suppression ou de remplacement
de contenu.

Les autres lments


Il est presque impossible de prsenter tous les lments du DOM vu la densit de
la technologie. Sachez cependant que nous avons vu les principaux et quun exemple

152
LE VOCABULAIRE ET LES PRINCIPAUX LMENTS

dutilisation de limplmentation Java est prvu dans le chapitre suivant.


Concernant les lments non dcrits, il existe par exemple la classe Comment per-
mettant de grer les commentaires ou encore la classe CDATASection permettant de
dexploiter les sections CDATA dun document XML.
Finalement, sachez que grce DOM, il est galement possible de vrifier la validit
dun document XML une dfinition DTD ou un Schma XML.

En rsum
DOM est une recommandation compltement indpendante de toute plate-forme et
langage de programmation ;
DOM exploite larbre XML dun document XML.

153
CHAPITRE 16. DOM : INTRODUCTION LAPI

154
Chapitre 17
DOM : Exemple dutilisation en Java

Difficult :

Dans le chapitre prcdent, nous venons donc de faire connaissance avec lAPI DOM. Dans
ce nouveau chapitre, nous allons manipuler limplmentation Java de cette technologie
en dcouvrant ensemble, tape par tape, comment lire et crer un document XML.
Pour ceux dentre vous qui nutilisent pas Java ou qui sont plus laise avec un autre
langage de programmation, nhsitez pas aller faire une petite visite sur le forum du site
du Zro pour trouver des rponses toutes vos questions !

155
CHAPITRE 17. DOM : EXEMPLE DUTILISATION EN JAVA

Lire un document XML


Le document XML
Avant de plonger dans le code, voici le document XML que nous allons tenter dexploi-
ter :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < repertoire >
3 <! -- John DOE -- >
4 < personne sexe = " masculin " >
5 < nom > DOE </ nom >
6 < prenom > John </ prenom >
7 < telephones >
8 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
9 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
10 </ telephones >
11 </ personne >
12 </ repertoire >

Mise en place du code


tape 1 : rcupration dune instance de la classe DocumentBuilderFac-
tory

Avant mme de pouvoir prtendre crer un parseur DOM, nous devons rcuprer
une instance de la classe DocumentBuilderFactory. Cest partir de cette instance que
dans ltape suivante nous pourrons crer notre parseur.
Pour rcuprer une instance de la classe DocumentBuilderFactory une ligne de code
suffit :
1 final D o c um ent Bui ld erF ac tor y factory = Doc um ent Bu ild erF ac tor y .
newInstance () ;

Cette ligne de code saccompagne de limportation du package :


1 import javax . xml . parsers . Do cu men tB uil de rFa cto ry ;

tape 2 : cration dun parseur

La seconde tape consiste crer un parseur partir de notre variable factory cre
dans ltape 1.
Une nouvelle fois, une seule ligne de code est suffisante :
1 final DocumentBuilder builder = factory . newDocumentBuilder () ;

156
LIRE UN DOCUMENT XML

Pour pouvoir utiliser la classe DocumentBuilder, le package suivant est ncessaire :


1 import javax . xml . parsers . DocumentBuilder ;

Puisque lappel la fonction newDocumentBuilder(), peut lever une exception, il


convient de le placer dans un bloc de type try/catch :
1 try {
2 final DocumentBuilder builder = factory . newDocumentBuilder
() ;
3 }
4 catch ( final P a r s e r C o n f i g u r a t i o n E x c e p t i o n e ) {
5 e . printStackTrace () ;
6 }

La gestion de cette exception oblige galement importer le package :


1 import javax . xml . parsers . P a r s e r C o n f i g u r a t i o n E x c e p t i o n ;

tape 3 : cration dun Document

La troisime tape consiste crer un Document partir parseur de ltape 2. Plu-


sieurs possibilits soffre alors vous :
A partir dun fichier.
A partir dun flux.
Ce flux peut par exemple tre le rsultat de lappel un web service. Dans notre
exemple, cest un fichier qui est utilis :
1 final Document document = builder . parse ( new File ( " repertoire . xml
"));

Comme chaque nouvelle instruction, des packages doivent tre imports :


1 import java . io . File ;
2 import org . w3c . dom . Document ;

De nouvelles exceptions pouvant tre leves, il convient galement de modifier leurs


captures dans des blocs catch. Voici alors ce que vous devriez avoir :
1 try {
2 final DocumentBuilder builder = factory . newDocumentBuilder
() ;
3 final Document document = builder . parse ( new File ( " repertoire
. xml " ) ) ;
4 }
5 catch ( final P a r s e r C o n f i g u r a t i o n E x c e p t i o n e ) {
6 e . printStackTrace () ;
7 }
8 catch ( final SAXException e ) {
9 e . printStackTrace () ;

157
CHAPITRE 17. DOM : EXEMPLE DUTILISATION EN JAVA

10 }
11 catch ( final IOException e ) {
12 e . printStackTrace () ;
13 }

La gestion de ces nouvelles exceptions nous oblige galement importer quelques pa-
ckages :
1 import java . io . IOException ;
2 import org . xml . sax . SAXException ;

Comme je vous le disais dans le chapitre prcdent, un Document reprsente le do-


cument XML dans son intgralit. Il contient son prologue et son corps. Nous allons
pouvoir le vrifier en affichant les lments du prologue, savoir :
La version XML utilise.
Lencodage utilis.
Sil sagit dun document standalone ou non.
1 // Affiche la version de XML
2 System . out . println ( document . getXmlVersion () ) ;
3
4 // Affiche l ' encodage
5 System . out . println ( document . getXmlEncoding () ) ;
6
7 // Affiche s ' il s ' agit d ' un document standalone
8 System . out . println ( document . getXmlStandalone () ) ;

A lexcution du programme, voici ce que vous devriez avoir lcran :

UTF -8
1.0
true

Si lon compare cet affichage au prologue du document XML, on se rend compte que
les informations correspondent bien.

tape 4 : rcupration de lElement racine

Dans cette quatrime tape, nous allons laisser de ct le prologue et tenter de nous
attaquer au corps du document XML. Pour ce faire, nous allons extraire lElement
racine du Document. Cest partir de lui que nous pourrons ensuite naviguer dans le
reste du document.
Pour rcuprer llment racine, il suffit dcrire de faire appel la fonction getDocu-
mentElement() de notre document :
1 final Element racine = document . getDocumentElement () ;

Une nouvelle fois, pour pouvoir utiliser la classe Element, le package suivant doit tre
import :

158
LIRE UN DOCUMENT XML

1 import org . w3c . dom . Element ;

Nous pouvons ds maintenant vrifier que ce que nous venons de rcuprer est bien
llment racine de notre document en affichant son nom :
1 System . out . println ( racine . getNodeName () ) ;

Aprs excution du programme, voici ce que vous devriez avoir lcran :

repertoire

tape 5 : rcupration des personnes

Cest partir de cette tape que les choses srieuses commencent ! En effet, dans cette
cinquime tape, nous allons rellement parcourir le corps de notre document XML.
Il est possible de parcourir un document XML sans connatre sa structure. Il est donc
possible de crer un code assez gnrique notamment grce la rcursivit. Cependant,
ce nest pas la mthode que jai choisi dutiliser dans ce chapitre. Nous allons donc
parcourir notre document en partant du principe que nous connaissons sa structure.
Pour rcuprer tous les noeuds enfants de la racine, voici la ligne de code crire :
1 final NodeList racineNoeuds = racine . getChildNodes () ;

Il vous faudra galement importer le package suivant :


1 import org . w3c . dom . NodeList ;

Nous pouvons galement nous amuser afficher le nom de chacun des nuds via le
code suivant :
1 final int nbRacineNoeuds = racineNoeuds . getLength () ;
2
3 for ( int i = 0 ; i < nbRacineNoeuds ; i ++) {
4 System . out . println ( racineNoeuds . item ( i ) . getNodeName () ) ;
5 }

Vous devriez alors avoir le rsultat suivant :

# text
# comment
# text
personne
# text

On retrouve bien notre balise <personne /> au milieu dautres nuds de type text et
comment. Nous allons maintenant lgrement modifier notre boucle afin de nafficher
lcran que les nuds tant des lments. Grce la mthode getNodeType() de la
classe Node :

159
CHAPITRE 17. DOM : EXEMPLE DUTILISATION EN JAVA

1 for ( int i = 0 ; i < nbRacineNoeuds ; i ++) {


2 if ( racineNoeuds . item ( i ) . getNodeType () == Node . ELEMENT_NODE )
{
3 final Node personne = racineNoeuds . item ( i ) ;
4 System . out . println ( personne . getNodeName () ) ;
5 }
6 }

A lexcution de votre programme, vous devriez normalement avoir le rsultat suivant :

personne

A noter : si vous avions voulu rcuprer le commentaire, nous aurions compar le type
de notre nud la constante Node.COMMENT_NODE.
Avant de passer laffichage de la suite du document XML, nous allons tenter dafficher
le sexe de la personne, qui pour rappel est un attribut. Il existe plusieurs manires de
faire plus ou moins gnriques. La mthode la plus gnrique est de faire appelle la
mthode getAttributes() de la classe Node qui nous renvoie lensemble des attributs
du nud. Dans notre cas, nous allons utiliser la mthode getAttribute(nom) qui nous
renvoie la valeur de lattribut spcifi en paramtre. Cette mthode nest cependant
pas accessible partir de la classe Node, il convient donc de caster notre nud en
un Element pour pouvoir lappeler :
1 for ( int i = 0 ; i < nbRacineNoeuds ; i ++) {
2 if ( racineNoeuds . item ( i ) . getNodeType () == Node . ELEMENT_NODE )
{
3 final Element personne = ( Element ) racineNoeuds . item ( i )
;
4 System . out . println ( personne . getNodeName () ) ;
5 System . out . println ( " sexe : " + personne . getAttribute ( "
sexe " ) ) ;
6 }
7 }

A lcran devrait alors safficher le rsultat suivant :

personne
sexe : masculin

tape 6 : rcupration du nom et du prnom

Nous allons maintenant rcuprer le nom et le prnom des personnes prsentes dans
notre document XML. Puisque nous savons exactement ce que lon souhaite rcuprer,
nous allons y accder directement via la mthode getElementsByTagName(name) de
lobjet Element. Cette mthode nous renvoie tous lments contenus dans llment
et portant le nom spcifi.
Pour mieux comprendre, voyons un exemple :

160
LIRE UN DOCUMENT XML

1 final NodeList noms = personne . getElementsByTagName ( " nom " ) ;

Ainsi, nous venons de rcuprer tous les lments dune personne ayant pour nom
nom . Dans notre cas, nous savons quune personne ne peut avoir quun seul prnom,
nous pouvons donc prciser que nous voulons le premier lment de la liste :
1 final Element nom = ( Element ) personne . getElementsByTagName ( "
nom " ) . item ( 0 ) ;

Finalement, si lon souhaite afficher le Text de la balise, il nous suffit dappeler la


mthode getTextContent() :
1 System . out . println ( nom . getTextContent () ) ;

Vous devriez alors voir safficher lcran le nom de la seule personne dclare dans
notre document XML :

DOE

Pour extraire le prnom dune personne, la logique est exactement la mme.

tape 7 : rcupration des numros de tlphone

La septime et dernire tape de la lecture de notre document XML consiste rcuprer


les numros de tlphone dune personne. La logique est sensiblement la mme que dans
ltape 1 si ce nest que le rsultat de la mthode getElementsByTagName(name) nous
renverra ventuellement plusieurs rsultats. Il suffit alors de boucler sur les rsultat
pour afficher les valeurs et les attributs.
Voici le code qui devrait tre crit :
1 final NodeList telephones = personne . getElementsByTagName ( "
telephone " ) ;
2 final int n b TelephonesElements = telephones . getLength () ;
3
4 for ( int j = 0 ; j < nbTelephonesElements ; j ++) {
5 final Element telephone = ( Element ) telephones . item ( j ) ;
6 System . out . println ( telephone . getAttribute ( " type " ) + " : " +
telephone . getTextContent () ) ;
7 }

Vous devriez alors voir safficher lcran la liste des numros de tlphones :

fixe : 01 02 03 04 05
portable : 06 07 08 09 10

Nous venons donc de lire ensemble notre premier document XML ! Pour ceux qui en
auraient besoin, vous trouverez le code complet du petit programme que nous venons
dcrire en suivant le code web suivant.

Voir le code
B
Code web : 758642

161
CHAPITRE 17. DOM : EXEMPLE DUTILISATION EN JAVA

Ecrire un document XML


Le document XML
Dans le chapitre prcdent, nous avons vu comment lire un document XML. Dans ce
chapitre, je vous propose den crer un de toute pice. Voici le document que nous
allons crer :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < repertoire >
3 <! -- John DOE -- >
4 < personne sexe = " masculin " >
5 < nom > DOE </ nom >
6 < prenom > John </ prenom >
7 < telephones >
8 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
9 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
10 </ telephones >
11 </ personne >
12 </ repertoire >

Je suis sr que vous le connaissez.

Mise en place du code


tape 1 : rcupration dune instance de la classe DocumentBuilderFac-
tory

Comme pour la lecture dun document XML, la premire tape consiste rcuprer
une instance de la classe DocumentBuilderFactory. Cest partir de cette instance que
notre parseur sera cr dans ltape suivante :
1 final D o c um ent Bui ld erF ac tor y factory = Doc um ent Bu ild erF ac tor y .
newInstance () ;

Noubliez pas dimporter le package :


1 import javax . xml . parsers . Do cu men tB uil de rFa cto ry ;

tape 2 : cration dun parseur

La seconde tape est galement commune la lecture dun document XML. Ainsi,
nous allons crer un parseur partir de notre variable factory cre dans ltape
prcdente :
1 final DocumentBuilder builder = factory . newDocumentBuilder () ;

Cette ligne de code saccompagne de limportation du package suivant :

162
ECRIRE UN DOCUMENT XML

1 import javax . xml . parsers . DocumentBuilder ;

Bien que nous layons dj vu dans le chapitre prcdent, noubliez pas quune exception
peut tre leve, cest pourquoi cette instruction doit tre place dans un bloc de type
try/catch :
1 try {
2 final DocumentBuilder builder = factory . newDocumentBuilder
() ;
3 }
4 catch ( final P a r s e r C o n f i g u r a t i o n E x c e p t i o n e ) {
5 e . printStackTrace () ;
6 }

La gestion de cette exception nous oblige galement importer le package suivant :


1 import javax . xml . parsers . P a r s e r C o n f i g u r a t i o n E x c e p t i o n ;

tape 3 : cration dun Document

La trosime tape consiste crer un Document vierge. Ce document est cr partir


de notre parseur :
1 final Document document = builder . newDocument () ;

Pour pouvoir utiliser la classe Document, noubliez pas dimporter le package suivant :
1 import org . w3c . dom . Document ;

tape 4 : cration de lElement racine

Dans cette quatrime tape, nous allons crer llment racine de notre document XML,
savoir la balise <repertoire />. La cration de llment racine se fait via notre
parseur et plus particulirement la fonction createElement() qui prend en paramtre
le nom que lon souhaite donner la balise :
1 final Element racine = document . createElement ( " repertoire " ) ;

A noter que lutilisation de la classe Element saccompagne de limportation du pa-


ckage :
1 import org . w3c . dom . Element ;

Maintenant que notre lment racine est dclar, nous pouvons lajouter notre docu-
ment :
1 document . appendChild ( racine ) ;

163
CHAPITRE 17. DOM : EXEMPLE DUTILISATION EN JAVA

tape 5 : cration dune personne

Si lon regarde le document XML que lon doit crer, on saperoit quavant de crer
la balise <personne/>, nous devons crer un commentaire.
La cration dun commentaire nest pas plus complique que la cration dune balise
et se fait via la fonction createComment() du parseur qui prend comme paramtre le
fameux commentaire :
1 final Comment commentaire = document . createComment ( " John DOE " ) ;

Pour pouvoir dclarer un commentaire, noubliez pas dimporter le package suivant :


1 import org . w3c . dom . Comment ;

Il convient ensuite dajouter notre commentaire la suite de notre document et plus


spcifiquement la suite de notre lment racine. Si lon se rfre larbre XML, le
commentaire est rellement un sous lment de llment racine. Cest pourquoi celui-ci
est ajout en tant quenfant de llment racine :
1 racine . appendChild ( commentaire ) ;

Nous pouvons maintenant nous attaquer la cration de la balise <personne />. Il


sagit dun lment au mme titre que llment racine que nous avons dj vu. Puisque
la balise est au mme niveau que le commentaire, il convient de lajouter en tant
quenfant de llment racine :
1 final Element personne = document . createElement ( " personne " ) ;
2 racine . appendChild ( personne ) ;

Si lon sarrte ici, on omet dajouter lattribut sexe pourtant prsent dans la balise
<personne /> du document XML que lon souhaite crer. Ajouter un attribut un
lment est en ralit trs simple et se fait via la mthode setAttribute() de la classe
Element. Cette mthode prend 2 paramtres : le nom de lattribut et sa valeur.
1 personne . setAttribute ( " sexe " , " masculin " ) ;

tape 6 : cration du nom et du prnom

En soit, la cration des balises <nom /> et <prenom /> na rien de compliqu. En effet,
nous avons dj cr ensemble plusieurs lments.
1 final Element nom = document . createElement ( " nom " ) ;
2 final Element prenom = document . createElement ( " prenom " ) ;
3
4 personne . appendChild ( nom ) ;
5 personne . appendChild ( prenom ) ;

Ici, La nouveaut concerne le renseignement de la valeur contenu dans les balises,


savoir John DOE dans notre exemple. Pour ce faire, il convient dajouter nos balises
un enfant de type Text. Cet enfant doit tre cr avec la mthode createTextNode()
du document qui prend en paramtre la valeur :

164
ECRIRE UN DOCUMENT XML

1 nom . appendChild ( document . createTextNode ( " DOE " ) ) ;


2 prenom . appendChild ( document . createTextNode ( " John " ) ) ;

tape 7 : cration des numros de tlphone

Je vais aller trs vite sur cette tape en vous fournissant directement le code source.
En effet, cette septime tape ne contient rien de nouveau par rapport ce que nous
avons vu jusquici :
1 final Element telephones = document . createElement ( " telephones " )
;
2
3 final Element fixe = document . createElement ( " telephone " ) ;
4 fixe . appendChild ( document . createTextNode ( " 01 02 03 04 05 " ) ) ;
5 fixe . setAttribute ( " type " , " fixe " ) ;
6
7 final Element portable = document . createElement ( " telephone " ) ;
8 portable . appendChild ( document . createTextNode ( " 06 07 08 09 10 " ) )
;
9 portable . setAttribute ( " type " , " portable " ) ;
10
11 telephones . appendChild ( fixe ) ;
12 telephones . appendChild ( portable ) ;
13 personne . appendChild ( telephones ) ;

tape 8 : affichage du rsultat

Il est maintenant temps de passer la dernire tape qui consiste afficher notre
document XML frachement cr. Deux possibilits soffrent nous :
Dans un document XML.
Dans la console de lIDE.
Ne vous inquitez pas, les 2 possibilits seront abordes dans ce tutoriel.
Pour pouvoir afficher notre document XML, nous allons avoir besoin de plusieurs objets
Java. Le premier est une instance de la classe TransformerFactory :
1 final Tra ns fo rmerFactory transformerFactory =
Tr an sf orm erFactory . newInstance () ;

La rcupration de cette instance saccompagne de limportation du package suivant :


1 import javax . xml . transform . TransformerFactory ;

Nous allons utiliser cette instance pour crer un objet Transformer. Cest grce lui
que nous pourrons afficher notre document XML par la suite :
1 final Transformer transformer = transformerFactory .
newTransformer () ;

165
CHAPITRE 17. DOM : EXEMPLE DUTILISATION EN JAVA

A noter que la fonction newTransformer() peut lever une exception de type Transfor-
merConfigurationException quil est important de capturer via un bloc catch.
Noubliez pas dimporter les packages suivants :
1 import javax . xml . transform . Transformer ;
2 import javax . xml . transform . T r a n s f o r m e r C o n f i g u r a t i o n E x c e p t i o n ;

Pour afficher le document XML, nous utiliserons la mthode transform() de notre


transformer. Cette mthode prend en compte 2 paramtres :
La source.
La sortie.
1 transformer . transform ( source , sortie ) ;

A noter quune exception de type TransformerConfiguration est susceptible dtre le-


ve :
1 import javax . xml . transform . TransformerException ;

En ce qui nous concerne, la source que lon souhaite afficher est notre document XML.
Cependant, nous ne pouvons pas passer notre objet document tel quel. Il convient de
le transformer lgrement sous la forme dun objet DOMSource :
1 final DOMSource source = new DOMSource ( document ) ;

Pour pouvoir utiliser cette classe, il convient dimporter le package suivant :


1 import javax . xml . transform . dom . DOMSource ;

Maintenant que nous avons la source, occupons nous de la sortie. La sortie est en ralit
un objet StreamResult. Cest ici que nous allons prciser si nous souhaitons afficher
notre document dans un fichier ou dans la console de notre IDE :
1 // Code utiliser pour afficher dans un fichier
2 final StreamResult sortie = new StreamResult ( new File ( " F :\\ file
. xml " ) ) ;
3
4 // Code utiliser pour afficher dans la console
5 final StreamResult sortie = new StreamResult ( System . out ) ;

Encore une fois, limportation dun package est ncessaire :


1 import javax . xml . transform . stream . StreamResult ;

Avant dexcuter notre programme, il nous reste encore quelques petits dtails rgler :
lcriture du prologue et le formatage de laffichage.
Commenons par le prologue. Nous allons renseigner ses diffrentes proprits via la
mthode setOutputProperty() de notre transformer qui prend en paramtre le nom du
paramtre et sa valeur :
1 transformer . setOutputProperty ( OutputKeys . VERSION , " 1 . 0 " ) ;
2 transformer . setOutputProperty ( OutputKeys . ENCODING , " UTF - 8 " ) ;
3 transformer . setOutputProperty ( OutputKeys . STANDALONE , " yes " ) ;

166
ECRIRE UN DOCUMENT XML

Pour pouvoir utiliser les constantes de la classe OutputKeys, il convient dimporter le


package suivant :
1 import javax . xml . transform . OutputKeys ;

Si nous excutons notre programme maintenant, tout sera crit sur une seule ligne,
ce qui nest pas trs lisible, vous en conviendrez. Cest pourquoi nous allons donner
quelques rgles de formatage notre transformer. En effet, ce que lon souhaite cest
que notre document soit indent. Chaque niveau diffrent de notre document XML
sera alors dcal de 2 espaces :
1 transformer . setOutputProperty ( OutputKeys . INDENT , " yes " ) ;
2 transformer . setOutputProperty ( " { http :// xml . apache . org / xslt }
indent - amount " , " 2 " ) ;

Nous venons donc de crer notre premier document XML ! Pour ceux qui en auraient
besoin, vous trouverez le code complet du petit programme que nous venons dcrire
en suivant le code web suivant.

Voir le code
B

Code web : 308908

En rsum
Vous savez maintenant lire et crire un document XML grce limplmentation
Java de lAPI DOM.
Exceptionnellement, il ny aura pas de TP sur cette technologie. En effet, DOM tant
implment dans de nombreux langages de programmation, il est impossible pour moi
de proposer une correction dans chacun des langages utiliss !

167
CHAPITRE 17. DOM : EXEMPLE DUTILISATION EN JAVA

168
Chapitre 18
XPath : Introduction lAPI

Difficult :

Dans les chapitres prcdents, nous avons tudi lune des technologies permettant dex-
ploiter les informations prsentes dans un document XML : lAPI DOM. Comme je vous le
disais prcdemment, dans cette troisime partie du cours, 2 technologies seront abordes.
Il nous en reste donc une voir : XPath.
Cette technologie qui repose sur lcriture dexpressions va nous permettre dextraire de
manire trs prcise les informations contenues dans un document XML.
Ce premier chapitre sera loccasion de faire connaissance avec XPath en revenant princi-
palement sur le vocabulaire connatre pour la manipuler.

169
CHAPITRE 18. XPATH : INTRODUCTION LAPI

Quest-ce que lAPI XPath ?

La petite histoire de XPath


XPath est une technologie qui permet dextraire des informations (lments, attributs,
commentaires, etc. . .) dun document XML via lcriture dexpressions dont la syntaxe
rappelle les expressions rationnelles utilises dans dautres langages.
Tout comme DOM, XPath est un standard du W3C et ce depuis sa premire version
en 1999. Au moment o jcris ces lignes, la technologie en est sa deuxime version.
Si XPath nest pas un langage de programmation en soit, cette technologie fournit
tout un vocabulaire pour crire des expressions permettant daccder directement aux
informations souhaites sans avoir parcourir tout larbre XML.

Un peu de vocabulaire
Avant dtudier de manire plus approfondie comment crire des expressions XPaths, il
convient de revenir sur quelques notions de vocabulaire qui seront indispensables pour
bien comprendre la suite du cours.
Pour ce faire, je vous propose de reprendre un document XML que nous avons dj vu
plusieurs fois dans ce cours et lutiliser pour illustrer les notions que nous allons voir :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < repertoire >
3 <! -- John DOE -- >
4 < personne sexe = " masculin " >
5 < nom > DOE </ nom >
6 < prenom > John </ prenom >
7 < telephones >
8 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
9 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
10 </ telephones >
11 </ personne >
12 </ repertoire >

Reprenons galement une illustration de son arbre (voir figure 18.3).


Pour rappel, voici la lgende la figure 18.2.

Parent

Le parent dun nud est le nud qui est directement au dessus de lui dun point de
vue hirarchique. Chaque nud a au moins un parent.
Par exemple, le nud repertoire est le parent du nud personne qui est lui mme
le parent des noeuds nom, prenom et telephones.

170
QUEST-CE QUE LAPI XPATH ?

Figure 18.1 Arbre XML dun document XML

Figure 18.2 Lgende de larbre XML

171
CHAPITRE 18. XPATH : INTRODUCTION LAPI

Enfant

Un nud a pour enfants tous les noeuds situs un niveau en dessous dans la hirarchie.
Un nud peut donc avoir une infinit denfants.
Par exemple, le nud repertoire a pour enfant le nud personne qui a lui mme
plusieurs enfants : les noeuds nom, prenom et telephones.

Descendant

Un nud a pour descendants tous les noeuds situs en dessous dans la hirarchie.
Un nud peut donc avoir une infinit de descendants.
Par exemple, le nud repertoire a pour descendants les nuds personne, nom,
prenom et telephones.

Anctre

Un nud a pour anctres tous les noeuds situs en dessus dans la hirarchie. Un nud
peut donc avoir plusieurs anctres.
Par exemple, le nud telephones a pour anctres les nuds personne et repertoire.

Frre

Un nud a pour frres tous les noeuds situs au mme niveau dans la hirarchie. Un
nud peut donc avoir une infinit de frres.
Par exemple, le nud nom a pour frres les nuds prenom et telephones.

Chemin relatif et chemin absolu


Vous laurez compris avec le chapitre prcdent, XPath est une technologie qui permet
dextraire des informations dun document XML via lcriture dexpressions. Concrte-
ment, ces expressions consistent dcrire le chemin emprunt dans larbre XML pour
atteindre les donnes qui nous intressent.
Reprenons le schma utilis jusquici pour illustrer le principe (voir figure 18.3).
Si je veux rcuprer par exemple le numro de fixe voici le chemin parcourir :
Etape 1 : nud repertoire .
Etape 2 : descendre au nud enfant personne .
Etape 3 : descendre au nud enfant telephones .
Etape 4 : descendre au nud enfant telephone dont lattribut est fixe .
Sans rentrer dans les dtails, lexpression XPath correspondante ressemblera quelque
chose comme a :

172
CHEMIN RELATIF ET CHEMIN ABSOLU

Figure 18.3 Arbre XML dun document XML

1 / tape1 / tape2 / tape3 / tape4

Si le principe est toujours le mme, il est possible dexprimer vos chemins de 2 manires :
Un chemin relatif.
Un chemin absolu.

Les chemins absolus


Le chemin absolu est le type de chemin que nous avons utilis dans notre exemple.
Le nud de dpart est toujours la racine de larbre XML.
Une expression XPath utilisant un chemin absolu est facilement identifiable car elle
commence par le caractre / .
Bien que nous ayons dj vu un exemple, je vous propose dillustrer cette dfinition par
un nouvel exemple dans lequel nous allons rcuprer le prnom de la personne dcrite
dans notre arbre XML :
Etape 1 : nud repertoire .
Etape 2 : descendre au nud enfant personne .
Etape 3 : descendre au nud enfant prenom .
Lexpression XPath correspondante ressemblera alors a :
1 / tape1 / tape2 / tape3

173
CHAPITRE 18. XPATH : INTRODUCTION LAPI

Les chemins relatifs


Si un chemin absolu est un chemin dont le nud de dpart est toujours la racine de
larbre XML, un chemin relatif accepte quant lui nimporte quel nud de larbre
XML comme point de dpart.
Une expression XPath utilisant un chemin relatif est facilement identifiable car elle ne
commence pas par le caractre / .
Comme pour les chemins absolus, je vous propose dillustrer cette nouvelle dfinition
par un exemple dans lequel nous allons rcuprer le prnom de la personne. Dans cet
exemple, notre point de dpart sera le nud dcrivant le numro de tlphone portable
de John DOE :
Etape 1 : nud telephone dont lattribut est portable .
Etape 2 : remonter au nud parent telephones .
Etape 3 : aller nud frre prenom .
Lexpression XPath correspondante ressemblera alors a :
1 tape1 / tape2 / tape3

En rsum
XPath est une technologie qui permet dextraire des informations dun document
XML via lcriture de dexpressions.
Parent, enfant, descendant, anctre et frre sont des notions importantes
comprendre afin de manipuler XPath.
Les expressions XPath peuvent tre crites laide dun chemin relatif ou absolu.

174
Chapitre 19
XPath : Localiser les donnes

Difficult :

Le chapitre prcdent, peu technique, a surtout t loccasion de faire connaissance avec le


vocabulaire utilis dans XPath. Je prfre vous prvenir, ce nouveau chapitre sera dense !
Nous allons aborder toutes les notions qui vous permettront dutiliser XPath afin dex-
ploiter facilement vos documents XML. Au programme donc : la dissection dtaille dune
tape et un peu de pratique via EditiX.

175
CHAPITRE 19. XPATH : LOCALISER LES DONNES

Dissection dune tape


Dans le chapitre prcdent, nous avons vu quune expression XPath est en ralit une
succession dtapes. Nous allons maintenant nous intresser de plus prs ce quest
une tape.
Une tape est dcrite par 3 lments :
Un axe.
Un nud ou un type de nud.
Un ou plusieurs prdicats (facultatif).
Avant de voir en dtail les valeurs possibles pour ces 3 lments, je vous propose de
revenir trs rapidement sur leurs rles respectifs.

Laxe

Laxe va nous permettre de dfinir le sens de la recherche. Par exemple, si lon souhaite
se diriger vers un nud enfant ou au contraire remonter vers un nud parent voir un
anctre.

Le nud

Ce second lment va nous permettre daffiner notre recherche en indiquant explicite-


ment le nom dun nud ou le type de nud dont les informations nous intressent.

Les prdicats

Comme prcis un peu plus haut, ce dernier lment est facultatif. Les prdicats, dont
le nombre nest pas limit, agissent comme un filtre et vont nous permettre de gagner
en prcision lors de nos recherches. Ainsi, grce aux prdicats, il sera par exemple
possible de slectionner les informations une position prcise.
Maintenant que nous savons comment former une tape, il nous reste apprendre la
syntaxe nous permettant de les ordonner et ainsi de pouvoir crire une tape compatible
avec XPath :
1 axe :: n ud [ predicat ][ predicat ]...[ predicat ]

Les axes
Comme nous lavons vu dans la partie prcdente, un axe est le premier lment for-
mant une tape. Son rle est de dfinir le sens de la recherche. Bien videmment, le
choix du sens est structur par un vocabulaire prcis que nous allons tudier mainte-
nant.

176
LES TESTS DE NUDS

Le tableau rcapitulatif

Nom de laxe Description


ancestor oriente la recherche vers les anctres du nud courant
ancestor-or-self oriente la recherche vers le nud courant et ses anctres
attribute oriente la recherche vers les attributs du nud courant
child oriente la recherche vers les enfants du nud courant
descendant oriente la recherche vers les descendants du nud courant
descendant-or-self oriente la recherche vers le nud courant et ses descendants
following oriente la recherche vers les nuds suivant le nud courant
following-sibling oriente la recherche vers les frres suivants du nud courant
parent oriente la recherche vers le pre du nud courant
preceding oriente la recherche vers les nuds prcdant le nud courant
preceding-sibling oriente la recherche vers les frres prcdents du nud courant
self oriente la recherche vers le nud courant

Pour votre culture gnrale, sachez quil existe galement un axe nomm
namespace qui permet dorienter la recherche vers un espace de noms. Je
lai volontairement retir du tableau rcapitulatif car nous ne lutiliserons pas
dans le cadre de ce tutoriel.

Quelques abrviations

Tout au long de notre dcouverte des axes, des tests de nuds et des prdicats, nous
allons dcouvrir quil est possible dutiliser des abrviations afin de rendre la syntaxe
de nos expressions XPath plus claire et concise.

Laxe child

Pour les axes, il existe une abrviation possible et elle concerne laxe child. En ralit,
lorsque lon souhaite orienter la recherche vers laxe child, ce nest pas ncessaire de le
prciser. Il sagit de laxe par dfaut.

Les tests de nuds


Nous venons donc de voir les diffrentes valeurs possibles pour slectionner un axe. Il
est donc maintenant temps dattaquer le second lment composant une tape : le nom
dun nud ou le type de nud.

177
CHAPITRE 19. XPATH : LOCALISER LES DONNES

Nom Description
nom du nud oriente la recherche vers le nud dont le nom a explicitement
t spcifi
* oriente la recherche vers tous les nuds
node() oriente la recherche vers tous les types de nuds (lments,
commentaires, attributs, etc.)
text() oriente la recherche vers les nuds de type texte
comment() oriente la recherche vers les nuds de type commentaire

Le tableau rcapitulatif

A noter : il existe galement dautres valeurs possibles comme par exemple


processing-instruction(). Je lai volontairement retir du tableau rcapitu-
latif car nous ne lutiliserons pas dans le cadre de ce tutoriel.

Quelques exemples
Puisque les prdicats sont facultatifs dans les expressions XPath, je vous propre de voir
dores et dj quelques exemples. Pour les exemples, nous allons nous appuyer sur le
document XML que nous avons dj utilis :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < repertoire >
3 <! -- John DOE -- >
4 < personne sexe = " masculin " >
5 < nom > DOE </ nom >
6 < prenom > John </ prenom >
7 < adresse >
8 < numero >7 </ numero >
9 < voie type = " impasse " > impasse du chemin </ voie >
10 < codePostal > 75015 </ codePostal >
11 < ville > PARIS </ ville >
12 < pays > FRANCE </ pays >
13 </ adresse >
14 < telephones >
15 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
16 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
17 </ telephones >
18 < emails >
19 < email type = " personnel " > john . doe@wanadoo . fr </ email >
20 < email type = " professionnel " > john . doe@societe . com </
email >
21 </ emails >
22 </ personne >
23 </ repertoire >

178
LES TESTS DE NUDS

Les chemins absolus

Nous allons dbuter par des exemples se basant sur lcriture dune expression utilisant
un chemin absolu.
Dans notre premier exemple, le but va tre de rcuprer le pays de domiciliation
de John DOE. Commenons par dcrire les tapes suivre en franais :
Etape 1 : descendre au nud repertoire .
Etape 2 : descendre au nud personne .
Etape 3 : descendre au nud adresse .
Etape 4 : descendre au nud pays .
Traduisons maintenant ces tapes sous la forme dexpressions XPath :
Etape 1 : child : :repertoire.
Etape 2 : child : :personne.
Etape 3 : child : :adresse.
Etape 4 : child : :pays.
Ce qui nous donne :
1 / child :: repertoire / child :: personne / child :: adresse / child :: pays

Il est possible de simplifier lcriture de cette expression. En effet, comme je lai dit
dans le chapitre sur les axes, laxe child est celui par dfaut, il nest donc pas ncessaire
de le prciser. Ainsi, il est possible de simplifier notre expression de la sorte :
1 / repertoire / personne / adresse / pays

Maintenant que vous tes un peu plus laise avec la syntaxe de XPath, je vous propose
de voir un exemple un peu plus exotique. Le but est de trouver maintenant lexpression
XPath permettant de trouver tous les commentaires de notre document XML.
Dans ce nouvel exemple, une seule tape est en ralit ncessaire et consiste slec-
tionner tous les descendants du nud racine qui sont des commentaires.
Tentons maintenant de traduire cette tape sous la forme dexpressions XPath :
On slectionne tous les descendants avec lexpression descendant.
On filtre les commentaires avec lexpression comment().
Ce qui nous donne :
1 / descendant :: comment ()

Les chemins relatifs

Aprs avoir vu quelques exemples dexpressions XPath utilisant des chemins absolus,
je vous propose de voir un exemple dune expression utilisant un chemin relatif. Dans
cet exemple, notre point de dpart sera le nud telephones . Une fois de plus, le
but va tre de rcuprer le pays de domiciliation de John DOE. Commenons par
dcrire les tapes suivre en franais :

179
CHAPITRE 19. XPATH : LOCALISER LES DONNES

Etape 1 : remonter au nud frre adresse .


Etape 2 : descendre au nud pays .
Traduisons maintenant ces tapes sous la forme dexpressions XPath :
Etape 1 : preceding-sibling : :adresse.
Etape 2 : pays.
Ce qui nous donne :
1 preceding - sibling :: adresse / pays

Quelques abrviations
Tout comme pour les axes, il existe quelques abrviations dont je vous conseille dabuser
afin de rendre vos expressions XPath plus lisibles et lgres.

Lexpression /descendant-or-self : :node()/

Dans nos expressions XPath, il est possible de remplacer lexpression /descendant-


or-self : :node()/ par // .
Ainsi, lexpression :
1 / descendant - or - self :: node () / pays

peut tre simplifie par :


1 // pays

Lexpression self : :node()

Notre deuxime abrviation va nous permettre de remplacer lexpression /self : :node()/


par . .
Ainsi, lexpression :
1 / repertoire / personne / self :: node ()

peut tre simplifie par :


1 / repertoire / personne /.

Lexpression parent : :node()

Notre dernire abrviation va nous permettre de remplacer lexpression /parent : :node()/


par .. .

180
LES PRDICATS

Les prdicats
Nous venons donc de voir deux des trois lments formant une tape dans une ex-
pression XPath. Dans ce chapitre, nous allons donc aborder llment manquant : les
prdicats.

Le tableau rcapitulatif

Nom du prdicat Description


attribute permet daffiner la recherche en fonction dun attribut
count() permet de compter le nombre de nuds
last() permet de slectionner le dernier nud dune liste
position() permet daffiner la recherche en fonction de la position
dun nud

A noter : il existe galement dautres valeurs possibles comme par exemple


name(), id() ou encore string-length(). Je les ai volontairement retires du
tableau rcapitulatif car nous ne lutiliserons pas dans le cadre de ce tutoriel.

Un prdicat peut galement contenir une expression XPath correspondant


une tape. Nous verrons notamment ce cas dans le TP.

Quelques exemples
Pour les exemples, nous allons continuer de nous appuyer sur le mme document XML :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < repertoire >
3 <! -- John DOE -- >
4 < personne sexe = " masculin " >
5 < nom > DOE </ nom >
6 < prenom > John </ prenom >
7 < adresse >
8 < numero >7 </ numero >
9 < voie type = " impasse " > impasse du chemin </ voie >
10 < codePostal > 75015 </ codePostal >
11 < ville > PARIS </ ville >
12 < pays > FRANCE </ pays >
13 </ adresse >
14 < telephones >
15 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
16 < telephone type = " portable " > 06 07 08 09 10 </
telephone >

181
CHAPITRE 19. XPATH : LOCALISER LES DONNES

17 </ telephones >


18 < emails >
19 < email type = " personnel " > john . doe@wanadoo . fr </ email >
20 < email type = " professionnel " > john . doe@societe . com </
email >
21 </ emails >
22 </ personne >
23 </ repertoire >

Premier exemple

Dans notre premier exemple, le but va tre de rcuprer le nud contenant le numro
de tlphone fixe de John DOE. Bien videmment, il existe plusieurs faon dy
arriver. Je vous propose dutiliser celle qui pousse le moins rflchir : nous allons
slectionner tous les descendants du nud racine et filtrer sur la valeur de lattribut
type. Ce qui nous donne :
1 / descendant ::*[ attribute :: type = " fixe " ]

Bien videmment, cette mthode est prescrire car elle peut avoir de nombreux effets
de bord. Il est possible de procder autrement en prcisant le chemin complet :
1 / repertoire / personne / telephones / telephone [ attribute :: type = " fixe
"]

Terminons ce premier exemple en slectionnant les numros de tlphones qui ne sont


pas des numros de tlphones fixes. Une fois de plus, il existe plusieurs faons de
procder. La premire, qui a priori est la plus simple, consiste remplacer dans notre
expression prcdente loprateur dgalit = par loprateur de non galit != :
1 / repertoire / personne / telephones / telephone [ attribute :: type != "
fixe " ]

Une autre mthode consiste utiliser la fonction not() :


1 / repertoire / personne / telephones / telephone [ not ( attribute :: type = "
fixe " ) ]

A noter : la double ngation nous fait revenir notre point de dpart. En effet, les 2
expressions suivantes sont quivalentes :
1 / repertoire / personne / telephones / telephone [ not ( attribute :: type !=
" fixe " ) ]

1 / repertoire / personne / telephones / telephone [ attribute :: type = " fixe


"]

182
UN EXEMPLE AVEC EDITIX

Deuxime exemple

Aprs avoir manipul les attributs, je vous propose maintenant de manipuler les posi-
tions. Ainsi, notre deuxime exemple consiste slectionner le premier numro de
tlphone de John DOE. Commenons par dtailler les tapes en franais :
Etape 1 : descendre au nud repertoire .
Etape 2 : descendre au nud personne .
Etape 3 : descendre au nud telephones .
Etape 4 : slectionner le premier nud telephone .
Traduisons maintenant ces tapes sous la forme dexpressions XPath :
Etape 1 : repertoire.
Etape 2 : personne.
Etape 3 : telephones.
Etape 4 : telephone[position()=1].
Ce qui nous donne :
1 / repertoire / personne / telephones / telephone [ position () = 1 ]

Si lon souhaite maintenant slectionner le dernier nud tlphone de la liste, on


modifiera lexpression de la manire suivante :
1 / repertoire / personne / telephones / telephone [ last () ]

Quelques abrviations
Comme pour les axes, nous nallons voir ici quune seule abrviation et elle concerne
le prdicat attribute quil est possible de remplacer par le symbole @ . Ainsi,
lexpression :
1 / repertoire / personne / telephones / telephone [ attribute :: type = " fixe
"]

devient :
1 / repertoire / personne / telephones / telephone [ @type = " fixe " ]

Un exemple avec EditiX


Pour conclure ce chapitre, je vous propose de voir comment excuter une expression
XPath avec EditiX.

Le document XML
Commencez par crer dans EditiX un document XML contenant les informations sui-
vantes :

183
CHAPITRE 19. XPATH : LOCALISER LES DONNES

1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2
3 < repertoire >
4 <! -- John DOE -- >
5 < personne sexe = " masculin " >
6 < nom > DOE </ nom >
7 < prenom > John </ prenom >
8 < adresse >
9 < numero >7 </ numero >
10 < voie type = " impasse " > impasse du chemin </ voie >
11 < codePostal > 75015 </ codePostal >
12 < ville > PARIS </ ville >
13 < pays > FRANCE </ pays >
14 </ adresse >
15 < telephones >
16 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
17 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
18 </ telephones >
19 < emails >
20 < email type = " personnel " > john . doe@wanadoo . fr </ email >
21 < email type = " professionnel " > john . doe@societe . com </
email >
22 </ emails >
23 </ personne >
24
25 <! -- Marie POPPINS -- >
26 < personne sexe = " feminin " >
27 < nom > POPPINS </ nom >
28 < prenom > Marie </ prenom >
29 < adresse >
30 < numero > 28 </ numero >
31 < voie type = " avenue " > avenue de la r publique </ voie >
32 < codePostal > 13005 </ codePostal >
33 < ville > MARSEILLE </ ville >
34 < pays > FRANCE </ pays >
35 </ adresse >
36 < telephones >
37 < telephone type = " bureau " > 04 05 06 07 08 </ telephone >
38 </ telephones >
39 < emails >
40 < email type = " professionnel " > contact@poppins . fr </
email >
41 </ emails >
42 </ personne >
43 </ repertoire >

184
UN EXEMPLE AVEC EDITIX

La vue XPath
Afin de pouvoir excuter des expressions XPath, nous allons devoir afficher la vue
ddie au sein de EditiX. Pour ce faire, vous pouvez slectionner
 dans la barre de menu

XMLpuis XPath viewou encore utiliser le raccourci clavier Ctrl + Shift + 4 .
La fentre visible la figure 19.1 doit alors apparatre.

Figure 19.1 Vue XPath dans EditiX

Comme vous pouvez le constater, cette vue se compose de plusieurs lments :


Un champ dans lequel toutes nos expressions seront crites.
2 boutons permettant de choisir si notre expression utilise un chemin relatif ou absolu.
Une puce permettant de choisir la version de XPath utiliser (prenez lhabitude de
travailler avec la version 2).
Des onglets permettant notamment dafficher les informations slectionnes par nos
expressions.

Excuter une requte


Dans cet ultime exemple, nous allons slectionner les nuds contenant des adresses
e-mails professionnelles grce lexpression suivante :
1 / repertoire / personne / emails / email [ attribute :: type = "
professionnel " ]

En thorie, nous devrions avoir 2 noeuds slectionns. Vrifions tout de suite la figure
19.2.
Le rsultat est bien celui souhait !

185
CHAPITRE 19. XPATH : LOCALISER LES DONNES

Figure 19.2 Rsultat dune expression XPath dans EditiX

En rsum
Une tape est compose dun axe, dun nud ou type de nud et dun ou
plusieurs prdicats .
Laxe par dfaut est laxe child.
De nombreuses abrviations permettent de simplifier lcriture des expressions XPath.

186
Chapitre 20
TP : des expressions XPath dans un
rpertoire

Difficult :

Aprs lapprentissage de lAPI DOM sans une relle pratique, il est temps de corriger le
tir ! Ce nouveau TP sera donc loccasion dcrire plusieurs expressions XPath destines
extraire les informations dun rpertoire contenu dans un document XML.
Bon courage !

187
CHAPITRE 20. TP : DES EXPRESSIONS XPATH DANS UN RPERTOIRE

Lnonc

Le document XML
Une fois de plus, cest avec un rpertoire tlphonique que nous allons travailler.
Voici les informations que lon connat pour chaque personne :
Son sexe (homme ou femme).
Son nom.
Son prnom.
Son adresse.
Un ou plusieurs numros de tlphone (tlphone portable, fixe, bureau, etc.).
Aucune ou plusieurs adresses e-mail (adresse personnelle, professionnelle, etc.).
Voici maintenant le document XML qui va nous servir de support :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < repertoire >
3 <! -- John DOE -- >
4 < personne sexe = " masculin " >
5 < nom > DOE </ nom >
6 < prenom > John </ prenom >
7 < adresse >
8 < numero >7 </ numero >
9 < voie type = " impasse " > impasse du chemin </ voie >
10 < codePostal > 75015 </ codePostal >
11 < ville > PARIS </ ville >
12 < pays > FRANCE </ pays >
13 </ adresse >
14 < telephones >
15 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
16 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
17 </ telephones >
18 < emails >
19 < email type = " personnel " > john . doe@wanadoo . fr </ email >
20 < email type = " professionnel " > john . doe@societe . com </
email >
21 </ emails >
22 </ personne >
23
24 <! -- Marie POPPINS -- >
25 < personne sexe = " feminin " >
26 < nom > POPPINS </ nom >
27 < prenom > Marie </ prenom >
28 < adresse >
29 < numero > 28 </ numero >
30 < voie type = " avenue " > avenue de la r publique </ voie >
31 < codePostal > 13005 </ codePostal >
32 < ville > MARSEILLE </ ville >

188
LNONC

33 < pays > FRANCE </ pays >


34 </ adresse >
35 < telephones >
36 < telephone type = " professionnel " > 04 05 06 07 08 </
telephone >
37 </ telephones >
38 < emails >
39 < email type = " professionnel " > contact@poppins . fr </
email >
40 </ emails >
41 </ personne >
42
43 <! -- Batte MAN -- >
44 < personne sexe = " masculin " >
45 < nom > MAN </ nom >
46 < prenom > Batte </ prenom >
47 < adresse >
48 < numero > 24 </ numero >
49 < voie type = " avenue " > impasse des h ros </ voie >
50 < codePostal > 11004 </ codePostal >
51 < ville > GOTHAM CITY </ ville >
52 < pays > USA </ pays >
53 </ adresse >
54 < telephones >
55 < telephone type = " professionnel " > 01 03 05 07 09 </
telephone >
56 </ telephones >
57 </ personne >
58 </ repertoire >


Copier ce code
B
Code web : 572860

Les expressions crire

Voici donc la liste des expressions XPath crire :


Slectionner tous les nuds descendants du deuxime nud personne .
Slectionner le nud personne correspondant au individu ayant au moins 2
numros de tlphone.
Slectionner tous les nuds personne .
Slectionner le deuxime nud personne dont le pays de domiciliation est la
France .
Slectionner tous les nuds personne de sexe masculin le pays de domiciliation
est les Etats-Unis.
Cest vous de jouer !

189
CHAPITRE 20. TP : DES EXPRESSIONS XPATH DANS UN RPERTOIRE

Une solution
Comme chaque fois, je vous fais part de ma solution.

Expression n1
Le but de cette premire expression tait de slectionner tous les nuds descendants
du deuxime nud personne :
1 / repertoire / personne [ position () = 2 ]/ descendant ::*

Expression n2
Le but de cette expression tait de slectionner le nud personne correspondant
un individu ayant au moins 2 numros de tlphone :
1 / repertoire / personne [ count ( telephones / telephone ) > 1 ]

Expression n3
Le but de cette troisime expression tait de slectionner tous les nuds personne :
1 / repertoire / personne

ou encore :
1 // personne

Expression n4
Le but de cette expression tait de slectionner le deuxime nud personne dont
le pays de domiciliation est la France :
1 / repertoire / personne [ adresse / pays = " FRANCE " ][ position () = 2 ]

Expression n5
Le but de la dernire expression tait de slectionner tous les nuds personne de
sexe masculin le pays de domiciliation est les Etats-Unis :
1 / repertoire / personne [ @sexe = " masculin " ][ adresse / pays = " USA " ]

190
Quatrime partie

Transformez vos documents


XML

191
Chapitre 21
Introduction XSLT

Difficult :

Tout au long de ce tutoriel, nous avons dcouvert de nombreuses technologies rgulirement


utilises en parallle dun document XML. Chaque technologie ayant un but trs prcis :
crire une dfinition ou encore exploiter les donnes contenus dans un document XML, par
exemple.
Dans cette quatrime partie, nous allons aborder une nouvelle technologie appele XSLT.
Cette technologie va nous permettre de transformer nos documents XML, cest--dire,
de crer de nouveaux documents partir des informations contenues dans un document
XML.
Comme dhabitude, nous allons dbuter en douceur. Ce premier chapitre a donc pour
objectif de faire connaissance avec la technologie qui va nous occuper dans les prochains
chapitres.

193
CHAPITRE 21. INTRODUCTION XSLT

Quest-ce que XSLT ?

La petite histoire du XSLT

XSLT ou eXtensible Stylesheet Language Transformations est une technologie


qui permet de transformer les informations dun document XML vers un autre type
de document comme un autre document XML ou encore une page web. Cest dailleurs
ce dernier cas que nous aborderons au cours de cette partie.
Comme toutes les technologies que nous avons abord dans ce tutoriel, XSLT est un
standard du W3C depuis 1999 pour sa premire version et 2007 pour sa seconde version.
Comme dautres technologies que nous avons vu jusquici, les documents XSLT sont
crits laide dun langage de type XML.
Si XLST permet de faire les transformations, la technologie sappuie sur une autre
technologie (que nous avons dj vue ensemble) pour slectionner des informations
transformer : XPath.
Si aviez saut la partie du tutoriel traitant de XPath ou si vous avez besoin de vous
rafrachir la mmoire, nhsitez pas relire la partie 3 du cours !

Comment a marche ?

Le principe de fonctionnement est assez simple : un document XSLT est associ


un document XML afin de crer un nouveau document dune nature diffrente ou
identique (voir figure 21.1).

Figure 21.1 Principe dune transformation XSLT

194
STRUCTURE DUN DOCUMENT XSLT

Structure dun document XSLT


Maintenant que vous en savez un peu plus sur cette nouvelle technologie, je vous
propose de dbuter en douceur notre apprentissage du XSLT en dcouvrant ensemble
la structure dun document.

Lextension du fichier
Comme ctait le cas pour les DTD et les schmas XML, nous allons prendre lhabi-
tude dcrire nos documents XSLT dans un fichier distinct du document XML dont
les donnes seront transformes.
Lextension porte par les documents XSLT est .xsl .

Le prologue
Puisque la technologie XSLT utilise un langage de type XML, nous nallons pas droger
la rgle du prologue.
Ainsi, la premire ligne dun document XSLT est :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >

Comme vous pouvez le constater, le prologue est identique ce que nous avons dj vu
pour les documents XML et les schmas XML. Si vous avez besoin de vous rafrachir
la mmoire sur les diffrents lments qui composent ce prologue, je vous invite relire
la partie 1 de ce tutoriel traitant du sujet.

Le corps
Le corps dun fichier XSLT, au mme titre quun document XML classique est consti-
tu dun ensemble de balises dont llment racine. Comme ctait dj le cas pour
un schma XML, llment racine dun document XSLT est impos.
1 < xsl : stylesheet version = " 1 . 0 " xmlns : xsl = " http :// www . w3 . org / 1999
/ XSL / Transform " >
2
3 </ xsl : stylesheet >

Comme vous pouvez le constater, llment racine est donc <xsl:stylesheet />.
On remarque la prsence de 2 attributs dans cet lment racine. Le premier est le
numro de version que lon souhaite utiliser. Dans le cadre de ce tutoriel, cest la
version 1 que nous allons utiliser. Bien quune version 2 existe, la premire version de
XSLT reste encore aujourdhui majoritairement utilise.
Le second attribut qui est xmlns :xsl nous permet de dclarer un espace de noms.
Une nouvelle fois, si vous ntes pas laise avec cette notion, je vous encourage lire
le chapitre ddi aux espaces de nom en annexe de ce tutoriel.

195
CHAPITRE 21. INTRODUCTION XSLT

Via la dclaration de cet espace de noms, toutes les balises utilises dans un document
XSLT doivent tre prfixes par xsl :.

La balise output
Directement aprs llment racine, nous allons prendre lhabitude de placer llment
<xsl:output />. Cet lment permet de dcrire le document produit lissue des
diffrentes transformations. Cet lment prend plusieurs attributs.

Lattribut method

Ce premier attribut permet de prciser le type du document produit lissue des


transformations. 3 valeurs existent :
xml si le document produire est un document XML.
html si le document produire est un document HTML.
text si le document produire est un document texte.

A noter : dans la seconde version de XSLT, il existe une quatrime valeur :


xhtml si le document produire est un document xHTML.

Lattribut encoding

Ce second attribut permet de prciser lencodage du document produit lissue des


transformations. Un grand nombre de valeurs existent pour renseigner la valeur de
lattribut encoding :
UTF-8.
ISO-8859-1.
etc.

Lattribut indent

Ce troisime attribut permet dindiquer si lon souhaite que le document produit


lissue des transformations soit indent ou non. 2 valeurs sont possibles :
Yes.
No.

Les autres attributs

2 autres attributs peuvent galement tre utiliss : doctype-public et doctype-


system.

196
STRUCTURE DUN DOCUMENT XSLT

Ces 2 attributs sont utiliss dans le cas o lon souhaite associer un document DTD au
document produit par la transformation XSLT.
Lattribut doctype-public permet de renseigner le FPI (Formal Public Identifier),
cest--dire lidentifiant public de la DTD.
Lattribut doctype-system, quant lui, permet de renseigner lURL de la DTD.
Maintenant que nous avons pass en revue tous les lments permettant de construire
la balise <xsl:output />, je vous propose de voir quelques exemples.
Notre premier exemple nous permet de prciser que lon souhaite produire un document
XML :
1 < xsl : output
2 method = " xml "
3 encoding = " UTF - 8 "
4 indent = " yes " / >

Voyons maintenant un exemple nous permettant de produire un document HTML 4 :


1 < xsl : output
2 method = " html "
3 encoding = " UTF - 8 "
4 doctype - public = " -// W3C // DTD HTML 4 . 01 // EN "
5 doctype - system = " http :// www . w3 . org / TR / html4 / strict . dtd "
6 indent = " yes " / >

Pour rsumer
Pour rsumer, voici quoi ressembleront nos documents XSLT :
1 <! -- le prologue -- >
2 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
3
4 <! -- l ' l ment racine -->
5 < xsl : stylesheet version =" 1 . 0 " xmlns : xsl =" http :// www . w3 . org / 1999
/ XSL / Transform " >
6
7 <! - - l ' l ment output -- >
8 < xsl : output
9 method = " html "
10 encoding = " UTF - 8 "
11 doctype - public = " -// W3C // DTD HTML 4 . 01 // EN "
12 doctype - system = " http :// www . w3 . org / TR / html4 / strict . dtd "
13 indent = " yes " / >
14
15 <! -- reste du document XSLT -- >
16
17 </ xsl : stylesheet >

197
CHAPITRE 21. INTRODUCTION XSLT

Rfrencer un document XSLT


Avant de continuer tudier la cration dun document XSLT, je vous propose de voir
comment rfrencer une transformation XSLT dans un document XML.

O et comment rfrencer un document XSLT ?


Le rfrencement dun document XSLT se fait au niveau du document XML dont les
informations seront utilises au cours de la transformation.
Ce rfrencement se fait via une petite ligne placer sous le prologue et avant llment
racine du document XML :
1 <? xml - stylesheet type = " text / xsl " href = " mon_document . xsl " ? >

Comme vous pouvez le voir, cette balise un peu spciale possde 2 attributs sur lesquels
il est intressant de revenir rapidement.

Lattribut type

Il permet de dfinir le type du document que nous souhaitons rfrencer. Dans notre
cas, puisquil sagit dun document XSLT, il convient de renseigner la clef text/xsl .

Lattribut href

Cet attribut, trs connu de ceux qui manipulent rgulirement le HTML et ses variantes,
permet dindiquer lURI du document que lon souhaite rfrencer.
Dans mon exemple, il sagit dun chemin relatif puisque le document XML et le docu-
ment XSLT sont situs dans le mme dossier.

Pour rsumer
Voici quoi nos fichiers XML ressembleront :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 <? xml - stylesheet type = " text / xsl " href = " mon_document . xsl " ? >
3 < racine >
4 <! -- contenu du document XML -- >
5 </ racine >

En rsum
Un document XSLT est associ un document XML afin de crer un nouveau
document.

198
RFRENCER UN DOCUMENT XSLT

Lextension porte par les documents XSLT est .xsl .


Un document XSLT doit tre rfrenc dans le document XML quil transforme.

199
CHAPITRE 21. INTRODUCTION XSLT

200
Chapitre 22
Les templates

Difficult :

Le chapitre prcdent nous a permis de dcouvrir la technologie XSLT et notamment la


structure gnrale dun document. Dans ce nouveau chapitre, nous allons nous attaquer
au corps dun document XSLT.
Le corps dun document XSLT est compos dun ensemble de templates. Cest cette
notion que nous allons approfondir dans ce chapitre. Nous allons voir, tape par tape,
comment crire un template et ainsi slectionner et exploiter les informations du document
XML transformer.

201
CHAPITRE 22. LES TEMPLATES

Introduction aux templates


Maintenant que vous savez quun document XSLT est compos dun ensemble de
templates, je vous propose de rentrer dans le vif du sujet et de dcouvrir ensemble
comment crire les diffrents templates qui composeront nos futurs documents XSLT.

Structure dun template


Un template est dfini par la balise <xsl:template /> laquelle plusieurs attributs
peuvent tre associs. Dans le cadre de ce tutoriel, nous renseignerons systmatique-
ment lun des 2 attributs suivants :
Lattribut match permet de renseigner une expression XPath. Cette expression
XPath permet alors de slectionner les informations du documents XML auxquelles
le template sapplique.
Lattribut name est le nom donn au template, permettant de lidentifier de ma-
nire unique. Cet attribut est important puisque nous verrons par la suite quil nai
pas rare quun template en appelle un autre.
1 < xsl : template
2 match = " expression XPath "
3 name = " nom du template "
4 >
5 <! -- contenu du template -- >
6 </ xsl : template >

Lorsque nous crirons nos templates, il est important de renseigner lun ou


lautre des 2 attributs match et name, jamais les deux en mme temps.
Nous verrons dans la suite de ce tutoriel que, suivant lattribut renseign, le
template ne sera pas utilis de la mme faon.

Aller plus loin


Pour aller plus loin, sachez quil existe dautres attributs comme par exemple les attri-
buts priority ou mode qui permettent respectivement de renseigner une priorit ou
un mode de traitement. Dans le cadre de ce tutoriel, nous ne les exploiterons pas et
nous nous contenterons dutiliser les attributs match et name.

Contenu dun template


Maintenant que nous avons vu la structure dun template, il convient dtudier le cur
dun template, cest--dire son contenu.

202
CONTENU DUN TEMPLATE

Introduction au contenu dun template


Le contenu dun template permet de dfinir les transformations appliquer len-
semble des donnes slectionnes par lexpression XPath qui lui est attache. Ce contenu
peut-tre de diffrentes natures. Ainsi, il est par exemple possible de simplement rem-
placer les informations slectionnes par du texte, ou dy appliquer des transformations
plus complexes laide de nombreuses fonctions que nous tudierons dans ce tutoriel.

Notre premier template


Afin dillustrer cette dfinition, je vous propose de voir ensemble un premier exemple
dans lequel nous allons crer un document HTML partir dun document XML.

Le document XML

1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 <? xml - stylesheet type = " text / xsl " href = " transformation . xsl " ? >
3 < personne >
4 < nom > BATTE </ nom >
5 < prenom > Man </ prenom >
6 </ personne >

Comme il est possible de le lire dans ce document XML, ce dernier est associ le
document XSLT transformation.xsl. Cest lui qui contient toutes les instructions qui
permettent de transformer les donnes du document XML en un document HTML.
Le document XSLT

Pour notre exemple, voici le contenu de du document transformation.xsl :


1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < xsl : stylesheet version = " 1 . 0 " xmlns : xsl = " http :// www . w3 . org / 1999
/ XSL / Transform " >
3 < xsl : output
4 method = " html "
5 encoding = " UTF - 8 "
6 doctype - public = " -// W3C // DTD HTML 4 . 01 // EN "
7 doctype - system = " http :// www . w3 . org / TR / html4 / strict . dtd "
8 indent = " yes " / >
9
10 < xsl : template match = " / " >
11 < html >
12 < head >
13 < title > Mon premier document XSLT </ title >
14 </ head >
15 < body >
16 <p > Bonjour ! </ p >
17 </ body >
18 </ html >

203
CHAPITRE 22. LES TEMPLATES

19 </ xsl : template >


20 </ xsl : stylesheet >

Revenons sur les diffrents lments qui composent ce document XSLT. Attardons
nous tout dabord sur la balise <xsl:output /> dont le contenu ne doit pas vous tre
inconnu. Les attributs de cette balise nous permettent dindiquer que nous souhaitons
un document HTML 4 dont le contenu sera indent et encod en UTF-8.
Regardons maintenant du ct de notre premier template. Nous pouvons nous aper-
cevoir quil possde lattribut select , qui slectionne toutes les donnes de notre
document XML via lexpression XPath / .
Revenons maintenant sur la relle nouveaut de ce document XSLT savoir, le contenu
du template. Ici, il sagit tout simplement de lcriture dun document HTML qui, en
ralit, nexploite absolument pas les donnes slectionnes dans le document XML.
Ainsi, le document produit suite lapplication de ce template sera toujours le mme,
peu importe les donnes fournies par le document XML. Ne vous inquitez pas, nous
verrons comment exploiter les donnes slectionnes dans la suite du tutoriel.

Le rsultat

Le document HTML produit par la transformation du document XML par le document


XSLT est donc le suivant :
1 <! DOCTYPE html
2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >
4 < head >
5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6 < title > Mon premier document XSLT </ title >
7 </ head >
8 < body >
9 <p > Bonjour ! </ p >
10 </ body >
11 </ html >

Plusieurs choses importantes sont noter. Tout dabord, on retrouve bien les infor-
mations que nous avions prcises dans la balise <xsl:output /> de notre document
XSLT savoir les informations sur le Doctype, les informations sur lencodage ainsi
que lindentation du document.

Les fonctions
Aprs avoir cr notre premier template dans le chapitre prcdent, je vous propose
maintenant de nous attaquer aux diffrentes fonctions que le XSLT met notre dispo-

204
LES FONCTIONS

sition. Ces fonctions vont nous permettre dexploiter les donnes slectionnes par nos
templates afin de procder des transformations plus ou moins complexes.
Dans la suite de ce chapitre, le document XML utilis sera le suivant :

1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 <? xml - stylesheet type = " text / xsl " href = " transformation . xsl " ? >
3 < repertoire >
4 <! -- John DOE -- >
5 < personne sexe = " masculin " >
6 < nom > DOE </ nom >
7 < prenom > John </ prenom >
8 < adresse >
9 < numero >7 </ numero >
10 < voie type = " impasse " > impasse du chemin </ voie >
11 < codePostal > 75015 </ codePostal >
12 < ville > PARIS </ ville >
13 < pays > FRANCE </ pays >
14 </ adresse >
15 < telephones >
16 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
17 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
18 </ telephones >
19 < emails >
20 < email type = " personnel " > john . doe@wanadoo . fr </ email >
21 < email type = " professionnel " > john . doe@societe . com </
email >
22 </ emails >
23 </ personne >
24
25 <! -- Marie POPPINS -- >
26 < personne sexe = " feminin " >
27 < nom > POPPINS </ nom >
28 < prenom > Marie </ prenom >
29 < adresse >
30 < numero > 28 </ numero >
31 < voie type = " avenue " > avenue de la r publique </ voie >
32 < codePostal > 13005 </ codePostal >
33 < ville > MARSEILLE </ ville >
34 < pays > FRANCE </ pays >
35 </ adresse >
36 < telephones >
37 < telephone type = " professionnel " > 04 05 06 07 08 </
telephone >
38 </ telephones >
39 < emails >
40 < email type = " professionnel " > contact@poppins . fr </
email >
41 </ emails >
42 </ personne >

205
CHAPITRE 22. LES TEMPLATES

43
44 <! -- Batte MAN -- >
45 < personne sexe = " masculin " >
46 < nom > MAN </ nom >
47 < prenom > Batte </ prenom >
48 < adresse >
49 < numero > 24 </ numero >
50 < voie type = " avenue " > impasse des h ros </ voie >
51 < codePostal > 11004 </ codePostal >
52 < ville > GOTHAM CITY </ ville >
53 < pays > USA </ pays >
54 </ adresse >
55 < telephones >
56 < telephone type = " professionnel " > 01 03 05 07 09 </
telephone >
57 </ telephones >
58 </ personne >
59 </ repertoire >

Copier ce code
B
Code web : 996683


Afin de gagner en clart, je ne vais pas rcrire chaque fois la totalit du document
XSLT utilis. Je me contenterai dcrire uniquement lunique template que notre do-
cument contiendra. Ainsi, la structure gnrale du document transformation.xsl est
la suivante :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < xsl : stylesheet version = " 1 . 0 " xmlns : xsl = " http :// www . w3 . org / 1999
/ XSL / Transform " >
3 < xsl : output
4 method = " html "
5 encoding = " UTF - 8 "
6 doctype - public = " -// W3C // DTD HTML 4 . 01 // EN "
7 doctype - system = " http :// www . w3 . org / TR / html4 / strict . dtd "
8 indent = " yes " / >
9
10 <! -- template -- >
11
12 </ xsl : stylesheet >

La fonction value-of

Syntaxe et explications
La fonction <xsl:value-of />, que lon peut traduire en franais par valeur de ,
nous permet dextraire la valeur dun lment XML ou la valeur de ses attributs.

206
LA FONCTION VALUE-OF

Cette fonction possde un attribut select auquel il convient de renseigner une expres-
sion XPath permettant alors de slectionner les informations extraire :
1 < xsl : value - of select = " expression XPath " / >

Exemple
titre dexemple, je vous propose dcrire un template qui va afficher le type du numro
de tlphone et le numro en lui mme de Marie POPPINS :
1 < xsl : template match = " / " >
2 < html >
3 < head >
4 < title > Test de la fonction value - of </ title >
5 </ head >
6 < body >
7 <p > Type du num ro : < xsl : value - of select = "
repertoire / personne [ nom = ' POPPINS ']/ telephones /
telephone / @type " / > </ p >
8 <p > Num ro : < xsl : value - of select = " repertoire /
personne [ nom = ' POPPINS ']/ telephones / telephone " / >
</ p >
9 </ body >
10 </ html >
11 </ xsl : template >

Comme vous pouvez le constater, notre template contient 2 fonctions <xsl:value-of


/>. La premire extrait lattribut type de lunique numro de tlphone de Marie
POPPINS, tandis que le seconde extrait la valeur de llment proprement parler, le
tout grce des expressions XPath.
Le document HTML produit est alors le suivant :
1 <! DOCTYPE html
2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >
4 < head >
5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6
7 < title > Test de la fonction value - of </ title >
8 </ head >
9 < body >
10 <p > Type du num ro : professionnel </ p >
11 <p > Num ro : 04 05 06 07 08 </ p >
12 </ body >
13 </ html >

207
CHAPITRE 22. LES TEMPLATES

La fonction for-each
Syntaxe et explications
La fonction <xsl:for-each />, que lon peut traduire en franais par pour chaque
est une fonction qui permet de boucler sur un ensemble dlments.
Par exemple, si lon souhaite appliquer une transformation lensemble des numros
de tlphone dune personne, nous allons tous les slectionner laide dune expres-
sion XPath, puis, grce la fonction <xsl:for-each />, il sera possible de parcourir
lensemble des rsultats obtenus pour y appliquer une transformation particulire.
Comme pour la fonction <xsl:value-of />, la fonction <xsl:for-each /> possde
un attribut select auquel il convient de renseigner une expression XPath permettant
alors de slectionner les informations extraire :
1 < xsl : for - each select = " expression XPath " / >

Exemple
Pour illustrer lutilisation de la fonction <xsl:for-each />, je vous propose dcrire
un template qui va afficher pour chaque adresse e-mail de John DOE son type et son
contenu :
1 < xsl : template match = " / " >
2 < html >
3 < head >
4 < title > Test de la fonction for - each </ title >
5 </ head >
6 < body >
7 < xsl : for - each select = " repertoire / personne [ nom = ' DOE
']/ emails / email " >
8 <p > Type de l ' adresse e - mail : < xsl : value - of
select =" @type " / > </p >
9 <p > adresse e - mail : < xsl : value - of select ="."
/ > </p >
10 </ xsl : for - each >
11 </ body >
12 </ html >
13 </ xsl : template >

Comme vous pouvez le constater, notre template contient une fonction <xsl:for-each/>
dont le rle est de slectionner lensemble des adresse e-mails de John DOE. A lin-
trieur de cette fonction, nous sommes alors capable dexploiter individuellement les
diffrentes adresses grce la fonction <xsl:value-of /> que nous avons vu prc-
demment.
Le document HTML produit est alors le suivant :
1 <! DOCTYPE html

208
LA FONCTION SORT

2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >
4 < head >
5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6 < title > Test de la fonction for - each </ title >
7 </ head >
8 < body >
9 <p > Type de l ' adresse e - mail : personnel </ p >
10 <p > adresse e - mail : john . doe@wanadoo . fr </ p >
11 <p > Type de l ' adresse e - mail : professionnel </ p >
12 <p > adresse e - mail : john . doe@societe . com </ p >
13 </ body >
14 </ html >

La fonction sort
Syntaxe et explications
La fonction <xsl:sort /> est une fonction qui permet de trier un ensemble dlments
par ordre croissant ou dcroissant.
Puisque lon souhaite trier un ensemble dlments, la fonction <xsl:sort /> est gn-
ralement utilise au sein de la fonction <xsl:for-each /> que nous venons de voir. Elle
possde au moins un attribut select auquel il convient de renseigner une expression
XPath permettant alors de slectionner les informations trier.
La fonction <xsl:sort /> accepte galement dautres attributs qui sont cependant
optionnels :
Order qui accepte les valeurs ascending (croissant) et descending (dcroissant)
permet de prciser le sens du tri. Par dfaut, cest un tri croissant qui est effec-
tu.</puce>
Case-order qui accepte les valeurs upper-first (les majuscules dabord) et lower-
first (les minuscules dabord) permet de prciser qui des majuscules et des minuscules
est prioritaire pour effectuer les tri.</puce>
Data-type qui accepte les valeurs text (texte) et number (nombre) permet prciser
si les donnes trier sont des nombres ou du texte.</puce>
Lang qui accepte pour valeur le code dune langue (fr pour la langue franaise, es
pour la langue espagnole, it pour litalien, etc.) qui permet de prciser la langue des
lments trier. Cet attribut est notamment utile afin de trier des lments dont la
langue possde quelques caractres spcifiques comme par exemple le norvgien, le
sudois, etc.</puce>
1 < xsl : sort select = " expression XPath " order = " ascending | descending
" case - order = " upper - first | lower - first " data - type = " text |
number " lang = " fr | es | it |... " / >

209
CHAPITRE 22. LES TEMPLATES

Exemple

Pour illustrer lutilisation de la fonction <xsl:sort />, je vous propose dcrire un


template qui va afficher le nom et le prnom des personnes contenues dans notre docu-
ment XML, par ordre alphabtique :

1 < xsl : template match = " / " >


2 < html >
3 < head >
4 < title > Test de la fonction sort </ title >
5 </ head >
6 < body >
7 < xsl : for - each select = " repertoire / personne " >
8 < xsl : sort select = " nom " / >
9 < xsl : sort select = " prenom " / >
10 <p > < xsl : value - of select = " nom " / > &# 160 ; < xsl :
value - of select = " prenom " / > </ p >
11 </ xsl : for - each >
12 </ body >
13 </ html >
14 </ xsl : template >

Notre template contient une fonction <xsl:for-each/> permettant de boucler sur


toutes les personnes contenu dans notre document XML. Il contient galement deux
fonctions <xsl:sort /> permettant de trier par ordre alphabtique de nom et prnom
lensemble des personnes. noter : le caractre &#160 ; est un caractre qui une
fois la transformation effectue sera simplement remplac par un espace dans notre
document HTML.
Le document HTML produit est le suivant :

1 <! DOCTYPE html


2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >
4 < head >
5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6 < title > Test de la fonction sort </ title >
7 </ head >
8 < body >
9 <p > DOE \&\# 160 ; John </ p >
10 <p > MAN \&\# 160 ; Batte </ p >
11 <p > POPPINS \&\# 160 ; Marie </ p >
12 </ body >
13 </ html >

210
LA FONCTION IF

La fonction if

Syntaxe et explications
La fonction <xsl:if /> est une fonction qui permet de conditionner une transforma-
tion. Par exemple, grce cette fonction, il sera possible de nappliquer une transfor-
mation quaux personnes de sexe masculin.
Cette fonction possde un attribut test auquel il convient de renseigner la condition.
Cette condition peut-tre la comparaison dune chane de caractres ou de nombres.
1 < xsl : if test = " test de comparaison " / >

Les tests
En XSLT, il existe plusieurs types de tests disponibles. Le tableau suivant les rsume
et les explique :

Condition Explication
a=b Cette condition vrifie que la valeur de llment a est gale
la valeur de llment b.
not(a = b) Cette condition vrifie que la valeur de llment a nest pas
gale la valeur de llment b.
a=b Cette condition vrifie que la valeur de llment a est gale
la valeur de llment b.
a &lt ; b Le symbole &lt ; (lower than) traduit en ralit le symbole <.
La condition est donc en ralit la suivante : a < b. Cette
condition vrifie que la valeur de llment a est strictement
infrieure la valeur de llment b.
a &lt ;= b Le symbole &lt ; (lower than) traduit en ralit le symbole <.
La condition est donc en ralit la suivante : a <= b. Cette
condition vrifie que la valeur de llment a est infrieure ou
gale la valeur de llment b.
a &gt ; b Le symbole &gt ; (greater than) traduit en ralit le symbole
>. La condition est donc en ralit la suivante : a > b. Cette
condition vrifie que la valeur de llment a est strictement
suprieure la valeur de llment b.
a &gt ;= b Le symbole &gt ; (greater than) traduit en ralit le symbole
>. La condition est donc en ralit la suivante : a > b. Cette
condition vrifie que la valeur de llment a est suprieure ou
gale la valeur de llment b.

Il est est galement possible deffectuer plusieurs tests la fois. Ainsi, nous pouvons :
Vrifier quun premier test est vrai ET quun second lest galement.</puce>
Vrifier quun premier test est vrai OU quun second lest.</puce>

211
CHAPITRE 22. LES TEMPLATES

Dans un test, pour traduire la notion de ET, on utilise le mot anglais and, tandis que
pour traduire la notion de OU, on utilise sa traduction anglaise or.
Voyons quelques exemples afin dillustrer toutes ces notions. Par exemple, si lon sou-
haite vrifier que la valeur dun lment a est strictement suprieure un lment b
ET un lment c, on crira :
1 < xsl : if test = " a > b and a > c " >
2 <! -- contenu de la condition -- >
3 </ xsl : if >

Voyons la condition crire si lon souhaite vrifier que la valeur dun lment a est
gale la valeur dun lment b OU gale la valeur dun lment c :
1 < xsl : if test = " a = b or a = c " >
2 <! -- contenu de la condition -- >
3 </ xsl : if >

Exemple
Pour illustrer lutilisation de la fonction <xsl:if />, je vous propose dcrire un tem-
plate qui va afficher le nom et le prnom des personnes de sexe masculin contenues
dans notre document XML :
1 < xsl : template match = " / " >
2 < html >
3 < head >
4 < title > Test de la fonction if </ title >
5 </ head >
6 < body >
7 < xsl : for - each select = " repertoire / personne " >
8 < xsl : if test = " @sexe = ' masculin ' " >
9 <p > < xsl : value - of select = " nom " / > &# 160 ; < xsl :
value - of select = " prenom " / > </ p >
10 </ xsl : if >
11 </ xsl : for - each >
12 </ body >
13 </ html >
14 </ xsl : template >

Notre template parcourt donc lensemble des personnes contenues dans notre document
XML grce la fonction <xsl:for-each/>. Grce la fonction <xsl:if/>, il est
possible dappliquer la suite de la transformation uniquement aux personnes de sexe
masculin.
Le document HTML produit est le suivant :
1 <! DOCTYPE html
2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >

212
LA FONCTION CHOOSE

4 < head >


5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6 < title > Test de la fonction if </ title >
7 </ head >
8 < body >
9 <p > DOE & nbsp ; John </ p >
10 <p > MAN & nbsp ; Batte </ p >
11 </ body >
12 </ html >

La fonction choose
Syntaxe et explications
La fonction <xsl:choose />, tout comme la fonction <xsl:id />, permet de condi-
tionner des transformations. En ralit, la fonction <xsl:choose /> ne sutilise pas
toute seule. En effet, elle permet plusieurs conditions. Ainsi, dans le cas o la premire
condition nest pas remplie, la seconde va tre teste, puis la troisime, etc. Dans le cas
o aucune condition nest remplie, un cas par dfaut peut-tre prvu.
Les conditions inclues dans la fonction <xsl:choose /> sexpriment grce la fonction
<xsl:when />. Le cas par dfaut sexprime quant lui grce la fonction <xsl:otherwise
/>.
La fonction <xsl:when /> possde un attribut test auquel il convient de renseigner
une condition.
1 < xsl : choose >
2 < xsl : when test = " test de comparaison " >
3 <! -- suite de la transformation -- >
4 </ xsl : when >
5 < xsl : when test = " test de comparaison " >
6 <! -- suite de la transformation -- >
7 </ xsl : when >
8 < xsl : otherwise >
9 <! -- suite de la transformation -- >
10 </ xsl : otherwise >
11 </ xsl : choose >

Le nombre de fonction <xsl:when /> varie en fonction du nombre de conditions que


vous souhaitez tester.

Exemple
Pour illustrer lutilisation de la fonction <xsl:choose />, je vous propose dcrire un
template qui suivant le nom des personnes contenues dans le document XML, affichera

213
CHAPITRE 22. LES TEMPLATES

une phrase personnalise. Ainsi, pour John DOE, la phrase afficher sera Bonjour
John ! , pour Marie POPPINS, la phrase afficher sera Quel beau sac ! . Dans
tous les autres cas, la phrase afficher sera Qui tes-vous ? .
1 < xsl : template match = " / " >
2 < html >
3 < head >
4 < title > Test de la fonction sort </ title >
5 </ head >
6 < body >
7 < xsl : for - each select = " repertoire / personne " >
8 < xsl : choose >
9 < xsl : when test = " nom = 'DOE ' " >
10 <p > Bonjour John ! </ p >
11 </ xsl : when >
12 < xsl : when test = " nom = ' POPPINS ' " >
13 <p > Quel beau sac ! </ p >
14 </ xsl : when >
15 < xsl : otherwise >
16 <p > Qui tes - vous ? </ p >
17 </ xsl : otherwise >
18 </ xsl : choose >
19 </ xsl : for - each >
20 </ body >
21 </ html >
22 </ xsl : template >

Puisque les personnes de notre document XML seront traites dans leur ordre dap-
parition de notre document XML, les phrases seront affiches dans cet ordre dans le
document HTML produit :
Bonjour John !</puce>
Quel beau sac !</puce>
Qui tes-vous ?</puce>
Cest effectivement le cas lorsquon regarde le document HTML produit :
1 <! DOCTYPE html
2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >
4 < head >
5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6 < title > Test de la fonction sort </ title >
7 </ head >
8 < body >
9 <p > Bonjour John ! </ p >
10 <p > Quel beau sac ! </ p >
11 <p > Qui & ecirc ; tes - vous ? </ p >
12 </ body >
13 </ html >

214
LA FONCTION APPLY-TEMPLATES

La fonction apply-templates
Syntaxe et explications
La fonction <xsl:apply-templates />, permet de continuer la transformation des
lments enfants dun template.
Dans le cadre de ce tutoriel, nous allons uniquement considrer lattribut select de la
fonction <xsl:apply-templates /> quil convient de renseigner laide dune expres-
sion XPath.
1 < xsl : apply - templates select = " expression XPath " / >

Exemple
Pour illustrer lutilisation de la fonction <xsl:apply-templates />, je vous propose
de dcortiquer ensemble le template.
Tout dabord, considrons un document XML un peu plus simple que celui que nous
utilisions jusqu maintenant :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 <? xml - stylesheet type = " text / xsl " href = " transformation . xsl " ? >
3 < repertoire >
4 <! -- John DOE -- >
5 < personne sexe = " masculin " >
6 < nom > DOE </ nom >
7 < prenom > John </ prenom >
8 </ personne >
9
10 <! -- Marie POPPINS -- >
11 < personne sexe = " feminin " >
12 < nom > POPPINS </ nom >
13 < prenom > Marie </ prenom >
14 </ personne >
15
16 <! -- Batte MAN -- >
17 < personne sexe = " masculin " >
18 < nom > MAN </ nom >
19 < prenom > Batte </ prenom >
20 </ personne >
21 </ repertoire >

Considrons alors les templates suivants :


1 < xsl : template match = " / " >
2 < html >
3 < head >
4 < title > Test de la fonction apply - templates </ title >
5 </ head >

215
CHAPITRE 22. LES TEMPLATES

6 < body >


7 < xsl : apply - templates select = " repertoire / personne [
nom = ' POPPINS '] " / >
8 </ body >
9 </ html >
10 </ xsl : template >
11
12 < xsl : template match = " nom " >
13 <p > < xsl : value - of select = " . " / > </ p >
14 </ xsl : template >
15
16 < xsl : template match = " prenom " >
17 <p > < xsl : value - of select = " . " / > </ p >
18 </ xsl : template >

A lexcution de la transformation XSLT, le premier template tre appel est le tem-


plate dont lexpression XPath capture la racine de notre document XML. Dans ce tem-
plate, la ligne <xsl:apply-templates select="repertoire/personne[nom=POPPIN
S]" /> permet dindiquer que lon souhaite continuer la transformation uniquement
avec llment <personne /> correspondant Marie POPPINS ainsi que ses fils sa-
voir les lments <nom /> et <prenom />. Llment <nom /> va donc tre transform
grce au second template crit dans notre document XSLT puisque son expression
XPath le capture. Finalement, en suivant la mme logique, llment <prenom /> va,
quant lui, tre transform grce au dernier template de notre document XSLT.
Le document HTML produit est alors le suivant :
1 <! DOCTYPE html
2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >
4 < head >
5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6 < title > Test de la fonction sort </ title >
7 </ head >
8 < body >
9 <p > POPPINS </ p >
10 <p > Marie </ p >
11 </ body >
12 </ html >

Afin de bien comprendre le mcanisme, je vous propose maintenant de jeter un coup


dil aux templates suivant :
1 < xsl : template match = " / " >
2 < html >
3 < head >
4 < title > Test de la fonction apply - templates </ title >
5 </ head >
6 < body >

216
LA FONCTION APPLY-TEMPLATES

7 < xsl : apply - templates select = " repertoire / personne [


nom = ' POPPINS ']/ nom " / >
8 </ body >
9 </ html >
10 </ xsl : template >
11
12 < xsl : template match = " nom " >
13 <p > < xsl : value - of select = " . " / > </ p >
14 </ xsl : template >
15
16 < xsl : template match = " prenom " >
17 <p > < xsl : value - of select = " . " / > </ p >
18 </ xsl : template >

Comme pour notre premier exemple, lexcution de la transformation XSLT, le


premier template tre appel est le template dont lexpression XPath capture la
racine de notre document XML. Dans ce template, la ligne <xsl:apply-templates
select="repertoire/personne[nom=POPPINS]/nom" /> permet dindiquer que lon
souhaite continuer la transformation uniquement avec llment <nom /> de la <personne
/> correspondant Marie POPPINS. Llment <nom /> va donc tre transform
grce au second template de notre document XSLT. Le dernier template ne sera quant
lui jamais appel.
Le document HTML produit est alors le suivant :
1 <! DOCTYPE html
2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >
4 < head >
5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6
7 < title > Test de la fonction sort </ title >
8 </ head >
9 < body >
10 <p > POPPINS </ p >
11 </ body >
12 </ html >

En rsum
Les templates possdent systmatiquement lun des 2 attributs : match ou name.
Les templates se construisent laide de nombreuses fonctions.

217
CHAPITRE 22. LES TEMPLATES

218
Chapitre 23
Les templates : aller plus loin

Difficult :

Dans le chapitre prcdent, nous avons vu un grand nombre de fonctions utiliser dans nos
templates. Ne nous arrtons pas en si bon chemin, il nous reste encore quelques fonctions
voir ! Ces nouvelles fonctions seront galement loccasion daborder de nouveaux concepts
savoir, les variables et les paramtres.
Ce nouveau chapitre sera galement loccasion dapprendre crer et excuter une trans-
formation XSLT dans EditiX.

219
CHAPITRE 23. LES TEMPLATES : ALLER PLUS LOIN

Les variables et la fonction call-template

Au cours de ce chapitre, je vous propose daborder une nouvelle notion bien connue en
informatique et plus prcisment dans les langages de programmations : les variables.
Ce chapitre sera galement loccasion dune mise en pratique de cette nouvelle notion
travers lapprhension dune nouvelle fonction pour nos template : call-template.

Les variables

Dfinition

En XSLT, comme dans de nombreuses technologies informatiques et plus prcisment


dans les langages de programmation, il existe une notion importante que lon appelle
les variables.
Une variable est une information que lon stocke dans la mmoire de lordinateur afin
de pouvoir la rutiliser. Elle possde un identifiant unique qui est son nom. Ainsi,
plusieurs variables ne peuvent pas avoir le mme nom. Linformation stocke par une
variable est sa valeur.
Dans nos documents XSLT, les variables doivent tre dclares au sein dun template
et ont une porte dite locale, cest--dire quune variable ne peut tre utilise que
dans le template dans lequel elle est dclare. Par exemple, si une variable portant le
nom maVariable est dclare dans un premier template, les autres templates du
document XSLT ne la connaissent pas.

Dclaration et utilisation

Afin de dclarer une variable, il convient dutiliser la fonction <xsl:variable />. Cette
fonction accepte deux attributs :
Name : cest le nom que lon souhaite donner notre variable, ce nom va nous
permettre de lidentifier de manire unique.
Select : cet attribut optionnel accepte soit une expression XPath qui permet de
slectionner la valeur que lon souhaite stocker dans notre variable, soit une chane
de caractres.
La syntaxe pour dclarer une variable est donc la suivante :

1 < xsl : variable name = " nom_de_la_variable " select = " expression
XPath | cha ne de caract res " / >

Pour pouvoir utiliser une variable et rcuprer la valeur quelle contient, il convient de
faire prcder son nom par le symbole $ .

220
LES VARIABLES

Exemple
Afin dillustrer ce que nous venons dapprendre sur les variables, je vous propose de
voir ensemble quelques exemples. Dans notre premier exemple, nous allons crer une
variable qui contiendra une chane de caractres et nous lafficherons dans une balise
paragraphe dune document HTML :
1 < xsl : template match = " / " >
2 < xsl : variable name = " couleur " select = " ' rouge ' " / >
3
4 < html >
5 < head >
6 < title > Test des variables </ title >
7 </ head >
8 < body >
9 <p > < xsl : value - of select = " $ couleur " / > </ p >
10 </ body >
11 </ html >
12 </ xsl : template >

Comme vous pouvez le constater, dans ce template, nous dclarons une variable qui
sappelle couleur et qui contient la chane de caractres rouge :
1 < xsl : variable name = " couleur " select = " ' rouge ' " / >

Puisque la valeur rouge est une chane de caractres, il est impratif de la mettre
entre (guillemets simples) afin de ne pas la confondre avec une expression XPath.
Pour pouvoir afficher la valeur contenue dans la variable dans notre document HTML,
il suffit simplement de faire prcder son nom par le symbole $ :
1 < xsl : value - of select = " $ couleur " / >

Le document HTML produit par notre transformation est le suivant :


1 <! DOCTYPE html
2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >
4 < head >
5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6 < title > Test de la fonction sort </ title >
7 </ head >
8 < body >
9 <p > rouge </ p >
10 </ body >
11 </ html >

A noter : il existe une autre faon de dfinir la valeur dune variable lorsque celle-ci ne
provient pas dune expression XPath :
1 < xsl : variable name = " nom " > cha ne de caract res </ xsl : variable >

221
CHAPITRE 23. LES TEMPLATES : ALLER PLUS LOIN

Ainsi, pour le mme document HTML final, nous aurions pu crire le template suivant :
1 < xsl : template match = " / " >
2 < xsl : variable name = " couleur " > rouge </ xsl : variable >
3
4 < html >
5 < head >
6 < title > Test des variables </ title >
7 </ head >
8 < body >
9 <p > < xsl : value - of select = " $ couleur " / > </ p >
10 </ body >
11 </ html >
12 </ xsl : template >

Pour notre second exemple, nous allons construire un template dans la valeur des
variables sera alimentes par une expression XPath. Pour illustrer notre exemple, nous
allons exploiter le document XML suivant :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 <? xml - stylesheet type = " text / xsl " href = " transformation . xsl " ? >
3 < repertoire >
4 <! -- John DOE -- >
5 < personne sexe = " masculin " >
6 < nom > DOE </ nom >
7 < prenom > John </ prenom >
8 </ personne >
9
10 <! -- Marie POPPINS -- >
11 < personne sexe = " feminin " >
12 < nom > POPPINS </ nom >
13 < prenom > Marie </ prenom >
14 </ personne >
15
16 <! -- Batte MAN -- >
17 < personne sexe = " masculin " >
18 < nom > MAN </ nom >
19 < prenom > Batte </ prenom >
20 </ personne >
21 </ repertoire >

Dans cette exemple, nous allons dclarer 3 variables :


La variable sexe qui contiendra le sexe dune personne.
La variable nom qui contiendra le nom dune personne.
La variable prenom qui contiendra le prnom dune personne.
Le but de notre template est alors dafficher le sexe, le prnom et le nom de chaque
personne contenue dans le document XML :
1 < xsl : template match = " / " >
2 < html >

222
LA FONCTION CALL-TEMPLATE

3 < head >


4 < title > Test des variables </ title >
5 </ head >
6 < body >
7 < xsl : for - each select = " repertoire / personne " >
8 < xsl : variable name = " sexe " select = " @sexe " / >
9 < xsl : variable name = " nom " select = " nom " / >
10 < xsl : variable name = " prenom " select = " prenom " / >
11
12 <p > < xsl : value - of select = " $ nom " / > &# 160 ; < xsl :
value - of select = " $ prenom " / > : < xsl : value - of
select = " $ sexe " / > </ p >
13 </ xsl : for - each >
14 </ body >
15 </ html >
16 </ xsl : template >

Dans ce template, nous parcourons lensemble des personnes contenues dans le docu-
ment XML laide de la fonction <xsl:for-each />, puis nous dclarons 3 variables
dont les valeurs sont renseignes laide dexpressions XPath. Grce la fonction
<xsl:value-of />, il est ensuite trs simple dafficher le contenu de la variable.

La fonction call-template
Maintenant que vous maitrisez les variables, il est grand temps de mettre en pratique
vos connaissances ! En effet, dans les exemples que nous avons vu jusqu maintenant,
lutilisation des variables ntait pas pertinente, et nous pouvons facilement arriver au
mme rsultat sans les utiliser. La fonction que nous allons voir maintenant va nous
permettre dutiliser les variables dans des cas utiles.

Dfinition : premire partie


La fonction <xsl:call-template /> permet dappeler un autre template au sein dun
template. Il est possible de lappeler grce son nom. Cette fonction accepte donc un
attribut name qui permet didentifier le template appeler.
Jusqu maintenant, nous avions renseign lattribut select de nos templates grce
une expression XPath. Les templates appels grce la fonction <xsl:call-template
/> doivent tre identifis par un nom. Il ne convient donc plus de renseigner lattri-
but select , mais lattribut name qui permet didentifier de manire unique le
template.
Voici alors la syntaxe dun template appeler :
1 < xsl : template name = " nom_du_template " >
2 <! -- contenu -- >
3 </ xsl : template >

223
CHAPITRE 23. LES TEMPLATES : ALLER PLUS LOIN

Pour lappeler, il convient donc dutiliser la fonction <xsl:call-template /> et de


renseigner le nom du template appeler :
1 < xsl : template select = " / " >
2 < xsl : call - template name = " nom_du_template " / >
3 </ xsl : template >

Afin dillustrer ce premier aperu de la fonction <xsl:call-template />, je vous pro-


pose un premier exemple. Dans celui-ci, nous allons crire un premier template qui
capture la racine dun document XML et qui crit la structure dun document HTML.
Ce mme template appellera un second template grce la fonction que nous venons
de voir afin que celui-ci peuple le contenu de llment <body /> de notre document
HTML produire.
Voici les templates crire :
1 < xsl : template match = " / " >
2 < html >
3 < head >
4 < title > Test de la fonction call - template </ title >
5 </ head >
6 < body >
7 < xsl : call - template name = " body " / >
8 </ body >
9 </ html >
10 </ xsl : template >
11
12 < xsl : template name = " body " >
13 <p > Contenu de la page HTML </ p >
14 </ xsl : template >

Comme vous pouvez le constater, notre premier template appelle un second template
identifi par le nom body grce la fonction <xsl:call-template /> que nous
venons de voir.
Le document HTML produit est bien conforme nos attentes :
1 <! DOCTYPE html
2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >
4 < head >
5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6 < title > Test des variables </ title >
7 </ head >
8 < body >
9 <p > Contenu de la page HTML </ p >
10 </ body >
11 </ html >

Si lintrt de lexercice est ici limit, ce genre de mthode nous permet surtout de bien
hirarchiser nos documents XSLT en crant un template associ un rle bien prcis.

224
LA FONCTION CALL-TEMPLATE

Dans notre cas, nous avons un premier template dont le rle est de crer la structure
de la page HTML tandis que le second template permet den crire le contenu. La
relecture et la modification du document XSLT sont ainsi facilites.

Dfinition : deuxime partie


Je vous avais promis que ltude de la fonction <xsl:call-template /> nous per-
mettrait de mettre en application nos connaissances sur les variables, chose que nous
navons pas encore faite. Il est donc temps de passer aux choses srieuses ! ;)
A lappel dun template, il est possible de lui faire passer des paramtres que nous
utiliserons comme des variables dans le template appel. Ces paramtres sont tout
simplement des informations que lon souhaite transmettre au template appel. Ainsi,
il sera par exemple possible de lui faire passer le nom dune personne afin de lafficher.
Les paramtres sutilisent exactement comme les variables ceci prs quils se dclarent
grce la fonction <xsl:with-param />. Tout comme la fonction <xsl:variable />
accepte deux attributs :
Name : cest le nom que lon souhaite donner lattribut, ce nom va nous permettre
de lidentifier de manire unique.
Select : cet attribut optionnel accepte soit une expression XPath qui permet de
slectionner la valeur que lon souhaite stocker dans notre variable, soit une chane
de caractres.
1 < xsl : with - param name = " nom_du_parametre " select = " expression
XPath | cha ne de caract res " / >

Voyons alors comment faire passer les paramtres un template appel :


1 < xsl : call - template name = " nom_du_template " >
2 < xsl : with - param name = " parametre_un " > valeur 1 </ xsl : with -
param >
3 < xsl : with - param name = " parametre_deux " > valeur 1 </ xsl : with -
param >
4 </ xsl : call - template >

Comme vous pouvez le constater, il convient simplement dencapsuler les fonctions


<xsl:with-param /> dans la fonction <xsl:call-template />. Nous devons encap-
suler autant de fonctions <xsl:with-param /> que nous voulons de paramtres.
Ce nest pas tout ! Nous devons galement dclarer les paramtres au niveau du tem-
plate appel. La dclaration des paramtres attendus par un template ne se fait plus
avec la fonction <xsl:with-param />, mais la fonction <xsl:param /> qui accepte
deux attributs :
Name : cest le nom du paramtre que lon attend.
Select : cet attribut optionnel accepte soit une expression XPath, soit une chane
de caractres et permet de dfinir une valeur par dfaut au paramtre.
1 < xsl : param name = " nom_du_parametre " select = " expression XPath | cha
ne de caract res " / >

225
CHAPITRE 23. LES TEMPLATES : ALLER PLUS LOIN

Ainsi, si jappelle un template de la manire suivante :


1 < xsl : call - template name = " nom_du_template " >
2 < xsl : with - param name = " parametre_un " > valeur 1 </ xsl : with -
param >
3 < xsl : with - param name = " parametre_deux " > valeur 1 </ xsl : with -
param >
4 </ xsl : call - template >

le template appel bien contenir les 2 paramtres attendus :


1 < xsl : template name = " nom_du_template " >
2 < xsl : param name = " parametre_un " / >
3 < xsl : param name = " parametre_deux " / >
4 </ xsl : call - template >

Comme pour les variables, pour pouvoir utiliser un paramtre et rcuprer la valeur
quil contient, il convient de prcder son nom par le symbole $ .
Je vous propose de terminer ce chapitre par un exemple. Pour cet exemple, nous allons
exploiter le document XML suivant :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 <? xml - stylesheet type = " text / xsl " href = " transformation . xsl " ? >
3 < repertoire >
4 <! -- John DOE -- >
5 < personne sexe = " masculin " >
6 < nom > DOE </ nom >
7 < prenom > John </ prenom >
8 </ personne >
9
10 <! -- Marie POPPINS -- >
11 < personne sexe = " feminin " >
12 < nom > POPPINS </ nom >
13 < prenom > Marie </ prenom >
14 </ personne >
15
16 <! -- Batte MAN -- >
17 < personne sexe = " masculin " >
18 < nom > MAN </ nom >
19 < prenom > Batte </ prenom >
20 </ personne >
21 </ repertoire >

Nous allons crire un document XSLT contenant deux templates :


Le premier template capturera la racine du document XML et construira la struc-
ture du document HTML produire. Il bouclera galement sur chaque personne du
document XML et appellera un second template en lui donnant paramtre le nom
de chaque personne.
Le second template accueillera 2 paramtres. Le premier sera le nom de la personne
tandis que le deuxime aura pour valeur par dfaut la chane de caractres nom de
la personne . Le but de ce second template sera dafficher le nom de la personne.

226
LA FONCTION CALL-TEMPLATE

Voici quoi ressemble notre document XSLT :

1 < xsl : template match = " / " >


2 < html >
3 < head >
4 < title > Test de la fonction call - template </ title >
5 </ head >
6 < body >
7 < xsl : for - each select = " repertoire / personne " >
8 < xsl : call - template name = " afficherNom " >
9 < xsl : with - param name = " nomFamille " select = "
nom " / >
10 </ xsl : call - template >
11 </ xsl : for - each >
12 </ body >
13 </ html >
14 </ xsl : template >
15
16 < xsl : template name = " afficherNom " >
17 < xsl : param name = " nomFamille " / >
18 < xsl : param name = " constante " > nom de la personne </ xsl : param >
19
20 <p > < xsl : value - of select = " $ constante " / >: < xsl : value - of select
= " $ nomFamille " / > </ p >
21 </ xsl : template >

Le document HTML produit est alors le suivant :

1 <! DOCTYPE html


2 PUBLIC " -// W3C // DTD HTML 4 . 01 // EN " " http :// www . w3 . org / TR /
html4 / strict . dtd " >
3 < html >
4 < head >
5 < meta http - equiv = " Content - Type " content = " text / html ;
charset = UTF - 8 " >
6 < title > Test de la fonction call - template </ title >
7 </ head >
8 < body >
9 <p > nom de la personne : DOE </ p >
10 <p > nom de la personne : POPPINS </ p >
11 <p > nom de la personne : MAN </ p >
12 </ body >
13 </ html >

227
CHAPITRE 23. LES TEMPLATES : ALLER PLUS LOIN

Dautres fonctions
La fonction element
Dfinition

La fonction <xsl:element /> est une fonction que nous utiliserons principalement
pour transformer un document XML en un nouveau document XML. En effet, comme
son nom le laisse deviner, cette fonction permet de crer un lment au sens XML,
cest--dire une balise XML.
Cette fonction accepte plusieurs attributs. Dans le cadre de ce cours, deux nous int-
ressent :
Lattribut name , obligatoire, permet de dfinir le nom de llment XML que
lon souhaite crer. Ce nom peut-tre une chane de caractres ou encore la valeur
dune variable.
Lattribut namespace , facultatif quant lui, permet de prfixer llment crer
dun espace de noms.
La syntaxe de la fonction <xsl:element /> est donc la suivante :
1 < xsl : element name = " nom " namespace = " espace_de_nom " / >

A noter : pour dfinir une valeur llment, il convient tout simplement de la placer
entre la balise ouvrante et fermante de la fonction :
1 < xsl : element name = " nom " namespace = " espace_de_nom " > valeur de l '
l ment </ xsl : element >

Exemple

Afin dillustrer lutilisation de cette nouvelle fonction, je vous propose de voir imm-
diatement un exemple. Nous allons donc crire un template dont le rle est de crer un
lment XML ayant pour nom couleur et pour valeur rouge .

Dans cet exemple, je ne vais dtailler ici que le template, mais dans le do-
cument XSLT complet, il convient de dcrire le document produire comme
un document XML.

1 < xsl : template match = " / " >


2 < xsl : element name = " couleur " > rouge </ xsl : element >
3 </ xsl : template >

Le document XML produit est alors le suivant :


1 <? xml version = " 1 . 0 " encoding = " utf - 8 " ? >
2 < couleur > rouge </ couleur >

228
DAUTRES FONCTIONS

La fonction attribute
Dfinition

La fonction <xsl:attribute /> est une fonction grce laquelle il est possible de
crer des attributs des lments XML ou HTML.
Dans le cadre de ce tutoriel, nous allons nous intresser au seul attribut obligatoire
pour cette fonction. Il sagit de lattribut name qui permet de dfinir le nom de
lattribut que lon souhaite crer.
La syntaxe de la fonction <xsl:attribute /> est donc la suivante :
1 < xsl : attribute name = " nom " / >

Comme pour la fonction <xsl:element />, pour dfinir la valeur, il convient de la


placer entre la balise ouvrante et fermante de la fonction :
1 < xsl : attribute name = " nom " > valeur de l ' l ment </ xsl : element >

Exemple

Pour illustrer la fonction <xsl:attribute />, je vous propose de complter notre


exemple prcdent. Ainsi, nous allons toujours produire un document XML qui grce
une transformation XSLT contiendra un lment ayant pour nom couleur et
pour valeur rouge . La nouveaut est que notre template devra galement ajouter
lattribut primaire llment couleur afin de prciser sil sagit dune couleur
primaire ou non.
1 < xsl : template match = " / " >
2 < xsl : element name = " couleur " >
3 < xsl : attribute name = " primaire " > oui </ xsl : attribute >
4 rouge
5 </ xsl : element >
6 </ xsl : template >

Le document XML produit est alors le suivant :


1 <? xml version = " 1 . 0 " encoding = " utf - 8 " ? >
2 < couleur primaire = " oui " > rouge </ couleur >

La fonction comment
Dfinition

La fonction <xsl:comment /> est une fonction qui permet de crer des commentaires
dans les documents XML ou HTML produire. Cette fonction ne prend aucun attribut.
Pour dfinir sa valeur, il suffit simplement de la placer entre la balise ouvrante et
fermante de la fonction :

229
CHAPITRE 23. LES TEMPLATES : ALLER PLUS LOIN

1 < xsl : comment > mon commentaire </ xsl : comment >

Exemple

Cette fonction est relativement simple dutilisation par rapport dautres fonctions
que nous avons vu tout au long de ce tutoriel. Cependant, je vous propose tout de
mme dillustrer lutilisation de cette fonction<xsl:comment /> par un exemple trs
simple.
Nous allons donc complter le template cr prcdemment afin dy ajouter un com-
mentaire ayant pour valeur ma couleur :
1 < xsl : template match = " / " >
2 < xsl : comment > ma couleur </ xsl : comment >
3 < xsl : element name = " couleur " >
4 < xsl : attribute name = " primaire " > oui </ xsl : attribute >
5 rouge
6 </ xsl : element >
7 </ xsl : template >

Le document XML produit est alors le suivant :


1 <? xml version = " 1 . 0 " encoding = " utf - 8 " ? >
2 <! -- ma couleur -- >
3 < couleur primaire = " oui " > rouge </ couleur >

La fonction processing-instruction
Dfinition

La fonction <xsl:processing-instruction />, malgr son nom barbare, permet de


crer ce quon appelle une instruction de traitement dans le document que lon
souhaite produire. Une instruction de traitement est une de ces fameuses balises XML
qui dbut par le caractre ? .
Cest notamment ce quon utilise dans les documents XML pour rfrencer un fichier
CSS ou une transformation XSLT :
1 <? xml - stylesheet type = " text / xsl " href = " transformation . xsl " ? >

Cette fonction accepte un seul attribut qui est lattribut name et qui permet de
dfinir le nom de linstruction. Le reste des lments contenus dans linstruction comme
par exemple type et href doivent tre placs entre la balise ouvrante et fermante
de la fonction :
1 < xsl : processing - instruction name = " nom_instruction " > reste de l '
instruction </ xsl : processing - instruction >

230
DAUTRES FONCTIONS

Exemple

Afin dillustrer lutilisation de cette fonction, je vous propose de continuer travailler


avec le document XML que nous produisons depuis le dbut de ce chapitre. Ainsi, dans
ce document XML, nous allons ajouter une nouvelle rfrence, un document XSLT
fictif portant le nom transformation.xsl :
1 < xsl : template match = " / " >
2 < xsl : processing - instruction name = " xml - stylesheet " > type = "
text / xsl " href = " transformation . xsl " </ xsl : processing -
instruction >
3 < xsl : comment > ma couleur </ xsl : comment >
4 < xsl : element name = " couleur " >
5 < xsl : attribute name = " primaire " > oui </ xsl : attribute >
6 rouge
7 </ xsl : element >
8 </ xsl : template >

Le document XML produit est alors le suivant :


1 <? xml version = " 1 . 0 " encoding = " utf - 8 " ? >
2 <? xml - stylesheet type = " text / xsl " href = " transformation . xsl " ? >
3 <! -- ma couleur -- >
4 < couleur primaire = " oui " > rouge </ couleur >

La fonction copy-of
Dfinition

La fonction <xsl:copy-of />, permet de copier tel quel un nud et ses enfants dans
le document que lon souhaite produire. Cette fonction accepte uniquement lattribut
select qui permet de slectionner ne le nud copier en passant par une expression
XPath :
1 < xsl : copy - of select = " expression XPath " / >

Exemple

Afin dillustrer lutilisation de cette fonction, nous allons transformer le document XML
suivant :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < repertoire >
3 < personne sexe = " masculin " >
4 < nom > DOE </ nom >
5 < prenom > John </ prenom >
6 </ personne >
7
8 < personne sexe = " feminin " >

231
CHAPITRE 23. LES TEMPLATES : ALLER PLUS LOIN

9 < nom > POPPINS </ nom >


10 < prenom > Marie </ prenom >
11 </ personne >
12
13 < personne sexe = " masculin " >
14 < nom > BATTE </ nom >
15 < prenom > Man </ prenom >
16 </ personne >
17 </ repertoire >

Dans la transformation suivante, lobjectif sera de produire un document XML qui ne


contient que les personnes de sexe fminin. Voici le template utiliser :
1 < xsl : template match = " / " >
2 < xsl : element name = " repertoire " >
3 < xsl : for - each select = " repertoire / personne " >
4 < xsl : if test = " @sexe = ' feminin ' " >
5 < xsl : copy - of select = " . " / >
6 </ xsl : if >
7 </ xsl : for - each >
8 </ xsl : element >
9 </ xsl : template >

Le document XML produit est alors le suivant :


1 <? xml version = " 1 . 0 " encoding = " utf - 8 " ? >
2 < repertoire >
3 < personne sexe = " feminin " >
4 < nom > POPPINS </ nom >
5 < prenom > Marie </ prenom >
6 </ personne >
7 </ repertoire >

Un exemple avec EditiX


Pour conclure ce chapitre, je vous propose de voir comment effectuer une transfor-
mation XSLT avec EditiX.

Cration du document XML


Commencez par crer dans EditiX un document XML contenant les informations sui-
vantes :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < repertoire >
3 < personne sexe = " masculin " >
4 < nom > DOE </ nom >
5 < prenom > John </ prenom >

232
UN EXEMPLE AVEC EDITIX

6 </ personne >


7
8 < personne sexe = " feminin " >
9 < nom > POPPINS </ nom >
10 < prenom > Marie </ prenom >
11 </ personne >
12
13 < personne sexe = " masculin " >
14 < nom > BATTE </ nom >
15 < prenom > Man </ prenom >
16 </ personne >
17 </ repertoire >

Cration du document XSLT


Pour crer un nouveau document, vous pouvez slectionner
  dans la barre de menu File
puis New ou encore utiliser le raccourci clavier Ctrl + N .
Dans la liste qui saffiche, slectionnez XSL Transformations 1.0 for HTML out-
put, comme indiqu sur la figure 23.1.

Figure 23.1 Cration dun document XSLT

Votre document XSLT nest normalement pas vierge. Voici ce que vous devriez avoir :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2
3 <! -- New document created with EditiX at Tue Nov 05 22 : 29 : 40
CET 2013 -- >
4
5 < xsl : stylesheet version = " 1 . 0 " xmlns : xsl = " http :// www . w3 . org / 1999
/ XSL / Transform " >
6
7 < xsl : output method = " html " / >

233
CHAPITRE 23. LES TEMPLATES : ALLER PLUS LOIN

8
9 < xsl : template match = " / " >
10 < html >
11 < body >
12 < xsl : apply - templates / >
13 </ body >
14 </ html >
15 </ xsl : template >
16
17 </ xsl : stylesheet >

Remplacez le contenu par notre vritable transformation :


1 < xsl : stylesheet version = " 1 . 0 " xmlns : xsl = " http :// www . w3 . org / 1999
/ XSL / Transform " >
2
3 < xsl : output
4 method = " html "
5 encoding = " UTF - 8 "
6 doctype - public = " -// W3C // DTD HTML 4 . 01 // EN "
7 doctype - system = " http :// www . w3 . org / TR / html4 / strict . dtd "
8 indent = " yes " / >
9
10 < xsl : template match = " / " >
11 < html >
12 < head >
13 < title > Mon r pertoire t l phonique </ title >
14 < link type = " text / css " rel = " stylesheet " href = "
style . css " / >
15 </ head >
16 < body >
17 < xsl : for - each select = " repertoire / personne " >
18 <p > < xsl : value - of select = " nom " / > </ p >
19 </ xsl : for - each >
20 </ body >
21 </ html >
22 </ xsl : template >
23
24 </ xsl : stylesheet >

Enregistrez ensuite votre document avec le nom transformation.xsl au mme endroit


que votre document XML.

Vrification du document XSLT


Vous pouvez vrifier que votre transformation na pas derreur de syntaxe en slection-
nant dans la barre de menu XML
 puis Check this document ou encore en utilisant
le raccourci clavier Ctrl + K .
Vous devriez normalement voir le message de la figure 23.2 safficher.

234
UN EXEMPLE AVEC EDITIX

Figure 23.2 Message indiquant que le document XSLT est bien form

Appliquer une transformation


Nous allons maintenant voir comment appliquer la transformation que nous venons
dcrire notre document XML. Pour ce faire, il convient de slectionner dans la barre
de menu XSLT/Query puis Transform a document with this XSLT. . . ou encore
en cliquant sur licne visible la figure 23.3.

Figure 23.3 Transformer un document

Une fentre apparat alors, nous permettant de choisir :


La transformation appliquer.
Le document XML transformer.
Le nom du document qui sera produit lissu de la transformation.
Le comportement souhait la fin de lopration.
Compltez alors les informations comme la figure 23.4.
Lorsque tout est correctement paramtr, cliquez sur le bouton Ok pour appliquer
la transformation. Une fois celle-ci termine et en cas de succs, le message visible la
figure 23.5 doit normalement apparatre lcran.
Vous pouvez maintenant vrifier que le document HTML produit contient bien le r-
sultat attendu. noter : un aperu du rsultat de la transformation est disponible
dans le module XSLT Preview Result situ en bas de votre cran lorsque votre
document XSLT est ouvert (voir figure 23.6).

En rsum
Il est possible de dclarer des variables dans un document XSLT grce la balise
<xsl:variable />.
Pour utiliser une variable, il suffit de prcder son nom par le symbole $ .
Il est possible de faire passer des informations dun template un autre sous la forme
de paramtres.

235
CHAPITRE 23. LES TEMPLATES : ALLER PLUS LOIN

Figure 23.4 Fentre dexcution dune transformation XSLT

Figure 23.5 Message indiquant que la transformation XSLT a t appliqu

Figure 23.6 Rsultat de la transformation XSLT

236
Chapitre 24
TP : des transformations XSLT dun
rpertoire

Difficult :

Il est temps de rellement mettre en pratique vos connaissances sur les transformations
XSLT dans un TP.

237
CHAPITRE 24. TP : DES TRANSFORMATIONS XSLT DUN RPERTOIRE

Le sujet
Lnonc
Dans ce TP, le travail demand consiste transformer un document XML comportant
un rpertoire tlphonique en un document HTML dont le rendu final doit tre celui
visible la figure 24.1.

Figure 24.1 Rendu du TP

Comme vous pouvez le constater sur la capture dcran ci-dessus, il vous faudra ga-
lement styliser le document HTML laide dun peu de CSS en respectant les rgles
suivantes :
Le nom et le prnom dune personne sont des titres de catgories 1.
Ladresse dune personne doit tre crite en italique.
Les enttes des listes des numros de tlphone et des adresses e-mails sont des titres
de catgories 2.
Les listes sont des vraies listes HTML.
La couleur de fond est bleue pour un homme et rose pour une femme.

238
LE SUJET

Les numros de tlphone et les adresses e-mails apparaissent uniquement si la per-


sonne en possde.

Le document XML
Le document XML transformer est le suivant :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < repertoire >
3 <! -- John DOE -- >
4 < personne sexe = " masculin " >
5 < nom > DOE </ nom >
6 < prenom > John </ prenom >
7 < adresse >
8 < numero >7 </ numero >
9 < voie type = " impasse " > impasse du chemin </ voie >
10 < codePostal > 75015 </ codePostal >
11 < ville > PARIS </ ville >
12 < pays > FRANCE </ pays >
13 </ adresse >
14 < telephones >
15 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
16 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
17 </ telephones >
18 < emails >
19 < email type = " personnel " > john . doe@wanadoo . fr </ email >
20 < email type = " professionnel " > john . doe@societe . com </
email >
21 </ emails >
22 </ personne >
23
24 <! -- Marie POPPINS -- >
25 < personne sexe = " feminin " >
26 < nom > POPPINS </ nom >
27 < prenom > Marie </ prenom >
28 < adresse >
29 < numero > 28 </ numero >
30 < voie type = " avenue " > avenue de la r publique </ voie >
31 < codePostal > 13005 </ codePostal >
32 < ville > MARSEILLE </ ville >
33 < pays > FRANCE </ pays >
34 </ adresse >
35 < telephones >
36 < telephone type = " professionnel " > 04 05 06 07 08 </
telephone >
37 </ telephones >
38 < emails >
39 < email type = " professionnel " > contact@poppins . fr </
email >

239
CHAPITRE 24. TP : DES TRANSFORMATIONS XSLT DUN RPERTOIRE

40 </ emails >


41 </ personne >
42
43 <! -- Batte MAN -- >
44 < personne sexe = " masculin " >
45 < nom > MAN </ nom >
46 < prenom > Batte </ prenom >
47 < adresse >
48 < numero > 24 </ numero >
49 < voie type = " avenue " > impasse des h ros </ voie >
50 < codePostal > 11004 </ codePostal >
51 < ville > GOTHAM CITY </ ville >
52 < pays > USA </ pays >
53 </ adresse >
54 < telephones >
55 < telephone type = " professionnel " > 01 03 05 07 09 </
telephone >
56 </ telephones >
57 </ personne >
58 </ repertoire >

Copier ce code
B
Code web : 534435

Une solution
Comme chaque fois, je vous fais part de ma solution, que vous trouverez grce au
code web suivant.

Voir ma solution
B

Code web : 934455

240
Cinquime partie

Annexes

241
Chapitre 25
Les espaces de noms

Difficult :

Comme vous le constatez, cette cinquime partie est une annexe. Son objectif est multiple,
savoir revenir sur des notions qui reviennent rgulirement dans le cours et proposer
quelques chapitres bonus pour aller toujours plus loin dans la manipulation de vos
documents XML.
Le premier chapitre de cette annexe revient sur la notion despace de noms, notion for-
tement utilis en XML et dans les diffrentes technologies abordes au cours de ce tutoriel
comme par exemple les Schmas XML ou encore les transformations XSLT.

243
CHAPITRE 25. LES ESPACES DE NOMS

Dfinition

Dfinition dun espace de noms

Lorsque lon crit un document XML, on utilise ce que lon appelle un vocabulaire. Par
exemple, dans les diffrents TP, nous avons travaill avec des rpertoires tlphoniques
dans lesquels chaque personne possde :
Une identit (un nom et un prnom).
Une adresse.
Des numros de tlphone.
Des adresses e-mail.
Etc.
A travers cette description, nous avons avons dfini le vocabulaire dune personne.
Dans notre cas, ce vocabulaire nest pas forcment rutilisable en ltat. Pourtant,
comme vous vous en tes certainement aperu, en informatique, on aime bien rutiliser
ce que lon a dj effectu et ne pas toujours repartir zro.
Il existe plusieurs vocabulaires qui ont fait leurs preuves et qui ont t mis dispositions
des dveloppeurs afin quils puissent tre rutiliss. Nous y reviendrons un peu plus
tard, mais nous pouvons dj en citer quelques uns.
Le vocabulaire permettant de dcrire une page xHTML.
Le vocabulaire permettant de dcrire un Schma XML.
Le vocabulaire permettant de dcrire des documents techniques.
Etc.

Identifier un espace de noms

Un espace de noms est identifi par une URI (Uniform Resource Identifier) qui permet
de lidentifier de manire unique. Bien que lon distingue 2 types dURI, savoir les
URL (Uniform Resource Locator) et les URN (Uniform Resource Name), dans la
majorit des cas, cest une URL qui est utilise.
Pour rappel, une URL permet didentifier de manire unique une ressource, dans notre
cas, un vocabulaire, sur un rseau.
Voyons quelques exemples dURL permettant didentifier des vocabulaires et donc des
espaces de noms sur le rseau Internet :
xhtml : http://www.w3.org/1999/xhtml
Schma XML : http://www.w3.org/2001/XMLSchema
DocBook : http://docbook.org/ns/docbook

244
UTILISATION DUN ESPACE DE NOMS

Utilisation dun espace de noms


Les espaces de noms par dfaut
La dclaration dun espace de noms par dfaut se fait dans le premier lment
qui utilise le vocabulaire, grce au mot clef xmlns comme XML namespace.
1 xmlns = " mon_uri "

Illustrons alors la dclaration et lutilisation dun espace de noms par dfaut travers
lexemple dun document xHTLM :
1 < html xmlns = " http :// www . w3 . org / 1999 / xhtml " >
2 < head >
3 < title > Titre du document </ title >
4 </ head >
5 < body >
6 <p >
7 < img src = " mon_image . png " alt = " ma super image " / >
8
9 <a href = " mon_lien " > Mon super lien ! </ a >
10 </ p >
11 </ body >
12 </ html >

Tous les lments utiliss dans ce document XML comme <head />, <title />, <body
/>, etc., font partie du vocabulaire dune page xHTML. Cest grce la dclaration
de lespace de noms dans llment <html /> que nous pouvons utiliser les diffrents
lments du vocabulaire tout en respectant les rgles qui rgissent leurs imbrications
les uns par rapport aux autres.

Les espaces de noms avec prfixe


Utiliser un espace de noms par dfaut a certaines limites. En effet, il est par exemple
impossible dutiliser au sein dun mme document 2 espaces de noms par dfaut qui
auraient un mot de vocabulaire en commun. On obtiendrait alors une ambigut.
Tout problme a bien videmment une solution. Ainsi, pour contourner cette limite,
nous allons utiliser des prfixes avec nos espaces de noms.
Tout comme pour un espace de noms par dfaut, la dclaration dun espace de noms
avec prfixe se fait dans le premier lment qui utilise le vocabulaire, grce au mot
clef xmlns :prefixe.
1 xmlns : prefixe = " mon_uri "

Lorsquun espace de noms est dclar avec un prfixe, tous les lments qui appar-
tiennent au vocabulaire, et donc lespace de noms, doivent tre prcds par ce pr-
fixe :
1 < prefixe : element / >

245
CHAPITRE 25. LES ESPACES DE NOMS

Afin dillustrer cette nouvelle notion, reprenons la page xHTML que nous avons avons
crit plus haut et utilisons cette fois-ci un prfixe :
1 < http : html xmlns : http = " http :// www . w3 . org / 1999 / xhtml " >
2 < http : head >
3 < http : title > Titre du document </ http : title >
4 </ http : head >
5 < http : body >
6 < http : p >
7 < http : img src = " mon_image . png " alt = " ma super image "
/>
8 < http : br / >
9 < http : a href = " mon_lien " > Mon super lien ! </ http : a >
10 </ http : p >
11 </ http : body >
12 </ http : html >

La porte dun espace de noms


Pour clore ce chapitre, il me semble intressant de revenir sur la notion de porte dun
espace de noms. En effet, suivant la faon dont il est dclar, un espace de noms nest
pas accessible partout dans un document, il nest donc pas possible dutiliser tous les
mots de vocabulaire partout dans un document XML.
La rgle qui rgit la porte dun espace de noms est assez simple : un espace de noms
est utilisable tant que llment qui le dclare nest pas referm.
Une fois de plus, je vous propose dillustrer cette notion par un exemple :
1 <! -- il est possible d ' utiliser l ' espace de noms http -- >
2 < http : html xmlns : http = " http :// www . w3 . org / 1999 / xhtml " >
3 < http : head >
4 < http : title > Titre du document </ http : title >
5 </ http : head >
6 < http : body >
7 < http : p >
8 <! -- il est possible d ' utiliser l ' espace de noms ml
-- >
9 < ml : math xmlns : ml = " http :// www . w3 . org / 1998 / Math /
MathML " >
10 < ml : matrix >
11 < ml : matrixrow >
12 < ml : cn >0 </ ml : cn >
13 < ml : cn >1 </ ml : cn >
14 < ml : cn >0 </ ml : cn >
15 </ ml : matrixrow >
16 < ml : matrixrow >
17 < ml : cn >0 </ ml : cn >
18 < ml : cn >0 </ ml : cn >
19 < ml : cn >1 </ ml : cn >

246
QUELQUES ESPACES DE NOMS UTILISS RGULIREMENT

20 </ ml : matrixrow >


21 </ ml : matrix >
22 </ ml : math >
23 <! -- il n ' est plus possible d ' utiliser l ' espace de
noms ml -->
24 </ http :p >
25 </ http : body >
26 </ http : html >
27 <! - - il n ' est plus possible d ' utiliser l ' espace de noms http --
>

Quelques espaces de noms utiliss rgulirement


En conclusion de ce chapitre, je vous propose de revenir sur quelques espaces de noms
connus, rgulirement utiliss par les dveloppeurs. Bien videmment cette liste nest
pas exhaustive, il en existe un trs grand nombre !

DocBook
DocBook permet de dcrire des documents techniques comme des livres, des articles,
etc.
Cet espace de noms est identifi par lURI http://docbook.org/ns/docbook.

MathML
MathML est une spcification du W3C qui permet dafficher lments mathmatiques
divers et varis comme des additions, des soustractions, des matrices, etc.
Cet espace de noms est identifi par lURI http://www.w3.org/1998/Math/MathML.

Schma XML
Il sagit dune spcification du W3C qui permet de dcrire des Schmas XML.
Cet espace de noms est identifi par lURI http://www.w3.org/2001/XMLSchema.

SVG
SVG pour Scalable Vector Graphics est une spcification du W3C qui permet de
dcrire des images vectorielles.
Cet espace de noms est identifi par lURI http://www.w3.org/2000/svg.

247
CHAPITRE 25. LES ESPACES DE NOMS

XLink
Il sagit dune spcification du W3C permettant de crer des liens entre plusieurs fichiers
XML.
Cet espace de noms est identifi par lURI http://www.w3.org/1999/xlink.

XSLT
XSLT pour eXtensible Stylesheet Language Transformations est une spcifi-
cation du W3C qui permet de dcrire des transformations appliquer un document
XML.
Cet espace de noms est identifi par lURI http://www.w3.org/1999/XSL/Transform.

En rsum
Un espace de noms est identifi de manire unique par une URI.
Un espace de noms se dclare dans le premier lment qui utilise son vocabulaire.
Un espace de noms se dclare grce lattribut xmlns.

248
Chapitre 26
Mettez en forme vos documents XML
avec CSS

Difficult :

Ce chapitre a pour objectif de vous montrer quil est possible dappliquer un style CSS
directement aux informations dun document XML afin de le mettre en forme lors de son
affichage dans un navigateur internet. Finalement, puisque la pratique reste le meilleur
moyen dapprendre, un petit TP vous sera propos !

Si ce chapitre explique comment appliquer une feuille de style CSS un


document XML, je ne reviendrai pas en dtail sur chaque proprit du CSS
existante. En effet, ce langage ncessite lui seul lcriture dun tutoriel dont
la taille serait consquente. Le but est ici de dcouvrir ce quil est possible de
faire avec du CSS et du XML.

249
CHAPITRE 26. METTEZ EN FORME VOS DOCUMENTS XML AVEC CSS

Ecrire un document CSS

Quest-ce que le CSS ?

Bien que je sois certain que la majorit dentre vous connaissent dj peu prs ce
quest le CSS, je vous propose de revenir rapidement sur ce langage.
Le CSS ou Cascading Style Sheet de son nom complet, est un langage informatique
part entire permettant de styliser les documents HTML et XML. Avec le
HTML, il sagit du langage qui permet de mettre en forme et styliser les sites Internet.
Nous allons donc voir comment grce au CSS, il est possible de styliser un document
XML. Par styliser, jentends par exemple :
Ecrire certains lments en gras.
Souligner.
Surligner.
Ecrire certains lments en couleur.
Etc.

Ou crire le CSS ?

Vous commencez le comprendre, en informatique, on aime bien sparer les diffrentes


technologies dans diffrents fichiers. Le CSS ne fait pas exception la rgle. Ainsi, nos
lignes de CSS seront crites dans un fichier portant lextension de fichier .css.

Rfrencer le fichier CSS

Afin de pouvoir appliquer un style CSS nos documents XML, il convient de lier
les diffrents fichiers entre eux.
Cette liaison se fait dans le document XML entre le prologue et la racine, grce la
balise suivante :
1 <? xml - stylesheet href = " style . css " type = " text / css " ? >

Prenons par exemple le document XML suivant :


1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " >
2 <? xml - stylesheet href = " personne . css " type = " text / css " ? >
3 < personne >
4 < nom > NORRIS </ nom >
5 < prenom > Chuck </ prenom >
6 </ personne >

Dans cet exemple, laffichage du document XML sera stylis grce au document CSS
personne.css.

250
ECRIRE UN DOCUMENT CSS

Syntaxe du CSS
Comme tous les langages, le CSS dispose dune syntaxe qui lui est propre. Lide du
langage est de slectionner un ou plusieurs lments dun document afin dy appliquer
un certain nombre de proprits.
Dans ce chapitre, je ne vais pas revenir sur lensemble des proprits qui existent en
CSS. Cependant, je vous encourage lire le mmo crit par Mathieu Nebra dans son
cours sur HTML5 et CSS3.

Lire le memento
B

Code web : 586304

Slectionner une balise

En CSS, pour slectionner un lment particulier dun document XML, on utilise la


syntaxe suivante :
1 balise {
2 propri t 1 : valeur ;
3 propri t 2 : valeur ;
4 }

Illustrons cette premire rgle grce un exemple. Soit le document XML suivant
reprsentant une liste de personnes :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 <? xml - stylesheet href = " personnes . css " type = " text / css " ? >
3 < personnes >
4 < personne >
5 < nom > NORRIS </ nom >
6 < prenom > Chuck </ prenom >
7 </ personne >
8
9 < personne >
10 < nom > DUPONT </ nom >
11 < prenom > Marie </ prenom >
12 </ personne >
13 </ personnes >

Si je souhaite par exemple afficher les prnoms des diffrentes personnes en rouge, gras
et italique. crivons alors le contenu du fichier personnes.css :
1 nom {
2 color : red ;
3 font - weight : bold ;
4 font - style : italic ;
5 }

Si vous ouvrez votre document XML dans un navigateur web, vous devriez alors avoir
laffichage indiqu sur la figure 26.1.

251
CHAPITRE 26. METTEZ EN FORME VOS DOCUMENTS XML AVEC CSS

Figure 26.1 Affichage du document XML stylis dans un navigateur web

Comme on le souhaitait, les noms des personnes sont bien crits en rouge, gras et
italique.

Slectionner une balise particulire

Allons un petit peu plus loin et considrons le document XML suivant, reprsentant
encore une liste de personnes :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 < personnes >
3 < personne sexe = " masculin " >
4 < nom > NORRIS </ nom >
5 < prenom > Chuck </ prenom >
6 </ personne >
7
8 < personne sexe = " feminin " >
9 < nom > DUPONT </ nom >
10 < prenom > Marie </ prenom >
11 </ personne >
12 </ personnes >

Comment faire si je souhaite, par exemple, afficher le nom des hommes en bleu et
celui des femmes en roses ? Pour arriver ce rsultat, il convient de slectionner une
personne en fonction de lattribut sexe.
Pour slectionner une balise particulire en fonction de la valeur dun attribut en
CSS, on utilise la syntaxe suivante :
1 balise [ attribut = " valeur " ] {
2 propri t 1 : valeur ;
3 propri t 2 : valeur ;
4 }

Tentons alors dappliquer le style suivant notre document XML :


1 personne [ sexe = " masculin " ] { color : blue ; }

252
ECRIRE UN DOCUMENT CSS

2 personne [ sexe = " feminin " ] { color : pink ; }

Si lon affiche le document XML dans un navigateur web, on obtient le rsultat affich
en figure 26.2.

Figure 26.2 Affichage du document XML stylis dans un navigateur web

On sapproche du rsultat souhait, mais ce nest pas encore tout fait a. En effet,
actuellement, les noms et prnoms des personnes sont colores, or ce que lon souhaite
nous, cest quuniquement des noms des personnes soient colors.
Il nous suffit de lgrement modifier notre feuille de style :
1 personne [ sexe = " masculin " ] nom { color : blue ; }
2 personne [ sexe = " feminin " ] nom { color : pink ; }

Comme vous pouvez le constater, on a ajout llment nom au niveau de notre slec-
tion. En franais, on pourrait traduire ces lignes de CSS par les 2 phrases suivantes :
Ecrit en bleu le nom des personnes de sexe masculin.
Ecrit en rose le nom des personnes de sexe fminin.
Finalement, si vous affichez le document XML dans un navigateur web, vous devriez
avoir le rsultat affich en figure 26.3, correspondant bien nos attentes.

Figure 26.3 Affichage du document XML stylis dans un navigateur web

253
CHAPITRE 26. METTEZ EN FORME VOS DOCUMENTS XML AVEC CSS

Un exemple avec EditiX


Comme pour chaque technologie que nous voyons ensemble, je vous propose de voir
comment procder grce au logiciel EditiX.

Cration du document XML


La cration du document XML na rien de bien compliqu puisque nous lavons
dj vu ensemble plusieurs reprise.
Pour ceux qui ne sen souviennent pas, vous pouvez y jeter un coup dil la page 21.
Je vous propose de reprendre pour exemple notre liste de personnes :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 <? xml - stylesheet href = " personnes . css " type = " text / css " ? >
3 < personnes >
4 < personne sexe = " masculin " >
5 < nom > NORRIS </ nom >
6 < prenom > Chuck </ prenom >
7 </ personne >
8
9 < personne sexe = " feminin " >
10 < nom > DUPONT </ nom >
11 < prenom > Marie </ prenom >
12 </ personne >
13 </ personnes >

Si vous essayez de lancer la vrification du document, vous devriez normalement avoir


ce message (voir la figure 26.4).

Figure 26.4 Message indiquant que le document XML est bien form

Cration du document CSS


Pour crer un nouveau document, vous pouvez
 slectionner
 dans la barre de menu File
puis New ou utiliser le raccourci clavier Ctrl + N .
Dans la liste qui saffiche, slectionnez CSS, comme indiqu sur la figure 26.5.
Votre document CSS nest normalement pas vierge. Voici ce que vous devriez avoir :
1 /* Generated with EditiX at Sat May 11 19 : 46 : 07 CEST 2013 */

254
UN EXEMPLE AVEC EDITIX

Figure 26.5 Cration dune feuille de style CSS

Replacez le contenu par notre vritable CSS :


1 personne [ sexe = " masculin " ] nom { color : blue ; }
2 personne [ sexe = " feminin " ] nom { color : pink ; }

Enregistrez ensuite votre document avec le nom personnes.css au mme endroit que
votre document XML.

Vrification de fichier de style


Vous pouvez vrifier que votre fichier CSS na pas derreur de syntaxe en cliquant sur
licne adquat, en slectionnant dans la barre
 de menu
 XML puis Check this CSS
ou encore en utilisant le raccourci clavier Ctrl + K .

La possibilit de vrifier quun fichier CSS ne comporte aucune erreur de


syntaxe nest pas offerte dans la version gratuite dEditix. Si vous souhaitez
utiliser cette fonctionnalit, il vous faudra passer sur la version payante.

Vous devriez normalement avoir un message indiquant que votre CSS est correct,
comme lillustre la figure 26.6.

Figure 26.6 Message indiquant que le document CSS est correct

Lorsque tout est correct, ouvrez votre fichier XML dans un navigateur web pour ob-

255
CHAPITRE 26. METTEZ EN FORME VOS DOCUMENTS XML AVEC CSS

server le rsultat.

TP : mise en forme dun rpertoire


Le but de ce TP est de crer un fichier CSS afin de mettre en forme un rpertoire
tlphonique se prsentant sous la forme dun document XML.

Le document XML
Voici le document XML mettre en forme :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " standalone = " yes " ? >
2 < personnes >
3 < personne sexe = " masculin " >
4 < identite >
5 < nom > NORRIS </ nom >
6 < prenom > Chuck </ prenom >
7 </ identite >
8 < telephones >
9 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
10 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
11 </ telephones >
12 </ personne >
13
14 < personne sexe = " feminin " >
15 < identite >
16 < nom > DUPONT </ nom >
17 < prenom > Marie </ prenom >
18 </ identite >
19 < telephones >
20 < telephone type = " bureau " > 04 05 06 07 08 </ telephone >
21 </ telephones >
22 </ personne >
23
24 < personne sexe = " masculin " >
25 < identite >
26 < nom > PAUL </ nom >
27 < prenom > Bernard </ prenom >
28 </ identite >
29 < telephones >
30 < telephone type = " portable " > 07 08 09 10 11 </
telephone >
31 </ telephones >
32 </ personne >
33 </ personnes >

256
TP : MISE EN FORME DUN RPERTOIRE

La mise en forme
Voici la figure 26.7 une capture dcran de la mise en forme que vous devez reproduire.

Figure 26.7 Mise en page reproduire

Comme vous pouvez le constater, lidentit dune personne de sexe masculin est sur
fond bleu tandis que celle dune personne de sexe fminin est sur fond rose. Tous les
numros de tlphone sont sur fond gris.

Une solution
Pour ne pas changer, voici un exemple de solution.

Le fichier XML

Tout dabord, voyons le document XML avec le fichier de style CSS rfrenc :
1 <? xml version = " 1 . 0 " encoding = " UTF - 8 " ? >
2 <? xml - stylesheet href = " personnes . css " type = " text / css " ? >
3 < personnes >
4 < personne sexe = " masculin " >
5 < identite >
6 < nom > NORRIS </ nom >
7 < prenom > Chuck </ prenom >
8 </ identite >
9 < telephones >
10 < telephone type = " fixe " > 01 02 03 04 05 </ telephone >
11 < telephone type = " portable " > 06 07 08 09 10 </
telephone >
12 </ telephones >
13 </ personne >
14
15 < personne sexe = " feminin " >

257
CHAPITRE 26. METTEZ EN FORME VOS DOCUMENTS XML AVEC CSS

16 < identite >


17 < nom > DUPONT </ nom >
18 < prenom > Marie </ prenom >
19 </ identite >
20 < telephones >
21 < telephone type = " bureau " > 04 05 06 07 08 </ telephone >
22 </ telephones >
23 </ personne >
24
25 < personne sexe = " masculin " >
26 < identite >
27 < nom > PAUL </ nom >
28 < prenom > Bernard </ prenom >
29 </ identite >
30 < telephones >
31 < telephone type = " portable " > 07 08 09 10 11 </
telephone >
32 </ telephones >
33 </ personne >
34 </ personnes >

Le fichier CSS

Revenons maintenant sur le fichier CSS :


1 personne {
2 display : block ;
3 }
4
5 identite {
6 display : block ;
7 padding : 10px ;
8 font - weight : bold ;
9 color : white ;
10 }
11
12 personne [ sexe = " masculin " ] identite {
13 background - color :# 008080 ;
14 }
15
16 personne [ sexe = " feminin " ] identite {
17 background - color :# FBA0FE ;
18 }
19
20 telephones {
21 display : block ;
22 background - color :# EEE ;
23 padding : 5px 10px ;
24 }

258
TP : MISE EN FORME DUN RPERTOIRE

25
26 telephone {
27 display : block ;
28 }

En rsum
il est possible dappliquer directement une feuille de style CSS un document XML.

259
CHAPITRE 26. METTEZ EN FORME VOS DOCUMENTS XML AVEC CSS

260

Vous aimerez peut-être aussi