Académique Documents
Professionnel Documents
Culture Documents
L'essentiel de XML
Olivier Carton
iii
Cours XML
iv
108
109
110
111
113
115
117
117
119
119
121
122
123
123
129
130
131
134
136
138
138
139
140
140
140
141
141
141
145
145
146
147
148
150
150
150
153
153
154
157
157
159
162
162
165
165
165
165
165
165
166
166
168
170
171
1.1. Historique
L'historique suivant retrace les grandes tapes qui ont conduit la naissance de XML.
1986
Introduction de SGML [ ] par Charles Goldfarb.
1991
Introduction de HTML [ ] par Tim Berners-Lee pour le WEB.
1998
Publication par le W3C [ ] de la version 1.0 d'XML [ ].
1999
Redfinition de HTML 4.0 en XHTML [ ] travers XML.
2004
Publication par le W3C [ ] de la version 1.1 de XML pour une mise jour des caractres spciaux en lien
avec Unicode.
1.2. Intrts
Sparation stricte entre contenu et prsentation
Structuration forte du document
Extensibilit
Modles de documents (DTDs et XML-Schmas)
Modularit des modles
Validation du document par rapport au modle
Format texte avec gestion des caractres spciaux
Format libre
Nombreuses technologies dveloppes autour de XML
Introduction XML
XQuery [ ]
Requtes de base de donnes
XSL [ ]
Transformation de documents
Schmas XML [ ]
Modles de documents
1.4. Applications
RSS [ ] (Really Simple Syndication)
Flux de donnes
XUL [ ] (XML-based User interface Language)
Langage de description d'interfaces graphiques
SVG [ ] (Scalable Vector Graphics)
Dessin vectoriel
SMIL [ ] (Synchronized Multimedia Integration Language)
Multimdia
MathML [ ]
Formules mathmatiques
WSDL [ ] (Web Services Description Language)
Langage de description de services WEB
XML Signature [ ]
Format pour les signatures lctroniques
SAML [ ] (Security assertion markup language)
Langage d'change d'authentifications et d'autorisations
UBL [ ] (Universal Business Language)
Bibliothque de documents standards pour les changes commerciaux
OpenDocument [ ]
Format de document pour les applications bureautiques. Il a d'abord t introduit par OpenOffice et il an
ensuite t adopt par d'autres applications comme KOffice.
DocBook [ ]
Format de documentation technique utilis pour cet ouvrage
De nombreux projets informatiques utilisent XML pour le stockage de donnes et en particulier de fichiers de
configurations.
ANT [ ]
Android [ ]
1.5. DocBook
DocBook est un exemple typique d'utilisation de XML. Il s'agit d'un format pour des documents techniques. Cet
ouvrage a t crit en utilisant DocBook.
DocBook tait au dpart bas sur SGML mais il s'appuie maintenant sur XML. Il met l'accent sur la smantique du
document. Il contient de nombreuses balises permettant de dcrire le contenu. Il existe ensuite des outils permettant
de traduire un document DocBook en pages HTML ou en document PDF.
Introduction XML
DocBook dcrit trs prcisment la structure du document en utilisant de nombreuses balises. Par contre, il ne
dcrit pas du tout le rendu du document. Il n'est pas possible de spcifer par exemple la couleur ou la fonte du
texte. L'ide principale de DocBook est de permettre la production de plusieurs documents finaux partir d'un
mme document original : document PDF, pages WEB.
Syntaxe de XML
Un fichier XML contient du texte dans un format de codage d'Unicode [ ], par exemple UTF-8 [ ] ou Latin1
[ ]. Le codage utilis par le fichier est prcis dans l'entte du fichier.
Un document XML est, la plupart du temps, stock dans un fichier mais il peut aussi tre dmatrialiser et exister
indpendament de tout fichier. Il peut, par exemple, exister au sein d'une application qui l'a construit. Une chane de
traitement de documents XML peut produire des documents intermdiaires qui sont dtruits la fin. Ces documents
existent uniquement pendant le traitement et sont jamais mis dans un fichier.
Prologue
...
<root-element>
...
Corps
</root-element>
Dans l'exemple donn au dbut de ce chapitre, le prologue comprend les trois premires lignes du fichier. La
premire ligne est l'entte XML et la deuxime est simplement un commentaire utilis par Emacs pour mmoriser
le nom du fichier et sa date de dernire modification. La troisime ligne est la dclaration d'une DTD externe
contenue dans le fichier bibliography.dtd. Le corps du document commence la quatrime ligne du fichier
avec la balise ouvrante <bibliography>. Il se termine la dernire ligne de celui-ci avec la balise fermante
</bibliography>.
2.4. Prologue
Le prologue contient deux dclarations facultatives mais fortement conseilles ainsi que des commentaires et des
instructions de traitement. La premire dclaration est l'entte XML qui prcise entre autre la version de XML et
le codage du fichier. La seconde dclaration est la dclaration du type du document (DTD) qui dfinit la structure
du document. La dclaration de type de document est omise lorsqu'on utilise des schmas XML ou d'autres types
de modles qui remplacent les DTD. La structure globale du prologue est la suivante.
<?xml ... ?>
<!DOCTYPE root-element [
...
]>
Entte XML
DTD
Les diffrentes parties du prologue sont dtailles dans les sections suivantes.
Prologue
Syntaxe de XML
Syntaxe de XML
Il est possible d'insrer n'importe quel caractre Unicode dans un document XML en utilisant une des deux syntaxes
&#code dcimal; ou ode hexadcimal;. Le caractre euro '' peut par exemple tre insr par
€ ou €.
Certaines ligatures comme '' sont considres par Unicode comme un seul caractre plutt que comme la fusion
des deux caractres 'oe'. Il s'ensuit que les deux mots 'cur' et 'coeur' sont considrs comme distincts. Ce problme
est rsolu par l'utilisation de collations lors du traitement des documents. Une collation est une collection de rgles
qui tablissent des quivalences entre des caractres ou des suites de caractres. Une collation peut, par exemple,
dclarer que le caractre '' est quivalent aux deux caractres 'oe'. Une collation tablit aussi l'ordre des caractres
utilis pour l'ordre lexicographique. Elle peut, par exemple, dclarer que le caractre '' se place entre les caractres
'e' et 'f'. La collation par dfaut est base sur les codes Unicode des caractres. Le caractre '' se trouve, pour cette
collation, aprs le caractre 'z' et le mot 'zbre' est donc avant le mot 'talon' dans l'ordre lexicographique.
Le mme caractre peut tre reprsent de plusieurs faons en Unicode. Ce phnomne provient du fait qu'Unicode
a t construit en fusionnant plusieurs codages et qu'il tente de rester compatible avec chacun d'eux. Le caractre
'' peut, par exemple, tre reprsent par le code xB5 qui provient de Latin-1 et du code x3BC qui provient
du bloc des caractres grecs. D'autres caractres encore peuvent avoir un codage en un seul caractre et un autre
codage fait d'une suite de plusieurs codes. Le caractre '' peut, par exemple, tre cod par le code xEF ou par
la suite x69 x308 forme du code de 'i' suivi par un code spcial du trma ''. Ce codage multiple conduit
des problmes, en particulier pour la comparaison des chanes de caractres. Pour palier ce problme, Unicode
introduit des normalisations qui transforment les diffrents codages en un codage canonique. La normalisation
la plus standard est la normalisation C. Celle-ci transforme, par exemple, la suite de codes x69 x308 en le
code xEF du caractre ''. La normalisation d'une chane de caractres peut tre obtenue avec la fonction XPath
normalize-unicode().
Quelques exemples de fichiers
Fichier au format UTF-8 : example-utf8.xml [Examples/example-utf8.xml]
Fichier au format Latin-1 : example-latin1.xml [Examples/example-latin1.xml]
Fichier au format Latin-15 : example-latin15.xml [Examples/example-latin15.xml]
Syntaxe de XML
Les caractres autoriss dans les identificateurs sont tous les caractres alphanumriques, c'est--dire les lettres
minuscules [a-z], majuscules [A-Z] et les chiffres [0-9] ainsi que le tiret soulign '_', le tiret '-', le point
'.' et les deux points ':'.
Un jeton est une suite quelconque de ces caractres qui ne commence pas par les trois lettres xml en minuscule ou
majuscule, c'est--dire par une chane de [xX][mM][lL]. Les identificateurs commenant par ces trois lettres
sont rservs aux usages internes de XML. Un nom XML est un jeton qui, en outre, commence par une lettre
[a-zA-Z], le caractre '_' ou le caractre ':'. Les deux caractres '-' et '.' ne peuvent pas apparatre au
dbut des noms. Le caractre ':' est rserv l'utilisation des espaces de noms [Chapitre 4]. De fait, il ne peut
apparatre qu'une seule fois pour sparer un prfixe du nom local dans les noms des lments et des attributs. Il
n'y a en revanche aucune restriction pour les autres utilisations des noms.
La norme XML 1.1 prvoit que tout caractre Unicode de catgorie lettre peut apparatre dans les identificateurs.
Il est, par exemple, possible d'avoir des noms d'lments avec des caractres accentus. Il est cependant conseill
de se limiter aux caractres ASCII de [a-zA-Z] pour assurer une meilleure compatibilit. Beaucoup de logiciels
ne grent pas les autres caractres dans les identificateurs.
2.5.2. lments
<t a g 1 >
</ t a g 1 >
<t a g 2 >
</ t a g 2 >
Syntaxe de XML
l'autre. Autrement dit, si la balise ouvrante <tag2> se trouve entre les deux balises <tag1> et <tag1/>, alors
la balise fermante </tag2> doit aussi se trouver entre les deux balises <tag1> et <tag1/> (cf. Figure 2.3).
<parent>
<sibling1>
<sibling2>
<self>
<child1>
<child2>
<child3>
</self>
<sibling3>
</parent>
... </sibling1>
... </sibling2>
... <desc1></desc1> ... <desc2></desc2> ... </child1>
... </child2>
... <desc3><desc4> ... </desc4></desc3> ... </child3>
... </sibling3>
pa r e nt
s i bl i ng1
s i bl i ng2
s el f
c hi l d1
c hi l d2
de s c 1
de s c 2
s i bl i ng3
c hi l d3
de s c 3
de s c 4
Syntaxe de XML
2.5.4. Attributs
Les balises ouvrantes peuvent contenir des attributs associs des valeurs. L'association de la valeur l'attribut
prend la forme attribute='value' ou la forme attribute="value" o attribute et value sont
respectivement le nom et la valeur de l'attribut. Chaque balise ouvrante peut contenir zro ou plusieurs associations
de valeurs des attributs comme dans les exemples ci-dessous.
<tag attribute="value"> ... </tag>
<tag attribute1="value1" attribute2="value2"> ... </tag>
Voici ci-dessous d'autres exemples de balises ouvrantes avec des attributs.
<body background='yellow'>
<xsd:element name="bibliography" type="Bibliography">
<a href="#{$node/@idref}">
Lorsque le contenu de l'lment est vide et que la balise ouvrante et la balise fermante sont contractes en une
seule balise, celle-ci peut contenir des attributs comme la balise ouvrante.
<hr style="color:red; height:15px; width:350px;" />
<xsd:attribute name="key" type="xsd:NMTOKEN" use="required"/>
<xsl:value-of select="key('idchapter', @idref)/title"/>
Le nom de chaque attribut doit tre un nom XML [Section 2.5.1]. La valeur d'un attribut peut tre une chane
quelconque de caractres dlimite par une paire d'apostrophes ''' ou une paire de guillemets '"'. Elle ne
peut pas contenir les caractres spciaux '<', '>' et '&'. Ces caractres peuvent toutefois tre introduits par
les entits prdfinies [Section 3.3.1.1]. Si la valeur de l'attribut est dlimite par des apostrophes ''', elle peut
contenir des guillemets '"' et inversement.
Comme des espaces peuvent tre prsents dans la balise aprs le nom de l'lment et entre les attributs, l'indentation
est libre pour crire les attributs d'une balise ouvrante. Aucun espace ne peut cependant sparer le caractre '='
du nom de l'attribut et de sa valeur. Il est ainsi possible d'crire l'exemple gnrique suivant.
<tag attribute1="value1"
attribute2="value2"
...
attributeN="valueN">
...
</tag>
L'ordre des attributs n'a pas d'importance. Les attributs d'un lment doivent avoir des noms distincts. Il est donc
impossible d'avoir deux occurrences du mme attribut dans une mme balise ouvrante.
Le bon usage des attributs est pour les meta-donnes plutt que les donnes elles-mmes. Ces dernires doivent
tre places de prfrence dans le contenu des lments. Dans l'exemple suivant, la date proprement dite est place
dans le contenu alors que l'attribut format prcise son format. La norme ISO 8601 [ ] spcifie la reprsentation
numrique de la date et de l'heure.
<date format="ISO-8601">2009-01-08</date>
C'est une question de style de mettre les donnes dans les attributs ou dans les contenus des lments. Le nom
complet d'un individu peut, par exemple, tre rparti entre des lments firstname et surname regroups dans
un lment personname comme dans l'exemple ci-dessous.
<personname id="I666">
<firstname>Gaston</firstname>
<surname>Lagaffe</surname>
</personname>
Les lments firstname et surname peuvent tre remplacs par des attributs de l'lment personname
comme dans l'exemple ci-dessous. Les deux solutions sont possibles mais la premire est prfrable.
10
Syntaxe de XML
11
Syntaxe de XML
son URL de base est son adresse Internet, par exemple http://www.liafa.jussieu.fr/~carton/
index.html. Lorsque le document est trait localement, son URL de base est son chemin d'accs dans
l'arborescence des fichiers, par exemple file:/home/carton/Enseignement/XML/index.html.
Pour comprendre comment une URL relative se combine avec une URL complte, il faut d'abord comprendre la
structure d'une URL. La description donne ci-dessous se limite aux aspects indispensables pour apprhender la
composition des adresses. Chaque URL se dcompose en trois parties.
Protocole d'accs
Une URL commence obligatoirement par le nom d'un protocole d'accs suivi du caractre ':'. Les principaux
protocoles sont http, https, ftp et file.
Adresse Internet
Le protocole est suivi d'une adresse Internet qui commence par les deux caractres '//'. Cette adresse est
absente dans le cas du protocole file.
Chemin d'accs
L'URL se termine par un chemin d'accs dans l'arborescence des fichiers. Ce chemin se dcompose lui-mme
en le nom du rpertoire et le nom du fichier. Ce dernier est form de tous les caractres aprs le dernier
caractre '/'.
Rpertoire
Protocole
Adresse Internet
Chem in d'accs
Rpertoire
Protocole
Fichier
Fichier
Chem in d'accs
12
Syntaxe de XML
</book>
http://www.somewhere.org/Enseignement/index.html
http://www.somewhere.org/Enseignement/XML/chapter.html
http://www.somewhere.org/Enseignement/XML/XPath/section.html
http://www.somewhere.org/Course/section.html
http://www.elsewhere.org/section.html
Balise ouvrante
Corps
...
lments, commentaires et
du
...
instructions de traitement
Balise fermante
...
<root-element>
</root-element>
...
document
2.5.7. Commentaires
Les commentaires sont dlimits par les chanes de caractres '<!--' et '-->' comme en HTML. Ils ne
peuvent pas contenir la chane '--' forme de deux tirets '-' et ils ne peuvent donc pas tre imbriqus. Ils
peuvent tre prsents dans le prologue et en particulier dans la DTD. Ils peuvent aussi se situer dans le contenu de
n'importe quel lment et aprs l'lment racine. Un exemple de document XML avec des commentaires partout
o ils peuvent apparatre est donn ci-dessous.
<?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>
<!-- Commentaire dans le prologue avant la DTD -->
<!DOCTYPE simple [
<!-- Commentaire dans la DTD -->
<!ELEMENT simple (#PCDATA) >
]>
<!-- Commentaire entre le prologue et le corps -->
<simple>
<!-- Commentaire au dbut du contenu de l'lment simple -->
Un exemple simplissime
<!-- Commentaire la fin du contenu de l'lment simple -->
</simple>
<!-- Commentaire aprs le corps -->
Les caractres spciaux '<', '>' et '&' peuvent apparatre dans les commentaires. Il est en particulier possible
de mettre en commentaire des lments avec leurs balises comme dans l'exemple ci-dessous.
13
Syntaxe de XML
14
Syntaxe de XML
15
Syntaxe de XML
...
</chapter>
...
</book>
16
Chapitre 3. DTD
Le rle d'une DTD (Document Type Definition) est de dfinir prcisment la structure d'un document. Il s'agit
d'un certain nombre de contraintes que doit respecter un document pour tre valide. Ces contraintes spcifient
quelles sont les lments qui peuvent apparatre dans le contenu d'un lment, l'ordre ventuel de ces lments
et la prsence de texte brut. Elles dfinissent aussi, pour chaque lment, les attributs autoriss et les attributs
obligatoires.
Les DTD ont l'avantage d'tre relativement simples utiliser mais elles sont parfois aussi un peu limites. Les
schmas permettent de dcrire de faon plus prcise encore la structure d'un document. Ils sont plus sophistiqus
mais plus difficiles manipuler.
Dclaration de l'lment bibliography devant contenir une suite non vide d'lments book.
Dclaration de l'lment book devant contenir les lments title, author, , isbn et url.
Dclarations des attributs obligatoires key et lang de l'lment book.
Dclaration de l'lment title devant contenir uniquement du texte.
17
DTD
Le nom de l'lment racine est suivi du contenu de la DTD dans le cas d'une DTD interne ou de l'URL du fichier
contenant la DTD dans le cas d'une DTD externe.
18
DTD
Caractre
<
<
>
>
&
&
"
"
'
'
19
DTD
20
DTD
L'entit entity ainsi dclare peut tre utilise en crivant %entity; o le nom de l'entit est encadr des
caractres '%' et ';'. Une entit paramtre peut uniquement tre utilise dans la partie externe de la DTD.
L'exemple suivant dfinit deux entits paramtre idatt et langatt permettant de dclarer des attributs id et
xml:lang facilement.
<!ENTITY % idatt
"id ID #REQUIRED" >
<!ENTITY % langatt "xml:lang NMTOKEN 'fr'" >
<!ATTLIST chapter %idatt; %langatt; >
<!ATTLIST section %langatt; >
Les entits paramtre ajoutent de la modularit qui est surtout ncessaire dans l'criture de DTD de grande taille.
Dans l'exemple prcdent, l'attribut id pourrait tre remplac partout par un attribut xml:id en changeant
uniquement la dfinition de l'entit paramtre idatt.
Signification
Mise en squence
Choix
0 ou 1 occurrence
21
DTD
22
DTD
23
DTD
24
DTD
ces lments a un attribut id de type ID. Le contenu des lments section est constitu de texte et d'lments
ref et refs ayant respectivement un attribut idref de type IDREF et un attribut idrefs de type IDREFS.
Ces lments permettent, dans le contenu d'une section, de rfrencer une (par ref) ou plusieurs (par refs)
autres sections. Il faut remarquer que les lments ref et refs n'ont jamais de contenu. Ils sont dclars vides
en utilisant le mot cl EMPTY. Il appartient l'application qui gnre le document final d'ajouter du contenu qui
peut tre par exemple le numro ou le titre de la section rfrence.
<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>
<!DOCTYPE book [
<!ELEMENT book
(section)* >
<!ELEMENT section (#PCDATA | ref | refs)* >
<!ATTLIST section id ID #IMPLIED>
<!ELEMENT ref
EMPTY >
<!ATTLIST ref
idref IDREF #REQUIRED >
<!ELEMENT refs
EMPTY >
<!ATTLIST refs
idrefs IDREFS #REQUIRED >
]>
<book>
<section id="sec0">Une rfrence <ref idref="sec1"/></section>
<section id="sec1">Des rfrences <refs idrefs="sec0 sec2"/></section>
<section id="sec2">Section sans rfrence</section>
<section id="sec3">Une auto-rfrence <refs idrefs="sec3"/></section>
</book>
Les attributs de type ID et IDREF permettent galement de structurer un document. Si l'adresse et d'autres
informations sont ajoutes l'diteur dans le document bibliography.xml, celles-ci sont recopies dans
chaque livre publi par l'diteur. Cette duplication de l'information est bien sr trs mauvaise. Une meilleure
approche consiste scinder la bibliographie en deux parties. Une premire partie contient les livres et une seconde
les diteurs avec les informations associes. Ensuite chaque livre se contente d'avoir une rfrence sur son diteur.
Un attribut id de type ID est ajout chaque lment publisher de la seconde partie. Chaque lment
publisher contenu dans un lment book est remplac par un lment published ayant un attribut by de
type IDREF.
<?xml version="1.0" encoding="iso-8859-1"?>
<bibliography>
<books>
<book key="Michard01" lang="fr">
<title>XML langage et appplications</title>
<author>Alain Michard</author>
<year>2001</year>
<isbn>2-212-09206-7</isbn>
<url>http://www.editions-eyrolles/livres/michard/</url>
<published by="id2680397"/>
</book>
<book key="Marchal00" lang="en">
<title>XML by Example</title>
<author>Benot Marchal</author>
<year>2000</year>
<isbn>0-7897-2242-9</isbn>
<published by="id2680427"/>
</book>
...
</books>
<publishers>
<publisher id="id2680397">
<name>Eyrolles</name>
<address>Paris</address>
</publisher>
<publisher id="id2680427">
25
DTD
3.3.3.4. Exemples
Voici quelques exemples de dclarations d'attributs avec, pour chacune d'elles, des valeurs valides et non valides
pour l'attribut.
<!ATTLIST tag meta CDATA "default" >
La valeur de l'attribut meta peut tre une chane quelconque et sa valeur par dfaut est la chane default.
<tag meta="Hello World!">
<tag>
<tag meta="">
<tag meta="=='"==">
<tag meta='=='"=='>
<tag meta="==<&>==">
<tag meta="==<&>==">
<book lang="fr">
26
DTD
<book lang="en">
<book lang="de">
<book name="en">
<book name="-id234"/>
<entry id="id-234">
<xref ref="-id234"/>
<rule style="free">
<rule style="libre">
27
28
Espaces de noms
...
</mml:apply>
</mml:math>
...
</html:body>
</html:html>
C'est l'URI associ au prfixe qui dtermine l'espace de noms. Le prfixe est juste une abrviation pour l'URI.
Deux prfixes associs au mme URI dterminent le mme espace de noms. Dans l'exemple suivant, les deux
lments firstname et surname font partie du mme espace de noms. L'exemple suivant est seul donn pour
illustrer le propos mais il n'est pas suivre. C'est une mauvaise pratique d'associer deux prfixes la mme URI.
<name xmlns:foo="http://www.somewhere.org/uri"
xmlns:bar="http://www.somewhere.org/uri">
<!-- Les deux lments firstname et surname
appartiennent au mme espace de noms. -->
<foo:firstname>Gaston<foo:firstname>
<bar:surname>Lagaffe<bar:surname>
</name>
29
Espaces de noms
</head>
<body>
...
<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML">
<mml:apply>
<mml:eq/>
...
</mml:apply>
</mml:math>
...
</body>
</html>
Comme la dclaration de l'espace de noms est locale l'lment, l'exemple prcdent aurait pu tre crit de faon
encore plus simplifie en changeant localement dans l'lment math l'espace de noms par dfaut.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Espaces de noms</title>
</head>
<body>
...
<math xmlns="http://www.w3.org/1998/Math/MathML">
<apply>
<eq/>
...
</apply>
</math>
...
</body>
</html>
Tant que l'espace de noms par dfaut n'a pas t spcifi, les lments dont le nom n'est pas qualifi ne font partie
d'aucun espace de noms. Leur proprit espace de noms n'a pas de valeur. Il est possible de revenir l'espace de
noms par dfaut non spcifi en affectant la chane vide l'attribut xmlns comme dans l'exemple suivant.
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- L'espace de noms par dfaut est spcifi -->
<!-- Tous les lments html, head, title, body, ...
appartiennent l'espace de noms par dfaut. -->
<head>
<title>Espaces de noms</title>
</head>
<body>
...
<name xmlns="">
<!-- L'espace de noms par dfaut n'est plus spcifi -->
<!-- Les trois lments name, firstname et surname
n'appartiennent aucun espace de noms. -->
<firstname>Gaston<firstname>
<surname>Lagaffe<surname>
</name>
...
</body>
</html>
Une consquence de la remarque prcdente est que dans un document XML sans dclaration d'espace de
noms, tous les lments ne font partie d'aucun espace de noms. Ce comportement assure une compatibilit des
applications avec les documents sans espace de noms.
30
Espaces de noms
4.5. Attributs
Les attributs peuvent galement avoir des noms qualifis. Ils font alors partie de l'espace de noms donn par le
prfixe comme dans l'exemple suivant. L'attribut noNamespaceSchemaLocation fait partie de l'espace de
noms des instances de schmas identifi par l'URL http://www.w3.org/2001/XMLSchema-instance.
Le nom de l'attribut noNamespaceSchemaLocation doit donc avoir un prfixe associ cette URL. La
dclaration de l'espace de noms peut avoir lieu dans le mme lment, comme dans l'exemple ci-dessous, puisque
la porte de celle-ci est l'lment tout entier.
<?xml version="1.0" encoding="iso-8859-1" ?>
<bibliography xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="bibliography.xsd">
...
En revanche, les attributs dont le nom n'est pas qualifi ne font jamais partie de l'espace de noms par dfaut. Cette
rgle s'applique que l'espace de noms par dfaut soit spcifi ou non. Dans l'exemple ci-dessous, l'lment book
appartient l'espace de noms DocBook puisque celui-ci est dclar comme l'espace de noms par dfaut. L'attribut
id appartient l'espace de noms XML et l'attribut version n'appartient aucun espace de noms.
<book version="5.0"
xml:id="course.xml"
xmlns="http://docbook.org/ns/docbook">
31
Espaces de noms
XSLT [Chapitre 8]
http://www.w3.org/1999/XSL/Transform
XSL-FO [Chapitre 9]
http://www.w3.org/1999/XSL/Format
DocBook [Section 1.5]
http://docbook.org/ns/docbook
Schematron [Chapitre 7]
http://purl.oclc.org/dsdl/schematron
32
33
Schmas XML
<xsd:element name="isbn"
type="xsd:string"/>
<xsd:element name="url" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="key" type="xsd:NMTOKEN" use="required"/>
<xsd:attribute name="lang" type="xsd:NMTOKEN" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
lment racine xsd:schema avec la dclaration de l'espace de noms des schmas associ au prfixe xsd.
Documentation du schma.
Dclaration de l'lment bibliography avec le type Bibliography.
Dbut de la dfinition du type Bibliography.
Dclaration de l'lment book dans le contenu du type Bibliography.
Dclaration des attributs key et lang de l'lment book avec le type xsd:NMTOKEN.
Ce schma dclare l'lment bibliography du type Bibliography qui est ensuite introduit par
<xsd:complexType>. Ce type est alors dfini comme une suite d'autres lments introduite par le constructeur
<xsd:sequence>. Les deux attributs key et lang de l'lment book sont introduits par les dclarations
<xsd:attribute ... />.
Dans tout ce chapitre, la convention suivante est applique. Les noms des lments sont en minuscules alors que
les noms des types commencent par une majuscule comme les classes du langage Java. Les noms de l'lment et
de son type ne se diffrencient souvent que par la premire lettre comme bibliography et Bibliography
dans l'exemple prcdent.
34
Schmas XML
Les lments sont dclars par l'lment xsd:element et les attributs par l'lment xsd:attribute. Les
types sont dfinis par les lments xsd:simpleType et xsd:complexType.
35
Schmas XML
Dans l'exemple suivant, le document dclare que le schma se trouve dans le fichier local bibliography.xsd
et que l'espace de noms cible de ce schma est identifi par l'URL http://www.liafa.jussieu.fr/
~carton/.
<?xml version="1.0" encoding="iso-8859-1"?>
<bibliography xsi:schemaLocation="http://www.liafa.jussieu.fr/~carton/
bibliography.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
5.3.3. Documentation
L'lment xsd:annotation permet d'ajouter des commentaires dans un schma. Il peut tre enfant de l'lment
schma pour des commantaires globaux. Il peut aussi se placer dans les dclarations d'lments et les dfinitions
de types pour des commentaires cibls. Contrairement aux commentaires XML, ces commentaires font partie
part entire du schma XML et consituent sa documentation.
<xsd:annotation>
<xsd:documentation xml:lang="fr">
Commentaire en franais
</xsd:documentation>
<xsd:appInfo>
Information destine aux applications
</xsd:appInfo>
</xsd:annotation>
36
Schmas XML
<xsd:element name="element">
<xsd:simpleType>
...
</xsd:simpleType>
</xsd:element>
<xsd:element name="element">
<xsd:complexType>
...
</xsd:complexType>
</xsd:element>
37
Schmas XML
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Un document valide pour le schma suivant est le suivant.
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<lists>
<strings>
<local>Une chane</local>
<local>A string</local>
</strings>
<integers>
<local>-1</local>
<local>1</local>
</integers>
</lists>
38
Schmas XML
unsignedByte
Entier non sign sur 8 bits
integer
Entier arbitraire. Ce type n'est pas primitif. Il drive du type decimal.
positiveInteger
Entier strictement positif
negativeInteger
Entier strictement ngatif
nonPositiveInteger
Entier ngatif ou nul
nonNegativeInteger
Entier positif ou nul
int
Entier sign sur 32 bits
unsignedInt
Entier non sign sur 32 bits
long
Entier sign sur 64 bits. Ce type drive du type integer.
unsignedLong
Entier non sign sur 64 bits
short
Entier sign sur 16 bits
unsignedShort
Entier non sign sur 16 bits
decimal
Nombre dcimal
time
Heure au format hh:mm:ss[.sss][TZ], par exemple 14:07:23. La partie fractionnaire .sss des
secondes est optionnelle. Tous les autres champs sont obligatoires. Les nombres d'heures, minutes et de
secondes doivent tre crits avec deux chiffres en compltant avec 0. L'heure peut tre suivie d'un dcalage
horaire TZ qui est soit Z pour le temps universel soit un dcalage commenant par + ou - comme -07:00.
date
Date au format YYYY-MM-DD, par exemple 2008-01-16. Tous les champs sont obligatoires.
dateTime
Date et heure au format YYYY-MM-DDThh:mm:ss, par exemple 2008-01-16T14:07:23. Tous les
champs sont obligatoires.
duration
Dure au format PnYnMnDTnHnMnS
Les schmas XML reprennent les types des DTD afin de faciliter la traduction des DTD en schemas.
xsd:ID
nom XML identifiant un lment
39
Schmas XML
xsd:IDREF
rfrence un lment par son identifiant
xsd:IDREFS
liste de rfrences des lments par leurs identifiants
40
Schmas XML
type="xsd:string"/>
type="xsd:string"/>
type="xsd:string"/>
type="xsd:string"/>
41
Schmas XML
</xsd:complexType>
</xsd:element>
Cette dclaration est quivalente la dclaration suivante dans une DTD.
<!ELEMENT book (title, author, year, publisher)>
type="xsd:string"/>
type="xsd:string"/>
type="xsd:string"/>
type="xsd:string"/>
Les attributs minOccurs et maxOccurs (voir ci-dessous) des lments apparaissant sous l'oprateur xsd:all
ne peuvent pas avoir des valeurs quelconques. La valeur de l'attribut minOccurs doit tre 0 ou 1 et la valeur de
l'attribut maxOccurs doit tre 1 qui est la valeur par dfaut.
42
Schmas XML
<xsd:simpleType name="IntegerOrUnbounded">
<xsd:union memberTypes="Unbounded xsd:nonNegativeInteger"/>
</xsd:simpleType>
<xsd:simpleType name="Unbounded">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="unbounded"/>
</xsd:restriction>
</xsd:simpleType>
Les types paramtres de l'oprateur d'union peuvent aussi tre anonymes. Ils sont alors explicits directement dans
le contenu de l'lment xsd:union comme dans l'exemple suivant qui conduit une dfinition quivalence
celle de l'exemple prcdent.
<xsd:simpleType name="IntegerOrUnbounded">
<xsd:union memberTypes="xsd:nonNegativeInteger">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="unbounded"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
5.6.7. Rptitions
Les attributs minOccurs et maxOccurs permettent de prciser le nombre minimal ou maximal d'occurrences
d'un lment ou d'un groupe. Ils sont l'quivalent des oprateurs ?, * et + des DTD. Ils peuvent apparatre comme
attribut des lments xsd:element, xsd:sequence, xsd:choice et xsd:all. L'attribut minOccurs
prend un entier comme valeur. L'attribut minOccurs prend un entier ou la chane unbounded comme valeur
pour indiquer qu'il n'y a pas de nombre maximal. La valeur par dfaut de ces deux attributs est la valeur 1.
L'utilisation des attributs minOccurs et maxOccurs est illustre par l'quivalent en schma de quelques
fragments de DTD
<!ELEMENT elem (elem1, elem2?, elem3*) >
<xsd:element name="elem">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="elem1"/>
<xsd:element ref="elem2" minOccurs="0"/>
<xsd:element ref="elem3" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
43
Schmas XML
</xsd:complexType>
</xsd:element>
<!ELEMENT elem (elem1, (elem2 | elem3), elem4) >
<xsd:element name="elem">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="elem1"/>
<xsd:choice>
<xsd:element ref="elem2"/>
<xsd:element ref="elem3"/>
<xsd:choice>
<xsd:element ref="elem4"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!ELEMENT elem (elem1, elem2, elem3)* >
<xsd:element name="elem">
<xsd:complexType>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="elem1"/>
<xsd:element ref="elem2"/>
<xsd:element ref="elem3"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!ELEMENT elem (elem1 | elem2 | elem3)* >
<xsd:element name="elem">
<xsd:complexType>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="elem1"/>
<xsd:element ref="elem2"/>
<xsd:element ref="elem3"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
<!ELEMENT elem (elem1, elem2, elem3)+ >
<xsd:element name="elem">
<xsd:complexType>
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element ref="elem1"/>
<xsd:element ref="elem2"/>
<xsd:element ref="elem3"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
44
Schmas XML
5.7.1. Localisation
Les dclarations d'attributs se placent normalement dans les dfinitions de types complexes qui peuvent tre
globaux ou locaux. Les types simples ne peuvent pas avoir d'attributs. La dfinition d'un type complexe se compose
de la description du contenu suivie de la dclaration des attributs. L'ordre de dclarations des attributs est sans
importance puisque l'ordre des attributs dans une balise n'est pas fixe.
Dans l'exemple suivant, le type complexe List dclare deux attributs form et lang. Les dclarations de ces
deux attributs se situent aprs la description du contenu du type List constitu d'une suite d'lments item. Le
type de l'attribut form est le type prdfini xsd:string alors que le type de l'attribut lang est le type global
et simple Lang dfini dans la suite du schma.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="List">
<!-- Contenu du type List -->
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="item" type="xsd:string"/>
</xsd:sequence>
<!-- Dclaration des attributs locaux form et lang du type List -->
<xsd:attribute name="form" type="xsd:string"/>
<xsd:attribute name="lang" type="Lang"/>
</xsd:complexType>
<!-- Type global et simple Lang pour l'attribut lang -->
<xsd:simpleType name="Lang">
<xsd:restriction base="xsd:string">
<xsd:length value="2"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="list" type="List"/>
</xsd:schema>
45
Schmas XML
Un attribut peut aussi tre global lorsque sa dclaration est enfant direct de l'lment xsd:schema. Cet attribut
peut alors tre ajout diffrents types complexes. La dfinition du type utilise l'lment xsd:attribute avec
un attribut ref qui remplace les deux attributs name et type. Cet attribut ref contient le nom de l'attribut global
ajouter. La dclaration globale d'un attribut est justifie lorsque celui-ci a des occurrences multiple. Elle accrot
la modularit en vitant de rpter la mme dclaration dans plusieurs types.
Le schma suivant dclare un attribut global lang de type xsd:language. Cet attribut est ajout deux reprises
dans le type global Texts et dans le type anonyme de l'lment text.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Dclaration de l'attribut global lang -->
<xsd:attribute name="lang" type="xsd:language"/>
<xsd:element
name="texts" type="Texts"/>
<xsd:complexType name="Texts">
<xsd:sequence>
<xsd:element name="text" maxOccurs="unbounded">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<!-- Ajout de l'attribut lang au type anonyme -->
<xsd:attribute ref="lang"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<!-- Ajout de l'attribut lang au type Texts -->
<xsd:attribute ref="lang"/>
</xsd:complexType>
</xsd:schema>
Lorsqu'un schma dclare un espace de noms cible [Section 5.13], les attributs globaux appartiennent
automatiquement cet espace de noms. Ceci signifie d'abord qu'ils doivent tre rfrencs par leur nom qualifi
dans le schma. L'ajout d'un attribut de nom name un type complexe prend alors la forme suivante o le prfixe
tns est associ l'espace de noms cible du schma.
<xsd:attribute ref="tns:name"/>
Cela signifie aussi qu'ils doivent avoir un nom qualifi dans les documents instance comme dans l'exemple suivant.
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<tns:texts tns:lang="fr" xmlns:tns="http://www.liafa.jussieu.fr/~carton/">
<text>Texte en franais</text>
<text tns:lang="en">Text in english</text>
</tns:texts>
46
Schmas XML
<xsd:attribute name="dummy"
type="xsd:string"
use="prohibited"/>
Le schma suivant donne une utilisation raliste de la valeur prohibited pour l'attribut use. Le type Date
dclare un attribut format optionnel. Le type Date-8601 est une restriction [Section 5.9] du type Date.
L'attribut format devient interdit et ne peut plus apparatre.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="Date">
<xsd:simpleContent>
<xsd:extension base="xsd:date">
<!-- Attribut format optionnel dans le type Date -->
<xsd:attribute name="format" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="Date-8601">
<xsd:simpleContent>
<xsd:restriction base="Date">
<!-- Attribut format interdit dans le type Date-8601 -->
<xsd:attribute name="format" type="xsd:string" use="prohibited"/>
</xsd:restriction>
</xsd:simpleContent>
</xsd:complexType>
<xsd:element name="date" type="Date-8601"/>
</xsd:schema>
47
Schmas XML
ou la restriction d'un type qui est dj dans cette catgorie. Lors d'une extension d'un type simple, l'lment
xsd:extension est toujours enfant d'un lment xsd:simpleContent. Les dclarations des attributs qui
sont ajouts sont places dans le contenu de l'lment xsd:extension.
Le fragment de schma suivant dfinit un type Price qui tend le type prdfini xsd:decimal en lui ajoutant
un attribut currency de type xsd:string
<xsd:complexType name="Price">
<xsd:simpleContent>
<xsd:extension base="xsd:decimal">
<!-- Attribut ajout -->
<xsd:attribute name="currency" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:element name="price" type="Price"/>
Un fragment de document valide peut tre le suivant.
<price currency="euro">3.14</price>
48
Schmas XML
49
Schmas XML
l'lment xsd:restriction explicite les restrictions au type de base. Dans le cas d'un type simple, l'lment
xsd:restriction est enfant direct de l'lment xsd:simpleType. Dans le cas d'un type complexe, il
est enfant d'un lment xsd:simpleContent ou xsd:complexContent, lui-mme enfant de l'lment
xsd:complexType.
50
Schmas XML
<xsd:simpleType name="Identifier">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[A-Za-z_][0-9A-Za-z_]*"/>
</xsd:restriction>
</xsd:simpleType>
La syntaxe des expressions rationnelles qui peuvent tre employes avec la restriction pattern sont les suivantes.
.
Tous les caractres sauf les retours la ligne ([\n\r])
\s
Espaces (espace, tabulation ou retour de ligne [#x20\t\n\r])
\S
Caractres autres que les espaces
\d
Chiffre
\D
Caractres autres que les chiffres
\w
Caractres alphanumriques et le tiret '-'
\W
Caractres autres que les caractres alphanumriques et le tiret
\i
Caractres commenant un identificateur (lettres, '_' ou ':')
\I
Caractres ne commenant pas un identificateur
{n}
Rptition n fois
{m,n}
Rptition entre m et n fois
[x-y]
Les caractres entre x et y
Il faut remarquer que les restrictions par numration ou par motif se combinent avec un ou logique. Le contenu
doit tre une des valeurs numres ou il doit tre dcrit par un des motifs. Au contraire, les autres restrictions
comme minInclusive et maxInclusive se combinent avec un et logique. Le contenu doit vrifier toutes
les contraintes pour tre valide.
51
Schmas XML
maxInclusive
minExclusive
minInclusive
pattern
fractionDigits
totalDigits
whiteSpace
52
Schmas XML
attribut aussi tre restreinte. Un attribut optionnel peut devenir interdit avec use="prohibited ou obligatoire
avec use="required". L'inverse est en revanche interdit. Il est galement impossible d'ajouter de nouveaux
attributs. Si un attribut possde une valeur par dfaut ou une valeur fixe, celle-ci ne peut tre ni modifie ni
supprime.
Dans le schma suivant, le type de base Base possde plusieurs attributs dont le type driv Derived modifie
l'utilisation.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Type de base -->
<xsd:complexType name="Base">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="decimal" type="xsd:decimal"/>
<xsd:attribute name="string"
type="xsd:string"/>
<xsd:attribute name="optional" type="xsd:string"/>
<xsd:attribute name="required" type="xsd:string" use="required"/>
<xsd:attribute name="fixed"
type="xsd:string" fixed="Fixed"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="Derived">
<xsd:simpleContent>
<xsd:restriction base="Base">
<!-- Restriction du type de l'attribut -->
<xsd:attribute name="decimal" type="xsd:integer"/>
<!-- Le nouveau type doit tre driv du type initial -->
<xsd:attribute name="decimal" type="xsd:string"/>
<!-- Restriction du type de l'attribut avec un type anonyme -->
<xsd:attribute name="string">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="32"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<!-- Restriction de l'utilisation de l'attribut -->
<xsd:attribute name="optional" type="xsd:string" use="required"/>
<!-- Impossible d'tendre l'utilisation de l'attribut -->
<xsd:attribute name="required" type="xsd:string" />
<!-- Impossible de changer ou supprimer la valeur fixe -->
<xsd:attribute name="fixed"
type="xsd:string"/>
<!-- Impossible d'ajouter un nouvel attribut -->
<xsd:attribute name="newattr" type="xsd:string"/>
</xsd:restriction>
</xsd:simpleContent>
</xsd:complexType>
...
</xsd:schema>
Il est encore possible de changer simultanment le type du contenu et certaines proprits des attributs. Dans le
schma suivant, le type est restreint au chanes d'au plus 32 caractres et le type de l'attribut decimal est chang
en le type xsd:integer.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Type de base -->
<xsd:complexType name="Base">
53
Schmas XML
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="decimal"
type="xsd:decimal"/>
<xsd:attribute name="unchanged" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="Derived">
<xsd:simpleContent>
<xsd:restriction base="Base">
<xsd:simpleType>
<!-- Nouveau type pour le contenu du type Derived -->
<xsd:restriction base="xsd:string">
<xsd:maxLength value="32"/>
</xsd:restriction>
</xsd:simpleType>
<!-- Restriction du type de l'attribut -->
<xsd:attribute name="decimal" type="xsd:integer"/>
<!-- Attribut unchanged inchang -->
</xsd:restriction>
</xsd:simpleContent>
</xsd:complexType>
...
</xsd:schema>
54
Schmas XML
<xsd:complexType name="Shortname">
<xsd:complexContent>
<xsd:restriction base="Name">
<xsd:sequence>
<!-- Nombre limit d'occurrences de l'lment firstname -->
<xsd:element name="firstname" type="xsd:string" maxOccurs="1"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:sequence>
<!-- Attribut id obligatoire -->
<xsd:attribute name="id" type="xsd:ID" use="required"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
Le document suivant est valide pour le schma prcdent.
<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<names xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>
<firstname>Elizabeth II</firstname>
<firstname>Alexandra</firstname>
<firstname>Mary</firstname>
<lastname>Windsor</lastname>
</name>
<shortname id="id-42">
<firstname>Bessiewallis</firstname>
<lastname>Warfield</lastname>
</shortname>
</names>
Il est aussi possible de restreindre un type complexe en remplaant le type d'un lment par un type driv. Dans
l'exemple suivant, le type de l'lment integer est xsd:integer dans le type Base. Ce type est remplac
par le type xsd:nonNegativeInteger dans le type Restriction.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="Base">
<xsd:sequence>
<xsd:element name="integer" type="xsd:integer"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Restriction">
<xsd:complexContent>
<xsd:restriction base="Base">
<xsd:sequence>
<xsd:element name="integer" type="xsd:nonNegativeInteger"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
...
</xsd:schema>
Une restriction d'un type complexe contenu complexe peut aussi supprimer un des choix possible dans un lment
xsd:choice. Dans l'exemple suivant, le choix integer a t supprim dans le type Float.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
55
Schmas XML
5.10. Substitutions
Les schmas XML prvoient plusieurs mcanisme de substitution au niveau des types et des lments. Dans la
substitution de type, un document peut changer explicitement la type associ un lment afin d'y placer un
contenu diffrent de celui prvu par le schma. La substitution d'lment va encore plus. Un document peut
remplacer un lment par un autre lment.
Les substitutions ne sont pas toujours possibles. Une premire condition pour qu'elles puissent s'effectuer est que
les types soient compatibles. Il faut que le type de substitution soit un type driv du type initial. Les substitutions
sont donc troitement lies aux diffrents faons d'obtenir des type drivs par restriction ou extension.
Une seconde condition pour rendre possible les substitutions est que celles-ci doivent tre autorises par le schma.
Les schma possdent diffrent outils pour contrler les substitutions [Section 5.10.3].
56
Schmas XML
un contenu de type ExtentedType. Pour que le document reste valide, l'lment elem doit avoir un attribut
xsi:type qui prcise le type de son contenu. Cet attribut est dans l'espace de nom des instances de schmas.
Dans l'exemple suivant, un type Name est d'abord dclar puis un type Fullname tend ce type en ajoutant un
lment title et un attribut id.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema targetNamespace="http://www.liafa.jussieu.fr/~carton/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.liafa.jussieu.fr/~carton/">
<xsd:element name="name" type="Name"/>
...
<xsd:complexType name="Name">
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Fullname">
<xsd:complexContent>
<xsd:extension base="Name">
<xsd:sequence>
<xsd:element name="title" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:ID"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
Le document suivant est valide pour ce schma.
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<tns:names xmlns:tns="http://www.liafa.jussieu.fr/~carton/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- lment name avec le type tns:Name -->
<tns:name>
<firstname>Bessiewallis</firstname>
<lastname>Warfield</lastname>
</tns:name>
<!-- lment name avec le type tns:Fullname -->
<tns:name id="id52" xsi:type="tns:Fullname">
<firstname>Elizabeth II Alexandra Mary</firstname>
<lastname>Windsor</lastname>
<title>Queen of England</title>
</tns:name>
</tns:names>
L'attribut xsi:type peut aussi changer le type d'un lment en un autre type obtenu par restriction
du type original. Dans l'exemple suivant, un type Byte est dclar par restriction du type prdfini
xsd:nonNegativeInteger.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema targetNamespace="http://www.liafa.jussieu.fr/~carton/"
xmlns="http://www.liafa.jussieu.fr/~carton/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="value" type="xsd:integer"/>
...
<xsd:simpleType name="Byte">
<xsd:restriction base="xsd:nonNegativeInteger">
57
Schmas XML
<xsd:maxInclusive value="255"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
Le document suivant est valide pour ce schma. Il est possible de changer le type de l'lment value en
xsd:nonNegativeInteger car ce type prdfini drive du type prdfini xsd:integer. Cet exemple
illustre aussi l'utilisation indispensable des espaces de noms. Il est en effet ncessaire de dclarer trois espaces de
noms : celui des lments du document, celui des schmas pour le type xsd:nonNegativeInteger et celui
des instances de schmas pour l'attribut xsi:type.
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<tns:values xmlns:tns="http://www.liafa.jussieu.fr/~carton/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tns:value>-1</tns:value>
<tns:value xsi:type="xsd:nonNegativeInteger">256</tns:value>
<tns:value xsi:type="tns:Byte">255</tns:value>
</tns:values>
58
Schmas XML
59
Schmas XML
Les trois attributs abstract, block et final s'appliquent aussi bien aux declarations d'lments qu'aux
dfinitions de types. Il faut prendre garde au fait que leurs significations dans ces deux cas sont proches mais
nanmoins diffrentes.
Le tableau suivant rcapitule les utilisations des trois attributs abstract, block et final pour les types et
les lments.
Attribut
Type
lment
abstract
bloque l'utilisation du type dans les bloque la prsence de l'lment dans les
documents
documents
block
bloque la substitution du type dans les bloque la substitution de type pour cet
documents
lment dans les documents
final
bloque la drivation de types dans le schma bloque l'ajout d'lments dans le groupe de
substitution dans le schma
60
Schmas XML
</strings>
61
Schmas XML
<price>78.9</price>
<!-- Substitution de type -->
<price xsi:type="InternPrice" currency="euro">12.34</price>
<!-- Substitution d'lment -->
<internprice currency="dollar">45.56</internprice>
</prices>
Dans l'exemple suivant, on dfinit un type abstrait AbstractType sans contrainte. Ce type est alors quivalent
au type xsd:anyType. On drive ensuite deux types par extension Derived1 et Derived2. Le premier type
Derived1 dclare un attribut att de type xsd:string et un lment string comme unique contenu. Le
second type Derived2 ne dclare aucun attribut mais il dclare un contenu gal lment un string suivi
d'un lment integer.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema targetNamespace="http://www.liafa.jussieu.fr/~carton/"
xmlns="http://www.liafa.jussieu.fr/~carton/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="value" type="Abstract"/>
<xsd:element name="values">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="value" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Abstract" abstract="true"/>
<xsd:complexType name="Derived1">
<xsd:complexContent>
<xsd:extension base="Abstract">
<xsd:sequence>
<xsd:element name="string" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="att" type="xsd:string"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="Derived2">
<xsd:complexContent>
<xsd:extension base="Abstract">
<xsd:sequence>
<xsd:element name="string" type="xsd:string"/>
<xsd:element name="integer" type="xsd:integer"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
Le document suivant est valide pour ce schma. L'lment value apparat deux fois dans le document mais avec
respectivement les types Derived1 et Derived2. Ces types sont dclars l'aide de l'attribut xsi:type.
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<tns:values xmlns:tns="http://www.liafa.jussieu.fr/~carton/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- lment value de type Abstract impossible -->
<tns:value xsi:type="tns:Derived1" att="avec un attribut">
<string>Une chane</string>
</tns:value>
<tns:value xsi:type="tns:Derived2">
62
Schmas XML
<string>Un entier</string>
<integer>-1</integer>
</tns:value>
</tns:values>
63
Schmas XML
l'attribut xsi:type. Il n'est pas possible non plus de substituer l'lment par un autre lment dont le type est
obtenu par restriction.
Dans le schma suivant, les types Extension et Restriction sont respectivement obtenus par extension et
restriction du type Base. La dfinition de ce type Base contient block="all". Ceci impose que l'lment
value ne peut pas changer son type en le type Restriction ou Restriction avec l'attribut xsi:type.
L'lment subs ne peut pas se substituer l'lment value car son type est Extension. En revanche, l'lment
sametype peut se substituer l'lment value car son type est Base.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="value" type="Base"/>
<!-- lment du mme type dans le groupe de substitution -->
<xsd:element name="sametype" type="Base"
substitutionGroup="value"/>
<!-- lment d'un type driv dans le groupe de substitution -->
<xsd:element name="subst" type="Extension" substitutionGroup="value"/>
...
<!-- Type de base ne pouvant pas tre substitu dans les documents -->
<xsd:complexType name="Base" block="#all">
<xsd:sequence>
<xsd:element name="integer" type="xsd:integer"/>
</xsd:sequence>
</xsd:complexType>
<!-- Type obtenu par extension du type de base -->
<xsd:complexType name="Extension">
<xsd:complexContent>
<xsd:extension base="Base">
<xsd:attribute name="att" type="xsd:string"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<!-- Type obtenu par restriction du type de base -->
<xsd:complexType name="Restriction">
<xsd:complexContent>
<xsd:restriction base="Base">
<xsd:sequence>
<xsd:element name="integer" type="xsd:nonNegativeInteger"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
Le document suivant est valide pour le schma prcdent.
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<values xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<value>
<integer>-1</integer>
</value>
<!-- Substitution autorise avec le mme type -->
<sametype>
<integer>-1</integer>
</sametype>
<!-- lment substitu d'un type driv impossible -->
<subst att="Un attribut">
<integer>-1</integer>
</subst>
<!-- lment value de type Extension impossible -->
64
Schmas XML
65
Schmas XML
<item>Troisime item</item>
</list>
66
Schmas XML
67
Schmas XML
68
Schmas XML
69
Schmas XML
70
Schmas XML
<xsd:attributeGroup ref="LangType"/>
<xsd:attribute name="class" type="xsd:string"/>
</xsd:attributeGroup>
Le schma xml.xsd de l'espace de noms xml dfinit les quatre attributs xml:lang, xml:space,
xml:base et xml:id. Il dfinit galement un groupe d'attributs xml:specialAttrs permettant de dclarer
simultanment ces quatre attributs. Cet exemple montre que les noms des groupes d'lments et des groupes
d'attributs sont des noms qualifis dans l'espace de noms cible du schma.
5.12.1. Unicit
L'unicit signifie que le contenu ou des valeurs des attributs de certains lments doivent tre unique dans une
partie dtermine du document. Cette notion gnralise les attributs de typeg ID des DTD [Section 3.3.3.2]. Ces
contraintes sont introduites par les lments xsd:key et xsd:unique.
Dans l'exemple, la contrainte est dcrite au niveau de l'lment bibliography pour exprimer que l'attribut key
de book doit tre unique dans le contenu de l'lment bibliography.
<xsd:element name="bibliography" type="Bibliography">
<xsd:key name="dummy">
<xsd:selector xpath="book"/>
<xsd:field xpath="@key"/>
</xsd:key>
</xsd:element>
Une contrainte dcrite avec xsd:key implique que les champs impliqus soient ncessairement prsents et non
annulables. Une contrainte dcrite avec xsd:unique est au contraire seulement vrifie pour les lments dont
les champs impliqus sont prsents.
5.12.2. Rfrence
L'existence signifie qu'il doit exister dans une partie dtermine du document un lment ayant une certaine valeur
pour son contenu ou des attributs. Cette notion gnralise les attributs de type IDREF des DTDs. Ces contraintes
sont introduites par l'lment xsd:keyref.
71
Schmas XML
72
Schmas XML
73
Schmas XML
<xsd:element name="lastname"
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
type="xsd:string"/>
74
Schmas XML
<xsd:schema targetNamespace="http://www.liafa.jussieu.fr/~carton/"
elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.liafa.jussieu.fr/~carton/">
<!-- Rfrence au type Name par son nom qualifi -->
<!-- Le nom name de l'lment dclar n'est pas qualifi -->
<xsd:element name="name" type="tns:Name" />
<!-- Le nom Name du type dfini n'est pas qualifi -->
<xsd:complexType name="Name">
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Dans l'exemple prcdent, le type Name est rfrenc par son nom qualifi dans la dclaration de l'lment name.
De la mme faon, toute rfrence un lment dclar globalement ou un groupe d'lments ou d'attributs
utilise un nom qualifi. Dans l'exemple suivant, l'lment name apparat dans la dfinition d'un autre type Tree
qui pourrait tre ajoute au schma prcdent. La dfinition de ce type est rcursive et la rfrence lui-mme
utilise bien sr le nom qualifi.
<xsd:complexType name="Tree">
<xsd:sequence maxOccurs="unbounded">
<!-- Rfrence l'lment name par son nom qualifi -->
<xsd:element ref="tns:name" minOccurs="0"/>
<!-- Rfrence rcursive au type Tree par son nom qualifi -->
<!-- Le nom tree de l'lment dclar n'est pas qualifi -->
<xsd:element name="tree" type="tns:Tree"/>
</xsd:sequence>
</xsd:complexType>
L'utilisation de minOccurs avec la valeur 0 est indispensable pour terminer la rcursivit. Sinon, aucun
document valide ne peut avoir d'lment de type Tree.
Il est souvent assez lourd de qualifier chacun des noms des objets dfinis dans le schma. Une alternative assez
commode consiste rendre l'espace de noms par dfaut gal l'espace de noms cible comme dans l'exemple
suivant. Ceci impose bien sr de ne pas utiliser l'espace de noms par dfaut pour les lments des schmas comme
il pourrait tre tentant de le faire. Dans la pratique, on associe l'espace de noms par dfaut l'espace de noms cible
et on dclare galement un prfixe pour cet espace de noms afin de pouvoir y faire rfrence de faon explicite.
Dans l'exemple suivant, l'espace de noms cible http://www.liafa.jussieu.fr/~carton/ est dclar
comme l'espace de noms par dfaut et il est galement associ au prfixe tns.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema targetNamespace="http://www.liafa.jussieu.fr/~carton/"
elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.liafa.jussieu.fr/~carton/"
xmlns:tns="http://www.liafa.jussieu.fr/~carton/">
<!-- Rfrence au type Name par son nom qualifi -->
<xsd:element name="name" type="Name" />
<!-- Dfinition du type Name -->
<xsd:complexType name="Name">
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:sequence>
75
Schmas XML
</xsd:complexType>
</xsd:schema>
76
Chapitre 6. XPath
XPath est un langage permettant de slectionner des parties d'un document XML. Il est utilis dans de nombreux
dialectes XML. Dans cet ouvrage, il est dj apparu dans les contraintes de cohrence [Section 5.12] des schmas
XML. Les schmatrons [Chapitre 7] du chapitre suivant sont essentiellement bass sur XPath. Le langage XSLT
[Chapitre 8] fait galement un usage intensif de XPath pour dsigner les parties traiter.
Le langage XPath n'est pas un langage autonome. C'est un langage d'expressions utilis au sein d'un autre langage
hte. Il ressemble, dans cet aspect, aux expressions rationnelles, appeles aussi expressions rgulires qui est
abrg en regex telles qu'elles sont utilises dans les langages de script tels que perl ou python.
La syntaxe de XPath n'est pas une syntaxe XML car les expressions XPath apparaissent en gnral comme valeurs
d'attributs de documents XML. C'est en particulier le cas pour les schmas, les schmatrons et XSLT.
XPath tait au dpart un langage permettant essentiellement de dcrire des ensembles de nuds dans un document
XML. La version 1.0 de XPath comprenait quelques fonctions pour la manipulation de nombres et de chanes
de caractres. L'objectif tait alors de pouvoir comparer les contenus de nuds. La version 2.0 de XPath a
considrablement enrichi le langage. Il est devenu un langage beaucoup plus complet capable, par exemple, de
manipuler des listes de nuds et de valeurs atomiques.
XPath est uniquement un langage d'expressions dont l'valuation donne des valeurs sans effet de bord. Il n'est pas
possible dans XPath de mmoriser un rsultat. Il n'existe pas de variables propres XPath mais une expression
XPath peut rfrencer des variables du langage hte. Les valeurs de ces variables sont alors utilises pour valuer
l'expression. L'affectation de valeurs ces variables se fait uniquement au niveau du langage hte. Le langage
XPath utilise aussi des variables propres particulires qui servent parcourir des listes. Ces variables s'apparentent
aux variables du langage hte car elles ne sont jamais affectes explicitement. Leur porte est en outre toujours
limite un oprateur d'itration comme for.
Le cur de XPath est form des expressions de chemins permettant de dcrire des ensembles de nuds d'un
document XML. Ces expressions ressemblent aux chemins Unix pour nommer des fichiers dans une arborescence.
77
XPath
element node
Chaque lment du document est reprsent un nud de cette sorte. Le contenu texte de l'lment n'est pas
contenu dans ce nud mais dans des nuds textuels.
attribute node
Chaque attribut est reprsent par un nud de cette sorte dont le parent est le nud de l'lment ayant cet
attribut. La valeur de l'attribut est contenue dans le nud.
comment node
Chaque commentaire du document est reprsent par un nud de cette sorte qui contient le texte du
commentaire.
processing instruction node
Chaque instruction de traitement est reprsente par un nud de cette sorte qui contient le texte de l'instruction.
text node
Ces nuds dits textuels encapsulent le contenu texte des lments. Chaque fragment de texte non intrrompu
par un lment, une instruction de traitement ou un commentaire est contenu dans un tel nud. Le contenu
textuel d'un lment est rparti dans plusieurs nuds de cette sorte lorsque l'lment contient aussi d'autres
lments, des commentaires ou des instructions de traitement qui scindent le contenu textuel en plusieurs
fragments.
namespace node
Les nuds de cette sorte reprsentaient en XPath 1.0 les espaces de noms dclars dans un lment. Il sont
obsoltes et et ne doivent plus tre utiliss.
Afin d'illustrer ces sortes de nuds, voici ci-dessous un document XML trs simple ainsi que son arbre.
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Time-stamp: "tree.xml 14 Feb 2008 09:29:00" -->
<?xml-stylesheet href="tree.xsl" type="text/xsl"?>
<list type="technical">
<item key="id001" lang="fr">
XML & Co
</item>
<item>
<!-- Un commentaire inutile -->
Du texte
</item>
et encore du texte la fin.
</list>
Dans la figure ci-dessous, chaque nud de l'arbre est reprsent par un rectangle contenant trois informations. La
premire information est la sorte du nud, la deuxime est le nom ventuel du nud et la troisime est la valeur
textuelle du nud.
78
XPath
Do c u me n t
XML . . . f i n .
Co mme n t
PI
x ml - s t y l e
El e me n t
l i st
Ti me . . . 0 0 "
hr e f . . . / xs l
XML . . . f i n .
At t r i b u t e
t y pe
El e me n t
i t em
El e me n t
i t em
Te x t
t e c hni c a l
XML & Co
Du t e x t e
e t . . . f i n.
At t r i b u t e
key
At t r i b u t e
l ang
Te x t
Co mme n t
Te x t
i d0001
fr
XML & Co
Un . . . u t i l e
Du t e x t e
79
XPath
type
Cette proprit n'existe que si le document a t un valid par un schma [Chapitre 5]. Il s'agit du type attribu
l'lment ou l'attribut lors de la validation par le schma. Ce type peut tre un type prdfini ou un type
dfini dans le schma.
valeur type
Cette valeur n'existe que si le document a t un valid par un schma [Chapitre 5]. Il s'agit de la valeur
obtenue en convertissant la valeur textuelle dans le type du nud. Si le type d'un attribut est, par exemple,
xsd:double et sa valeur textuelle est la chane 1.0e-3, sa valeur est le nombre flottant 0.001. Cette
conversion n'est possible que si le type du nud est un type simple.
Chaque nud a une valeur qui est utilise chaque fois qu'un nud apparat l o une valeur atomique est
requise. Beaucoup de fonctions et d'oprateurs XPath prennent en paramtre des valeurs atomiques. Lorsqu'un
nud est pass en paramtre de tels fonctions ou oprateurs, celui-ci est converti automatiquement en sa valeur.
Ce processus se droule de la faon suivante. Si le nud a une valeur type (c'est--dire lorsque le document est
trait avec un schma), la valeur est la valeur type et son type est celui de la valeur type. Sinon, la valeur est
la valeur textuelle du nud et son type est untypedAtomic. Cette conversion d'un nud en valeur est appele
atomisation.
L'atomisation d'un nud peut donner une liste de valeurs atomiques ventuellement vide. C'est le cas lorsque le
type du nud est un type de listes comme le type prdfini xsd:IDREFS ou les types construits avec l'oprateur
xsd:list [Section 5.6.6].
Lorsqu'une liste contenant des nuds doit tre convertie en une liste de valeurs, chacun des nuds est atomis
et sa valeur le remplace dans la liste. lorsque la valeur du nud comporte plusieurs valeurs atomiques, celles-ci
s'insrent dans la liste la place du nud.
6.1.1.2. Fonctions
Il existe des fonctions XPath permettant de rcuprer les proprits d'un nud. Les fonctions sont dcrites avec
leur type de retour et le type de leurs paramtres. Les types utiliss sont ceux du systme de typage [Section 6.1.4]
de XPath.
80
XPath
traitements diffrents peuvent conduire des rsultats diffrents. Cette fonction est souvent utilise pour
produire une valeur destine un attribut de type ID ou xsd:ID comme xml:id [Section 2.5.5.4].
Les espaces de noms [Chapitre 4] sont manipuls en XPath 1.0 travers l'axe namespace. Cet axe est obsolte
en XPath 2.0. Il est remplac par des fonctions permettant d'accder aux espaces de noms.
xsd:string* namespace-uri(node()? node)
retourne l'URi qui dfinit l'espace de noms dans lequel se trouve le nud node ou le nud courant si node
est absent.
xsd:string* in-scope-prefixes(node() node)
retourne la liste des prfixes associs un espace de noms dans le nud node. Si l'espace de noms par dfaut
est dfini, la liste contient la chane vide. La liste contient toujours le prfixe xml associ l'espace de noms
XML.
xsd:string namespace-uri-for-prefix(xsd:string prefix, node() n)
retourne l'URI qui dfinit l'espace de noms auquel est associ le prfixe prefix dans le nud node.
for $i in in-scope-prefixes(.) return concat($i, '=', namespace-uri-forprefix($i, .))
donne une chane forme d'un bloc de la forme prefixe=uri pour chaque espace de noms dclar dans
le nud courant.
81
XPath
xsd:boolean
Boolen : true() et false()
xsd:decimal
Nombre dcimal : 3.14
xsd:float et xsd:double
Nombre flottant en simple ou double prcision
xsd:integer
Entier : 42
xsd:duration, xsd:yearMonthDuration et xsd:dayTimeDuration
Dure : P6Y4M2DT11H22M44S de 6 ans, 4 mois, 2 jours, 11 heures 22 minutes et 44 secondes.
xsd:dateTime, xsd:date et xsd:date
Date et heure : 2009-03-02T11:44:22
xsd:anyURI
URL : http://www.liafa.jussieu.fr/~carton/
xsd:anyType, xsd:anySimpleType et xsd:anyAtomicType
Types racine de la hirarchie
xsd:untyped et xsd:untypedAtomic
Nud et valeur atomique non type
6.1.4. Typage
XPath possde un systme de typage assez rudimentaire qui permet de dcrire les types des paramtres et le
type de retour des fonctions. Ce systme de typage est galement utilis par XSLT pour donner le type d'une
variable [Section 8.10] lors de sa dclaration et pour les types de retour et des paramtres des fonctions d'extension
[Section 8.11].
Ce systme est organis en une hirarchie dont la racine est le type item() (avec les parenthses). Tous les autres
types drivent de ce type qui est le plus gnral. Toute valeur manipule par XPath est donc de ce type.
Il y a ensuite des types pour les nuds et des types pour les valeurs atomiques. Pour les nuds, il y a
d'abord un type gnrique node() ainsi que des types pour chacune des sortes de nuds [Section 6.1.1].
Ces types sont document-node(), element(), attribute(), text(), comment(), processinginstruction() et comment() (avec les parenthses). Les types pour les valeurs atomiques sont les types
prdfinis [Section 5.5.1] des schmas comme xsd:integer.
Il y a finalement un type untypedAtomic qui est le type de la valeur de tout nud aprs atomisation.
Le systme de type possde trois oprateurs '?', '*' et +, en notation postfixe, pour construire de nouveaux
types. Ils s'appliquent aux types pour les nuds et les valeurs atomiques dcrits prcdemment. L'oprateur
'?' dsigne un nouveau type autorisant l'absence de valeur. Ces types sont surtout utiliss pour dcrire les
paramtres optionnels des fonctions. La fonction XPath name [Section 6.1.1.1] a, par exemple, un paramtre de
type node()?. Ceci signifie que son paramtre est soit un nud soit rien. L'oprateur '*' construit un nouveau
type pour les listes. Le type xsd:integer* est, par exemple, le type des listes d'entiers ventuellement vides.
L'oprateur '+' construit un nouveau type pour les listes non vides. Le type xsd:integer+ est, par exemple,
le type des listes non vides d'entiers.
6.1.5. Contexte
L'valuation d'une expression XPath se fait dans un contexte qui est fourni par le langage hte. Le contexte
se dcompose en le contexte statique et le contexte dynamique. Cette distinction prend du sens lorsque les
programmes du langage hte sont susceptibles d'tre compil. Le contexte statique comprend tout ce qui peut tre
dtermin par une analyse statique du programme hte. Tout ce qui dpend du document fait, au contraire, partie
du contexte dynamique.
82
XPath
Les expressions XPath sont beaucoup utilises dans les feuilles de style XSLT. Comme le langage XSLT est
sans effet de bord, l'analyse statique des feuilles de styles XSLT est relativement facile et permet de dterminer
beaucoup d'information.
83
XPath
6.2.1.1. Axes
Chacun des axes donne une relation qui relie les nuds slectionns par rapport au nud courant. Les axes qu'il
est possible d'utiliser dans les expressions XPath sont les suivants.
self
Le nud lui-mme (galit)
child
Fils direct
84
XPath
parent
Parent
attribute
Attribut du nud
descendant
Descendant strict
descendant-or-self
Descendant ou le nud lui-mme
ancestor
Anctre strict
ancestor-or-self
Anctre ou le nud lui-mme
preceding-sibling
Frre gauche (fils du mme parent)
85
XPath
following-sibling
Frre droit (fils du mme parent)
preceding
gauche
following
droite
namespace
Espace de noms du nud
L'axe namespace est un hritage de XPath 1.0 qui doit tre considr comme obsolte. Il est conseill d'utiliser
les fonctions XPath pour accder aux espaces de noms d'un nud.
Les axes self, parent, child, preceding-sibling et following-sibling permettent de
slectionner le nud lui-mme et les nuds proches comme le montre la figure ci-dessous.
86
XPath
pa r e nt
s el f
pr e c e di ng- s i bl i ng
f o l l o wi n g - s i b l i n g
c hi l d
An c e s t o r
Se l f
Pr e c e d i n g
Fo l l o wi n g
De s c e n d a n t
6.2.1.2. Types
Une fois donn un axe, le type permet de restreindre l'ensemble des nuds slectionns un des nuds d'une
certaine forme. Les types possibles sont les suivants.
*
tous les lments ou tous les attributs suivant l'axe utilis
ns:*
tous les lments ou tous les attributs (suivant l'axe) dans l'espace de noms associ au prfixe ns
*:local
tous les lments ou tous les attributs (suivant l'axe) de nom local local
name
les nuds de nom name (lments ou attributs suivant l'axe utilis)
node()
tous les nuds
text()
tous les nuds textuels
87
XPath
comment()
tous les commentaires
processing-instruction()
toutes les instructions de traitement
Les types node(), text(), comment() et processing-instruction() se prsentent comme des
pseudo fonctions sans paramtre. Les parenthses sont indispensables car les expressions text et text()
s'valuent diffremment. L'expression text retourne les lments text enfants du nud courant alors que
l'expression text() retourne les nuds textuels enfants du nud courant. Il faut galement distinguer
l'expression string qui s'value en une liste de nuds des expressions 'string' et "string" qui s'valuent
en une chane de caractres constante.
child::* ou *
tous les lments qui sont enfants du nud courant
attribute::* ou @*
tous les attributs du nud courant
attribute::id ou @id
attribut id du nud courant
child::node() ou node()
tous les enfants du nud courant
child::text ou text
tous les lments text qui sont enfants du nud courant
child::text() ou text()
tous les nuds textuels qui sont enfants du nud courant
descendant::comment()
tous les commentaires qui sont descendants du nud courant, c'est--dire contenus dans le nud courant
following::processing-instruction()
tous les instructions de traitement qui suivent le nud courant.
88
XPath
chapter[count(child::section) > 1]
lment chapter ayant au moins deux lments section comme enfants.
89
XPath
descendant::p/following-sibling::em[position()=1]
sibling::em[1]
premier frre em d'un lment p descendant du nud courant.
ou
.//p/following-
L'oprateur '/' peut tre cascad et il est associatif gauche. Une expression de la forme expr1/expr2/
expr3 est implicitement parenthse (expr1/expr2)/expr3. Ce parenthsage est trs souvent inutile car
l'oprateur '/' est associatif l'exception de quelques cas pathologiques.
child::*/child::*/attribute::* ou */*/@*
tous les attributs des lments qui sont des enfants des enfants du nud courant
parent::*/child::*/descendant::text()
tous les nuds textuels descendants d'un frre du nud courant
L'oprateur '/' peut aussi tre employ dans des expressions de la forme /expr2 qui sont l'analogue des chemins
absolus dans les systmes de fichiers.
Une expression de la forme /expr2 est value de la faon suivante. L'expression expr2 est value en ayant,
au pralable, fix le nud courant la racine de l'arbre contenant le nud courant, la position dans le contexte
1 et la taille du contexte 1. Une telle expression est donc quivalente une expression root(.)/expr2. La
fonction root() retourne la racine de l'arbre contenant son paramtre.
Le nud courant appartient trs souvent l'arbre d'un document XML. Dans ce cas, la racine de cet arbre est un
nud de la sorte document node. Il est galement possible que le nud courant appartienne un fragment de
document et que la racine de cet arbre soit un nud quelconque.
Les expressions de la forme /expr2 se comportent comme des chemins absolus puiqu'elles s'valuent en partant
d'une racine. Elles ne sont toutefois pas compltement absolues car la racine choisie dpend du nud courant. La
racine choisie est celle de l'arbre contenant le nud courant.
/
le nud document node racine de l'arbre
/child::* ou /*
l'lment racine du document
/child::book ou /book
l'lment racine du document si son nom est book et aucun nud sinon
/child::book/child:chapter ou /book/chapter
les lments chapter enfant de l'lment racine du document si son nom est book et aucun nud sinon
/descendant::section ou //section
tous les lments section du document
90
XPath
Bien que les listes manipules par XPath peuvent contenir des nuds et des valeurs atomiques, ces oprateurs
fonctionnent uniquement avec des listes reprsentant des ensembles de nuds. Ils ne fonctionnent pas avec des
listes contenant des valeurs atomiques. Les listes de nuds retournes par ces oprateurs sont tries dans l'ordre
du document et ne comportent pas de doublon.
91
XPath
6.3.2. Nombres
Les seuls nombres existant en XPath 1.0 taient les nombres flottants. XPath 2.0 manipule les nombres des trois
types xsd:integer, xsd:decimal et xsd:double des schmas XML.
92
XPath
round-half-to-even(2.5), round-half-to-even(3.5)
2, 4
xsd:anyAtomicType min(xsd:anyAtomicType* list, xsd:string? col)
retourne le minimum d'une liste de valeurs qui sont comparables pour l'ordre <. Le paramtre optionnel col
spcifie la collation utiliser pour comparer des chane de caractres.
min(1 to 6), min(('Hello', 'new', 'world'))
1, 'Hello'
xsd:anyAtomicType max(xsd:anyAtomicType* list, xsd:string? col)
retourne le maximum d'une liste de valeurs qui sont comparables pour l'ordre lt. Le paramtre optionnel
col spcifie la collation utiliser pour comparer des chane de caractres.
number sum(xsd:anyAtomicType* list)
retourne la somme d'une liste de nombres. Les valeurs qui ne sont pas des nombres sont converties au pralable
en flottants avec xsd:double.
sum(1 to 6)
21
number avg(xsd:anyAtomicType* list)
retourne la moyenne d'une liste de nombres. Les valeurs qui ne sont pas des nombres sont converties au
pralable en flottants avec xsd:double.
avg(1 to 6)
3.5
93
XPath
string-length('Hello world')
11
xsd:string concat(xsd:string s1, xsd:string s2, xsd:string s3, ...)
retourne la concatnation des chanes de caractres s1, s2, s3, . Le nombre de paramtres de cette fonction
est variable.
concat('Hello', 'new', 'world')
'Hellonewworld'
xsd:string string-join(xsd:string* list, xsd:string sep)
retourne la concatnation des chanes de caractres de la liste en insrant la chane sep entre elles.
Contrairement la fonction concat, le nombre de paramtres de cette fonction est fix 2 mais le premier
paramtre est une liste.
string-join(('Hello', 'new', 'world'), ' ')
'Hello new world'
xsd:integer compare(xsd:string s1, xsd:string s2, xsd:anyURI? col)
retourne la comparaison des deux chanes de caractres s1 et s2 en utilisant la collation optionnelle identifie
par l'URI col. La valeur de retour est -1, 0 ou 1 suivant que s1 est avant s2 pour l'ordre lexicographique,
gale s2 ou aprs s2. Si col est absente, la collation par dfaut est utilise. Celle-ci est base sur les codes
Unicode.
compare('Hello', 'world')
-1
compare('hello', 'World')
1
xsd:boolean starts-with(xsd:string s, xsd:string prefix)
retourne true si la chane s commence par la chane prefix et false sinon.
xsd:boolean ends-with(xsd:string s, xsd:string suffix)
retourne true si la chane s se termine par la chane suffix et false sinon.
xsd:boolean contains(xsd:string s, xsd:string factor)
retourne true si la chane factor apparat comme sous-chane dans la chane s et false sinon.
contains('Hello', 'lo')
true
xsd:boolean matches(xsd:string s, xsd:string regexp, xsd:string? flags)
retourne true si une partie de la chane s est compatible avec l'expression rationnelle regexp et false
sinon. La chane optionnelle flags prcise comment doit tre effectue l'opration.
matches('Hello world', '\w*')
true
matches('Hello world', '^\w*$')
false
xsd:string substring(xsd:string s, xsd:double start xsd:double length)
retourne la sous-chane commenant la position start et de longueur length ou moins si la fin de la
chane s est atteinte. Les positions dans la chane sont numrotes partir de 1. Les paramtres start et
length sont des flottants par compatibilit avec XPath 1.0. Ils sont convertis en entiers avec round().
substring('Hello world', 3, 5)
'llo w'
substring('Hello world', 7, 10)
'world'
94
XPath
95
XPath
string-to-codepoints(normalize-unicode(codepoints-to-string((105,
776))))
(239)
6.4. Listes
La liste est la structure de donnes fondamentale de XPath. Il existe plusieurs oprateurs permettant de construire et
de manipuler des listes. La restriction importante des listes XPath est qu'elles ne peuvent pas tre imbriques. Une
liste XPath ne peut pas contenir d'autres listes. Elle peut uniquement contenir des nuds et des valeurs atomiques.
Ainsi, l'expression ((1,2),(3,4,5)) ne donne pas une liste contenant deux listes de deux et trois entiers. Elle
donne la liste de cinq entiers que donne galement l'expression (1,2,3,4,5).
6.4.1. Constructeurs
L'oprateur essentiel de construction de listes est ',' (virgule) qui permet de concatner, c'est--dire mettre
bout bout, des listes. Il est aussi bien utilis pour crire des listes constantes comme (1,2,3,4,5) que pour
concatner les rsultats d'autres expressions. Contrairement aux oprateurs de chemins [Section 6.2], l'oprateur
',' ne rordonne pas les lments des listes et ne supprime pas les doublons. Le rsultat de l'expression
expr1,expr2 est la nouvelle liste forme des valeurs du rsultat de expr1 suivis des valeurs du rsultat
l'expression expr2. Si une valeur apparat dans les deux rsultats, elle a plusieurs occurrences dans le rsultat
final. Par exemple, le rsultat de l'expression (1,2),(1,2) est bien la liste (1,2,1,2) avec deux occurrences
des entiers 1 et 2.
Le fait qu'une valeur soit assimile la liste (de longueur 1) contenant cette valeur simplifie l'criture des
expressions. Ainsi les deux expressions (1),(2) et 1,2 sont quivalentes. Cette identification entre une valeur
et une liste ne cre pas d'ambigut car les listes XPath ne peuvent pas tre imbriques. Il n'y a pas de diffrence
entre les deux expressions ((1),(2)) et (1,2).
title, author
donne la liste des enfants de nom title puis des enfants de nom author du nud courant.
1, 'Two', 3.14, true()
donne la liste (1, 'Two', 3.14, true()) constitue d'un entier, d'une chane de caractres, d'un
nombre flottant et d'une valeur boolenne.
(1, 2), 3, (4, (5))
donne la liste (1, 2, 3, 4, 5) sans imbrication.
(1, 2), 2, 1, 2
donne la liste (1, 2, 2, 1, 2) avec rptitions.
L'oprateur to permet de crer une liste contenant une suite d'entiers conscutifs. L'expression n1 to n2
donne la liste n1,n1+1,n1+2,,n2-1,n2 des entiers de n1 n2 compris. Cet oprateur est surtout utile avec
l'oprateur for [Section 6.6.2] pour itrer sur une liste d'entiers.
96
XPath
1 to 5
donne la liste (1, 2, 3, 4, 5)
1, 2 to 4, 5
donne la liste (1, 2, 3, 4, 5)
6.4.2. Filtres
Un filtre permet de slectionner dans une liste les objets qui satisfont une condition. Un filtre se prsente comme
une expression entre des crochets '[' et ']' place aprs la liste filtrer.
Une expression de la forme expr1[expr2] est value de la faon suivante. L'expression expr1 est d'abord
value pour donner une liste l d'objets. Pour chaque objet o de la liste l, l'expression expr2 est value en
modifiant, au pralable, le focus de la manire suivante. L'objet courant est fix l'objet o, la position du contexte
est fixe la position de l'objet o dans la liste l et la taille du contexte est fixe la taille de l. Le rsultat de cette
valuation est ensuite converti en une valeur boolenne en utilisant les rgles de conversion [Section 6.3.1]. Le
rsultat final de l'valuation de expr1[expr2] est la liste des objets de l pour lesquels expr2 s'est value
en la valeur true. Les objets slectionns restent bien sr dans l'ordre de la liste l. La liste rsultat est en fait
construite en supprimant de la liste l les objets pour lesquels expr2 s'value en false.
Lors de l'valuation de l'expression suivante, l'objet courant qui est retourn par '.' prend les valeurs successives
1, 2, 3, 4 et 5. Seules les valeurs paires satisfont la condition et sont conserves.
(1 to 5)[. mod 2 = 0]
donne la liste (2,4) des entiers pairs de la liste
Les filtres sont beaucoup utiliss dans les expression de chemin [Section 6.2.2] pour slectionner des nuds.
Plusieurs conditions peuvent tre combines l'aide des oprateurs boolens and et or. Les filtres peuvent aussi
tre enchans en les mettant l'un aprs l'autre.
text[position() > 1 and position() < 4]
donne les enfants text du nud courant aux positions 2 et 3
text[position() > 1][position() < 4]
donne les enfants text du nud courant aux positions 2, 3 et 4
Le second exemple montre que les filtres peuvent tre enchans. Il ne donne pas le mme rsultat que le premier
exemple car les positions retournes par la fonction position() du second filtre sont celles dans la liste obtenue
aprs le premier filtre. Comme le premier enfant text a t supprim, il y a un dcalage d'une unit.
Les expressions de chemins retournent des listes de nuds tris dans l'ordre du document et sans doublon. Au
contraire, l'oprateur ',' ne supprime pas les doublons.
p[@align or @type]
donne la liste des enfants p du nud courant ayant un attribut align ou type.
p[@align], p[@type]
donne la liste des enfants p du nud courant ayant un attribut align suivis des enfants p ayant un attribut
type. Si un nud p possde les deux attributs, il apparat deux fois dans la liste.
6.4.3. Fonctions
Il existe des fonctions XPath permettant de manipuler les listes.
xsd:integer count(item()* l)
retourne la longueur de la liste l, c'est--dire le nombre de nuds ou valeurs atomiques qui la composent.
count('Hello world', 1, 2, 3)
4
97
XPath
xsd:boolean empty(item()* l)
retourne true si la liste l est vide et false sinon.
empty(1 to 5)
false
xsd:boolean exists(item()* l)
retourne true si la liste l est non vide et false sinon.
exists(1 to 5)
true
item()* distinct-values(item()* l)
retourne une liste des valeurs distinctes de la liste l en supprimant les valeurs gales pour l'oprateur eq.
distinct-values((1, 'Hello', 0, 1, 'World'))
(1, 'Hello', 0, 'World')
xsd:integer* index-of(item()* l, item() value)
retourne la liste des positions de la valeur value dans la liste l.
index-of((1, 'Hello', 0, 1, 'World'), 1)
(1, 4)
item()* subsequence(item()* l, xsd:double start xsd:double length)
retourne la sous-liste commenant la position start et de longueur length ou moins si la fin de la liste
l est atteinte.
subsequence((1, 'Hello', 0, 1, 'World'), 2, 3)
('Hello', 0, 1)
item()* remove(item()* l, xsd:integer pos)
retourne la liste obtenue en supprimant de la liste l la valeur la position pos.
remove(1 to 5, 3)
(1, 2, 4, 5)
item()* insert-before(item()* l1, xsd:integer pos, item()* l2)
retourne la liste obtenue en insrant la liste l2 dans la liste l1 la position pos.
insert-before(1 to 5, 3, 1 to 3)
(1, 2, 1, 2, 3, 3, 4, 5)
6.5. Comparaisons
Les comparaisons sont un aspect important mais dlicat de XPath. Elles jouent un rle important en XPath car
elles permettent d'affiner la slection des nuds en prenant en compte leurs contenus. Il est, par exemple, possible
de slectionner des lments d'un document dont la valeur d'un attribut satisfait une condition comme dans les
expressions item[@type='free'] et list[@length < 5]. Les comparaisons sont aussi dlicates
utiliser car leur smantique est source de piges conduisant aisment des programmes errons.
Il existe deux types d'oprateurs pour effectuer des comparaisons entre valeurs. Les premiers oprateurs dits
gnraux datent de la premire version de XPath. Ils permettent de comparer deux valeurs quelconques, y compris
des listes, avec des rsultats parfois inattendus. Les seconds oprateurs ont t introduits avec la version 2.0
de XPath. Ils autorisent uniquement les comparaisons entres les valeurs atomiques de mme type. Ils sont plus
restrictifs mais leur comportement est beaucoup plus prvisible.
Il existe aussi l'oprateur is et les deux oprateurs << et >> permettant de tester l'galit et l'ordre de nuds
dans le document.
98
XPath
Oprateur atomique
eq
!=
ne
<
lt
<=
le
>
gt
>=
ge
Lorsque les deux valeurs sont de type untypedAtomic, celle-ci sont compares comme des chanes de
caractres. Lorsqu'une seule des deux valeurs est de type untypedAtomic, celle-ci est convertie dans le type
99
XPath
de l'autre valeur avant de les comparer. Quand le type de l'autre valeur est un type numrique, la valeur de type
untypedAtomic est convertie en une valeur de type xsd:double plutt que dans le type de l'autre valeur.
Ceci vite qu'une valeur dcimale comme 1.2 soit convertie en entier avant d'tre compare la valeur 1. Si les
deux valeurs sont de types incompatibles, la comparaison choue et provoque un erreur.
Pour illustrer ces comparaisons, on considre le petit document suivant.
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<list>
<item type="1">1</item>
<item type="01">2</item>
<item type="03">3</item>
<item type="1.2">4</item>
<!-- Erreur car 'str' ne peut tre convertie en nombre flottant -->
<item type="str">5</item>
</list>
Les expressions suivantes sont values sur le document prcdent en supposant, chaque fois, que le nud
courant est l'lment racine list du document. Pour chacune des expressions, le rsultat est une liste d'enfants
item de l'lment list. Il est dcrit en donnant les positions de ces lments item slectionns. Le rsultat
item[1], item[2] de la premire expression signifie, par exemple, qu'elle slectionne le premier et le
deuxime enfants item.
item[@type=1]
donne item[1], item[2] car la valeur de l'attribut type est convertie en nombre flottant avant d'tre
compare 1. La valeur '01' est donc convertie en '1'.
item[@type='1']
donne item[1] car la valeur de l'attribut type est convertie en chane de caractres avant d'tre compare
'1'.
item[@type=.]
donne item[1] car la valeur de l'attribut type et le contenu de l'lment item sont convertis en chanes
de caractres avant d'tre compars.
item[@type=1.2]
donne item[4] car la valeur de l'attribut type est convertie en nombre flottant avant d'tre compare 1.2.
item[xsd:double(.)=xsd:double(@type)]
donne item[1], item[3] car la valeur de l'attribut type et le contenu de l'lment item sont convertis
en nombres flottants avant d'tre compars.
Il faut faire attention au fait que les comparaisons peuvent chouer et provoquer des erreurs lorsque les types ne
sont pas compatibles. Ce problme renforce l'intrt de la validation des documents avant de les traiter.
100
XPath
L'exemple prcdent montre que l'oprateur != n'est pas la ngation de l'oprateur =, ce qui n'est pas trs intuitif.
() != (1)
donne false car un moins une des listes est vide.
(1) = (1)
donne true car la valeur 1 de la liste l1 est gale la valeur 1 de la liste l2.
(1) != (1)
donne false car l'unique valeur 1 de la liste l1 n'est pas gale l'unique valeur 1 de la liste l2.
(1) = (1, 2)
donne true car la valeur 1 de la liste l1 est gale la valeur 1 de la liste l2.
(1) != (1, 2)
donne true car la valeur 1 de la liste l1 est n'est pas gale la valeur 2 de la liste l2.
Ds que la comparaison de deux valeurs des listes l1 et l2 choue, la comparaison globale entre les listes l1
et l2 choue galement. L'ordre des comparaisons entre les valeurs des deux listes est laiss libre par XPath et
chaque logiciel peut les effectuer dans l'ordre qui lui convient. Lorsqu'une de ces comparaisons donne la valeur
true et qu'une autre de ces comparaisons choue, la rsultat de la comparaison des deux listes est imprvisible.
Il est gal true si une comparaison donnant true est effectue avant toute comparaison qui choue mais la
comparaison globale choue dans le cas contraire.
La smantique des comparaisons de listes permet d'crire simplement certains tests. Pour savoir si une valeur
contenue, par exemple, dans une variable $n est gale une des valeurs de la liste (2, 3, 5, 7), il suffit
d'crire $n = (2, 3, 5, 7).
101
XPath
6.6.1. Test
L'oprateur if permet d'effectuer un test. Sa syntaxe est la suivante.
if (test) then expr1 else expr2
La smantique est celle de if dans tous les langages de programmation. L'expression test est value et le
rsultat est converti en une valeur boolenne. Si cette valeur boolenne est true, l'expression expr1 est value
et le rsultat est celui de l'expression globale. Sinon, l'expression expr2 est value et le rsultat est celui de
l'expression globale.
La partie else expr2 est obligatoire et ne peut pas tre omise. Lorsque cette seconde partie est inutile, on met
simplement else ().
if (contains($url, ':')) then substring-before($url, ':') else ''
l'valuation de cette expression retourne le protocole d'une URL plac avant le caractre ':' si celle-ci en
contient un.
L'oprateur if est parfois remplac par un filtre. L'expression if (@xml:id) then @xml:id else
generate-id() est en effet quivalente l'expression plus concise (@xml:id, generate-id())[1].
6.6.2. Itration
L'oprateur for permet de parcourir des listes pour construire une nouvelle liste. Il ne s'agit pas d'une structure
de contrle pour des itrations quelconques comme le for ou le while des langages C ou Java. Il s'apparente
plus l'oprateur map des langages fonctionnels comme ML qui permet d'appliquer une fonction chacun des
objets d'une liste.
La syntaxe de l'oprateur for est la suivante o var est une variable et expr1 et expr2 sont deux expressions.
La variable var peut uniquement apparatre dans l'expression expr2.
for var in expr1 return expr2
102
XPath
L'valuation d'une telle expression est ralise de la faon suivante. L'expression expr1 est d'abord value pour
donner une liste de valeurs. Pour chacune de ces valeurs, celle-ci est affecte la variable var et l'expression
expr2 est value. Le rsultat global est la liste obtenue en concatnant les listes obtenues pour chacune des
valuations de l'expression expr2.
Le rsultat de l'expression expr2 est une liste qui peut donc contribuer plusieurs valeurs de la liste finale. Si,
au contraire, ce rsultat est la liste vide, il n'y a aucune contribution la liste finale.
La variable var introduite par l'oprateur for est une variable muette. Sa porte est rduite l'expression expr2
aprs le mot cl return. Aucune valeur ne peut lui tre affecte directement.
for $i in 1 to 5 return $i * $i
l'valuation de cette expression donne la liste (1,4,9,16,25) des cinq premiers carrs
for $i in 1 to 3 return (2 * $i, 2 * $i + 1)
l'valuation de cette expression donne la liste (2,3,4,5,6,7) qui est la concatnation des trois listes
(2,3), (4,5) et (6,7)
for $i in 1 to 5 return if ($i mod 2) then () else $i * $i
l'valuation de cette expression donne la liste (4,16) des carrs des deux nombres pairs 2 et 4 pour lesquels
$i mod 2 donne 0
Il est possible d'imbriquer plusieurs oprateurs for. Il y a d'ailleurs une syntaxe tendue qui permet une criture
concise de ces itrations imbriques. Cette syntaxe prend la forme suivante.
for var1 in expr1, , varN in exprN return expr0
Cette expression est en faite quivalente l'expression suivante crite avec la premire syntaxe.
for var1 in expr1 return for
for $i in 0 to 2, $j in 0 to 2 return $i * 3 + $j
l'valuation de cette expression donne la liste (0,1,2,3,4,5,6,7,8) qui est la concatnation des trois
listes (0,1,2), (3,4,5) et (6,7,8)
103
XPath
104
XPath
grep string
affiche les occurrences de la chane string dans le contenu du nud courant.
Une session d'exprimentation du mode interactif de xmllint avec le fichier de bibliographie
bibliography.xml est prsente ci-dessous.
bash $ xmllint --shell bibliography.xml
/ > grep XML
/bibliography/book[1]/title : t-27 XML langage et applications
/bibliography/book[2]/title : t-14 XML by Example
/bibliography/book[5]/title : t-46 Modlisation et manipulation ...
/bibliography/book[6]/title : t-25 XML Schema et XML Infoset
/bibliography/book[7]/title : ta3 XML
/ > xpath bibliography/book[@lang='en']
Object is a Node Set :
Set contains 2 nodes:
1 ELEMENT book
ATTRIBUTE key
TEXT
content=Marchal00
ATTRIBUTE lang
TEXT
content=en
2 ELEMENT book
ATTRIBUTE key
TEXT
content=Zeldman03
ATTRIBUTE lang
TEXT
content=en
/ > cd bibliography/book[3]
book > xpath @lang
Object is a Node Set :
Set contains 1 nodes:
1 ATTRIBUTE lang
TEXT
content=fr
book > cd ..
bibliography >
Action
Syntaxe
Exemples
Concatnation de listes
E1,E2
1,'Two',3.14,true()
for
Itration
some
E1
every
E1
if
Test
if (E1)
else E3
Enchanement
E1/E2
[ ]
Prdicat
E1[E2]
105
then
chapter[count(section)
> 1]
XPath
Oprateur
Action
Syntaxe
and or not
Oprations logiques
E1 or E2
to
Intervalle
E1 to E2
eq ne lt le gt ge
Comparaisons de valeurs E1 eq E2
atomiques
$x lt $y
Comparaisons gnrales
E1 = E2
$x < $y
<< is >>
Comparaisons de nuds
E1 is E2
+ * - div idiv
Oprations arithmtiques
E1 + E2
|
union Oprations sur les listes de E1 | E2
intersection
nuds
except
instance of cast as Changements de type
castable as treat
as
Exemples
1 to 5
$price * $qty
/|*
E1 instance of type $x
instance
xsd:string
106
of
Chapitre 7. Schematron
7.1. Introduction
Schematron est un autre formalisme permettant de spcifier la structure d'un document XML. C'est donc au dpart
une alternative aux schmas [Chapitre 5] mais il est plutt complmentaire des schmas. Ce formalisme n'est pas
trs adapt pour dfinir l'imbrication des lments comme le font les schmas en donnant une grammaire. En
revanche, il permet d'imposer des contraintes sur le document qu'il est difficile voire impossible d'exprimer avec
les schmas. Il est frquent d'utiliser les deux formalismes conjointement. Un schma dfinit la structure globale du
document et un schematron la complte en ajoutant des contraintes supplmentaires que doit satisfaire le document
pour tre valide. Il existe d'ailleurs des mcanismes permettant d'inclure un schematron au sein d'un schma.
Schematron est bas sur XPath [Chapitre 6]. Un schematron est constitu de rgles crites avec des expressions
XPath qui expriment la prsence ou l'absence de motifs dans le document. Ce mcanisme rend schematron trs
puissant puisque il est possible de mettre en relation des lments et des attributs qui sont loigns dans le
document. Schematron reste cependant simple et le le vocabulaire trs restreint. L'criture d'un schematron requiert
l'utilisation de seulement quelques lments.
107
Schematron
Le rsultat de la vrification du document ci-dessus avec le schematron donn prcdemment est donn la section
suivante.
Le cours est essentiellement bas sur des exemples.
7.3. Fonctionnement
Le principe de fonctionnement de schematron est le suivant. Un document cible est valid avec un schematron
en utilisant une application approprie. Cette validation produit un rapport qui retrace les diffrentes tapes de la
validation. Ce rapport contient des messages destins l'utilisateur. Ces messages peuvent provenir d'ventuelles
erreurs mais ils peuvent aussi tre positifs et confirmer que le document satisfait bien certaines contraintes. Ces
diffrents messages sont produits par l'application de validation ou issus du schematron. Le schematron associe en
effet des messages aux diffrentes contraintes qu'il contient. Ce rapport est souvent lui mme un document XML.
La validation d'un document avec un schematron est souvent ralise en deux phases. Dans une premire phase, le
schematron est transform en une version compile qui est indpendante du document. Dans une seconde phase,
la version compile est utilise pour produire le rapport. La premire phase est parfois scinde en plusieurs tapes
afin de prendre en compte les inclusions et les blocs abstraits.
Co m p ila t e u r
c o mp i l e r . x s l
Sc h e m a t ro n
Sc h e m a t ro n c o m p il
s c h e ma . s c h
s c h e ma . x s l
XSLT
Pro c e s s o r
Do c u m e n t
Ra p p o rt
d o c u me n t . x ml
r e p o r t . x ml
XSLT
Pro c e s s o r
108
Schematron
rapport peut tre un simple fichier texte mais il est souvent un document XML, en particulier lorsque la validation
est ralise via XSLT. Le format SVRL est un dialecte XML conu spcialement pour les rapports de validation
avec des schematrons. Il est en particulier utilis par l'implmentation standard de schematron disponible l'adresse
http://www.schematron.com/.
Le rapport SVRL obtenu par la validation du document XML avec le schematron donns ci-dessus est le suivant.
<?xml version="1.0" standalone="yes"?>
<svrl:schematron-output xmlns:svrl="http://purl.oclc.org/dsdl/svrl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sch="http://purl.oclc.org/dsdl/schematron"
title="Comparaison attribut/nombre d'enfants"
schemaVersion="ISO19757-3">
<svrl:active-pattern/>
<svrl:fired-rule context="list"/>
<svrl:fired-rule context="list"/>
<svrl:failed-assert test="@length = count(item)"
location="/lists/list[2]">
<svrl:text>L'attribut length doit tre
gal au nombre d'lments.</svrl:text>
</svrl:failed-assert>
</svrl:schematron-output>
109
Schematron
</pattern>
</schema>
7.5. Rgles
Chaque rgle est matrialise par un lment sch:rule qui contient un ou plusieurs tests. L'lment sch:rule
possde un attribut context dont la valeur doit tre un motif XPath. Ce motif dtermine sur quels nuds
s'applique la rgle.
Les tests d'une rgle sont introduits par les lments sch:assert et sch:report. Ces deux lments prennent
la mme forme. Ils possdent un attribut test dont la valeur est une expression XPath et ils contiennent du texte
qui est ventuellement utilis pour construire le rapport. Ces deux lments se distinguent par leurs smantiques
qui sont l'oppos l'une de l'autre.
<rule context="...">
110
Schematron
<assert test="...">
...
</assert>
<report test="...">
...
</report>
...
</rule>
Un test introduit par sch:assert est ralis de la faon suivante. L'expression XPath contenue dans l'attribut
test est value en prenant le nud slectionn comme contexte et le rsultat de l'valuation est converti en une
valeur boolenne. Si le rsultat est false, le texte contenu dans l'lment sch:assert est ajout au rapport.
Sinon rien n'est ajout au rapport.
Dans l'exemple ci-dessous, le message d'erreur est ajout au rapport si la condition n'est pas vrifie, c'est--dire
si l'lment book n'a aucun des attributs id ou key.
<rule context="book">
<assert test="@id|@key">
L'lment book doit avoir un attribut id ou key
</assert>
</rule>
Un test introduit par sch:report est, au contraire, ralis de la faon suivante. L'expression XPath contenue
dans l'attribut test est value en prenant le nud slectionn comme contexte et le rsultat de l'valuation est
converti en une valeur boolenne. Si le rsultat est true, le texte contenu dans l'lment sch:report est ajout
au rapport. Sinon rien n'est ajout au rapport.
Dans l'exemple ci-dessous, le message d'erreur est ajout au rapport si la condition est vrifie, c'est--dire si
l'lment book a simultanment les deux attributs id et key.
<rule context="book">
<report test="count(@id|@key) > 1">
L'lment book doit avoir un seul des attributs id ou key
</report>
</rule>
Chaque rgle peut bien sr contenir plusieurs lments sch:assert et sch:report comme dans l'exemple
ci-dessous. L'ordre de ces diffrents lments est sans importance.
<rule context="tns:pattern[@is-a]">
<assert test="key('patid', @is-a)">
L'attribut is-a doit rfrencer un bloc abstrait.
</assert>
<report test="@abstract = 'true'">
Un bloc avec un attribut is-a ne peut pas tre abstrait.
</report>
<report test="rule">
Un bloc avec un attribut is-a ne peut pas contenir de rgle.
</report>
</rule>
111
Schematron
Une rgle est dclare abstraite avec un attribut abstract ayant la valeur true. Elle n'a pas d'attribut context.
Elle possde, en revanche, un attribut id qui permet de la dsigner pour l'utiliser.
Un autre rgle peut utiliser une rgle abstraite en lui fournissant un contexte. Elle fait appel la rgle abstraite
grce l'lment sch:extends dont l'attribut rule donne l'identifiant de la rgle abstraite.
Dans l'exemple suivant une rgle abstraite de nom has-title est dfinie. Elle vrifie que le nud contexte
possde un enfant title et que celui-ci est le premier enfant. Deux rgles utilisent ensuite cette rgle pour les
lments book et chapter.
<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron"
queryBinding="xslt"
schemaVersion="ISO19757-3">
<title>Utilisation de rgles abstraites</title>
<pattern>
<!-- Rgle abstraite qui teste si le premier enfant est title -->
<rule abstract="true" id="has-title">
<assert test="*[1][self::title]">
L'lment <name/> doit avoir un enfant title qui
doit tre le premier enfant.
</assert>
</rule>
<!-- Utilisation de la rgle abstraite pour les lments book -->
<rule context="book">
<extends rule="has-title"/>
<assert test="chapter">
Le livre soit contenir au moins un chapitre.
</assert>
</rule>
<!-- Utilisation de la rgle abstraite pour les lments chapter -->
<rule context="chapter">
<extends rule="title"/>
<assert test="para">
Le chapire soit contenir au moins un paragraphe.
</assert>
</rule>
</pattern>
</schema>
Ce schematron permet de vrifier que le document suivant n'est pas correct. L'lment title n'est pas le premier
enfant du second chapter et le troisime chapter n'a pas d'enfant title.
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<book>
<title>Titre du livre</title>
<chapter>
<title>Premier chapitre</title>
<para>Ceci est le premier chapitre ...</para>
</chapter>
<chapter>
<para>Paragraphe avant le titre ...</para>
<title>Titre mal plac</title>
<para>Second paragraphe du second chapitre aprs le titre ...</para>
</chapter>
<chapter>
<para>Chapitre sans titre</para>
</chapter>
</book>
112
Schematron
113
Schematron
Le mcanisme des blocs abstraits est souvent implment comme les #define du langage C. Chaque bloc qui
utilise un bloc abstrait est remplac par une copie de celui-ci o les paramtres sont substitus par leurs valeurs.
Le schematron prcdent est en fait quivalent au schematron suivant. Le bloc abstrait uniq a disparu mais ses
rgles apparaissent dupliques dans les deux blocs uniq-id et uniq-title.
<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron"
queryBinding="xslt"
schemaVersion="ISO19757-3">
<title>Substitution des blocs abstraits</title>
<pattern id="uniq-id">
<rule context="book">
<assert test="@id|@key">
L'lment <name/> doit avoir un descendant @id|@key
</assert>
<report test="count(@id|@key) > 1">
L'lment <name/> doit avoir un seul descendant @id|@key
</report>
</rule>
</pattern>
<pattern id="uniq-title">
<rule context="book">
<assert test="title">
L'lment <name/> doit avoir un descendant title
</assert>
<report test="count(title) > 1">
L'lment <name/> doit avoir un seul descendant title
</report>
</rule>
</pattern>
</schema>
L'exemple ci-dessous illustre la puissance des schematrons. Ce schematron exprime certaines contraintes que
doivent satisfaire les schematrons pour tre valides. Ces contraintes portent sur les liens entre les lments
pattern abstraits et ceux qui les utilisent.
<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
queryBinding="xslt"
schemaVersion="ISO19757-3">
<title>Vrification des liens is-a des schematrons</title>
<p>Ce schematron vrifie que, dans un schematron, tout bloc rfrenc
par un autre bloc par l'attribut is-a est bien dclar abstrait par
l'attribut abstract true.</p>
<!-- Dclaration de l'espace de noms cible : celui des schematrons -->
<!-- Ne pas utiliser le prfixe sch car cela pose problme -->
<ns prefix="tns" uri="http://purl.oclc.org/dsdl/schematron"/>
<!-- Cl pour retrouver les lments pattern par leur id -->
<xsl:key name="patid" match="tns:pattern" use="@id"/>
<pattern>
<rule context="tns:pattern[@is-a]">
<assert test="key('patid', @is-a)">
L'attribut is-a doit rfrencer un bloc abstrait.
</assert>
114
Schematron
115
Schematron
</pattern>
<!-- Dcompte du nombre de livres -->
<pattern id="count">
<rule context="bibliography">
<report test="book">
Il y a <value-of select="count(book)"/> livre(s).
</report>
</rule>
</pattern>
</schema>
116
8.1. Principe
Le principe de fonctionnent de XSLT est le suivant. Une feuille de style XSLT contient des rgles qui dcrivent
des transformations. Ces rgles sont appliques un document source XML pour obtenir un nouveau document
XML rsultat. Cette transformation est ralise par un programme appel processeur XSLT. La feuille de style est
aussi appele programme dans la mesure o il s'agit des instructions excuter par le processeur.
117
Programmation XSLT
Fe u ille d e s t yle
s t yl e s he e t . xs l
Do c u m e n t s o u rc e
Do c u m e n t r s u lt a t
s o u r c e . x ml
r e s u l t . x ml
XSLT
Pro c e s s o r
118
Programmation XSLT
119
Programmation XSLT
dans le fragment par le rsultat de leur excution. L'lment essentiel est l'lment xsl:apply-templates qui
permet d'invoquer l'application d'autres rgles. Les fragments de document produit par ces applications de rgles
remplacent l'lment xsl:apply-templates. L'endroit o se trouve l'lment xsl:apply-templates
constitue donc le point d'ancrage pour l'insertion du ou des fragments produits par son excution.
La forme globale d'une rgle est donc la suivante.
<xsl:template match="...">
<!-- Fragment produit -->
...
<!-- Application de rgles -->
<xsl:apply-templates .... />
...
<!-- Application de rgles -->
<xsl:apply-templates .... />
...
<xsl:template/>
Chacune des rgles est dclare avec un lment xsl:template dont l'attribut match prcise sur quels nuds
elle est susceptible d'tre applique. Le processus de transformation consiste appliquer des rgles sur des nuds
actifs du documents source. Au dpart, seule la racine est active et la premire rgle est donc applique cette
racine. L'application de chaque rgle produit un fragment de document qui va constituer une partie du document
rsultat. Elle active d'autres nuds avec des lments xsl:apply-templates placs au sein du fragment de
document. Des rgles sont alors appliques ces nouveaux nuds actifs. D'une part, elles produisent des fragments
de documents qui s'insrent dans le document rsultat la place des lments xsl:apply-templates qui les
ont provoques. D'autre part, elles activent ventuellement d'autres nuds pour continuer le processus. Ce dernier
s'arrte lorsqu'il n'y a plus de nuds actifs.
Le processus de transformation s'apparente donc un parcours de l'arbre du document source. Il y a cependant une
diffrence importante. Dans un parcours classique d'un arbre comme les parcours en largeur ou en profondeur, le
traitement d'un nud entrane le traitement de ses enfants. L'application d'une rgle XSLT active d'autres nuds
mais ceux-ci ne sont pas ncessairement les enfants du nud sur lequel la rgle s'applique. Les nuds activs sont
dtermins par l'attribut select des lments xsl:apply-templates. Chaque attribut select contient
une expression XPath dont l'valuation donne la liste des nuds activs.
La figure ci-dessous illustre la construction de l'arbre rsultat par l'application des rgles XSLT. Chacun des
triangles marqus template reprsente un fragment de document produit par l'application d'une rgle. Tous
ces triangles sont de mme taille sur la figure mme si les fragments ne sont pas identiques. Les flches
marques apply-templates symbolisent l'application de nouvelles rgles par l'activation de nuds. L'arbre
du document rsultat est, en quelque sorte, obtenu en contractant ces flches marques apply-templates et en
insrant leur point de dpart le triangle sur lequel elles pointent. Les flches partant d'un mme triangle peuvent
partir de points diffrents car un mme fragment de document peut contenir plusieurs lments xsl:applytemplates.
120
Programmation XSLT
t e mp l a t e
a p p l y - t e mp l a t e s
t e mp l a t e
a p p l y - t e mp l a t e s
t e mp l a t e
t e mp l a t e
a p p l y - t e mp l a t e s
t e mp l a t e
t e mp l a t e
t e mp l a t e
t e mp l a t e
8.4. Entte
La programme ou feuille de style est entirement inclus dans un lment xsl:stylesheet ou de faon
compltement quivalente un lment xsl:transform. L'attribut version prcise la version de XSLT
utilise. Les valeurs possibles sont 1.0 ou 2.0. Un processeur XSLT 1.0 signale gnralement une erreur lorsque
la feuille de style n'utilise pas cette version. Un processeur XSLT 2.0 passe dans un mode de compatibilit avec
la version 1.0 lorsqu'il rencontre une feuille de style de XSLT 1.0. L'espace de noms des lments de XSLT doit
tre dclar. Il est identifi par l'URI http://www.w3.org/1999/XSL/Transform. Le prfixe xsl est
gnralement associ cet espace de noms. Dans tout ce chapitre, ce prfixe est utilis pour qualifier les lments
XSLT. Il est aussi indispensable de dclarer les espaces de noms du document rsultat si celui-ci en utilise. Ces
dlarations d'espaces de noms sont importantes car le contenu de chaque rgle contient un mlange d'lments
XSLT et d'lments du document rsultat.
L'lment xsl:output doit tre un enfant de l'lment xsl:stylesheet. Il permet de contrler le format
du document rsultat. Son attribut method qui peut prendre les valeurs xml, xhtml, html et text indique le
type de document rsultat produit. Ses attributs encoding, doctype-public, doctype-system prcisent
respectivement l'encodage du document, le FPI et l'URL de la DTD. Un exemple typique d'utilisation est le suivant.
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml"
encoding="iso-8859-1"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
121
Programmation XSLT
indent="yes"/>
122
Programmation XSLT
123
Programmation XSLT
xsl:value-of
Insertion sous la forme chane de caractres des nuds dsigns par l'attribut select.
xsl:copy
Copie un niveau (appele aussi copie superficielle)
xsl:copy-of
Copie rcursive (appele aussi copie profonde)
xsl:element
Construction d'un lment dont le nom est donn par l'attribut name.
xsl:attribute
Ajout d'un attribut dont le nom est donn par l'attribut name.
xsl:number
Numrotation d'lments.
124
Programmation XSLT
une chane de caractres. Lorsqu'une valeur est un nud, la conversion retourne la valeur textuelle de celui-ci. Le
texte est alors obtenu en concatnant ces diffrentes chanes. Un espace est insr entre chacunes d'entre elles.
Le caractre espace ' ' ui est normalement insr entre les diffrentes valeurs peut tre chang avec l'attribut
separator de l'lment xsl:value-of.
Le fragment XSLT suivant insre dans le document rsultat un attribut id dont la valeur est justement la valeur
de l'attribut id du nud courant.
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
Quelques exemples d'utilisation de xsl:value-of.
<xsl:value-of
<xsl:value-of
<xsl:value-of
<xsl:value-of
select="."/>
select="generate-id()"/>
select="key('idchapter', @idref)/title"/>
select="ancestor-or-self::p[@xml:lang][1]/@xml:lang"/>
125
Programmation XSLT
8.7.6.1. Formats
La fonction de formatage est relativement simple. L'attribut format de xsl:number contient une chane forme
d'un prfixe, d'un indicateur de format et d'un suffixe. Le prfixe et le suffixe doivent tre forms de caractres non
alphanumriques. Ils sont recopis sans changement. L'indicateur de format est remplac par l'entier. Le tableau
suivant rcapitule les diffrents formats possibles. Le format par dfaut est 1.
Format
Rsultat
1, 2, 3, , 9, 10, 11,
01
a, b, c, , z, aa, ab,
A, B, C, , Z, AA, AB,
126
Programmation XSLT
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
On considre le document XML suivant qui reprsente le squelette d'un livre avec des chapitres, des sections et
des sous-sections.
<?xml version="1.0" encoding="iso-8859-1"?>
<book>
<chapter>
<section>
<section></section><section></section>
</section>
<section>
<section></section><section></section>
</section>
</chapter>
<chapter>
<section>
<section></section><section></section>
</section>
<section>
<section></section><section></section>
</section>
</chapter>
</book>
En appliquant la feuille de style au document prcdent, on obtient le document XML suivant. Chaque lment
section contient en plus un numro calcul par xsl:number en mode single.
<?xml version="1.0" encoding="iso-8859-1"?>
<book>
<chapter>
<section>1
<section>1</section><section>2</section>
</section>
<section>2
<section>1</section><section>2</section>
</section>
</chapter>
<chapter>
<section>1
<section>1</section><section>2</section>
</section>
<section>2
<section>1</section><section>2</section>
</section>
</chapter>
</book>
Dans le mode multiple, l'lment xsl:number fournit une liste d'entier qui est calcule de la faon suivante.
Le nud de dpart est dtermin par l'attribut from qui contient un motif XPath. C'est l'anctre le plus proche du
nud courant qui satisfait le motif de l'attribut from. Ensuite, on considre chacun des anctres entre le nud de
dpart et le nud courant qui satisfait l'attribut count. Pour chacun de ces anctres, le nombre (plus une unit)
de frres gauches qui satisfont le motif de count fournit un des entiers de la suite.
Si l'lment xsl:number de la feuille de style prcdente est remplac par l'lment suivant, on obtient le
document ci-dessous. Comme le format est A.1.i, chaque section contient un numro global form d'un numro
127
Programmation XSLT
de chapitre (A, B, ), d'un numro de section (1, 2, ) et d'un numro de sous-section (i, ii, ). Ces diffrents
numros sont spars par les points '.' qui sont repris du format.
<xsl:number level="multiple" count="chapter|section" format="A.1.i"/>
<?xml version="1.0" encoding="iso-8859-1"?>
<book>
<chapter>
<section>A.1
<section>A.1.i</section><section>A.1.ii</section>
</section>
<section>A.2
<section>A.2.i</section><section>A.2.ii</section>
</section>
</chapter>
<chapter>
<section>B.1
<section>B.1.i</section><section>B.1.ii</section>
</section>
<section>B.2
<section>B.2.i</section><section>B.2.ii</section>
</section>
</chapter>
</book>
Dans le mode any, le nud de dpart est gal au dernier nud avant le nud courant qui vrifie le motif donn par
l'attribut from. Par dfaut le nud de dpart est la racine du document. Le numro est gal au nombre (augment
d'une unit pour commencer avec 1) de nuds entre le nud de dpart et le nud courant qui satisfont le motif
donn par l'attribut count.
Si l'lment xsl:number de la feuille de style prcdente est remplac par l'lment suivant, on obtient le
document ci-dessous. Chaque section contient son numro d'ordre dans le document car la valeur par dfaut de
from est la racine du document.
<xsl:number level="any" count="section" format="1"/>
<?xml version="1.0" encoding="iso-8859-1"?>
<book>
<chapter>
<section>1
<section>2</section><section>3</section>
</section>
<section>4
<section>5</section><section>6</section>
</section>
</chapter>
<chapter>
<section>7
<section>8</section><section>9</section>
</section>
<section>10
<section>11</section><section>12</section>
</section>
</chapter>
</book>
L'lment xsl:number suivant utilise l'attribut from pour limiter la numrotation des lments section aux
contenus des lments chapter. En appliquant la feuille de style prcdente avec cet lment xsl:number,
on obtient le document ci-dessous. Chaque section contient son numro d'ordre dans le chapitre.
128
Programmation XSLT
129
Programmation XSLT
<xsl:when test="title">
<xsl:value-of select="title"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>Section </xsl:text>
<xsl:number level="single" count="section"/>
</xsl:otherwise>
</xsl:choose>
8.9. Tris
L'lment xsl:sort permet de trier des lments avant de les traiter. L'lment xsl:sort doit tre le
premier fils des lments apply-templates, call-template, for-each ou for-each-group. Le tri
s'applique tous les lments slectionns (par l'attribut select) de ces diffrents lments.
Le fragment de feuille de style suivant permet par exemple de trier les lments book par auteur par ordre
croissant.
<xsl:apply-templates select="bibliography/book">
<xsl:sort select="author" order="ascending"/>
</xsl:apply-templates>
L'attribut select de xsl:sort dtermine la cl du tri. L'attribut data-type qui peut prendre les valeurs
number ou text spcifie comment les cls doivent tre interprtes. Il est possible d'avoir plusieurs cls de tri
en mettant plusieurs lments xsl:sort comme dans l'exemple suivant. Les lments book sont d'abord tris
par auteur puis par anne.
<xsl:apply-templates select="bibliography/book">
<xsl:sort select="author" order="ascending"/>
<xsl:sort select="year"
order="descending"/>
</xsl:apply-templates>
130
Programmation XSLT
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:template match="/">
<xsl:variable name="list" as="xsd:integer*">
<xsl:perform-sort>
<xsl:sort data-type="number" order="ascending"/>
<xsl:sequence select="(3, 1, 5, 0)"/>
</xsl:perform-sort>
</xsl:variable>
<!-- Produit 0,1,3,5 -->
<xsl:value-of select="$list" separator=","/>
</xsl:template>
</xsl:stylesheet>
8.10.1. Variables
La valeur de la variable est fixe au moment de sa dclaration par l'lment xsl:variable et ne peut plus
changer ensuite. Les variables ne sont donc pas vraiment variables. Il s'agit d'objets non mutables dans la
terminologie des langages de programmation. La porte de la variable est l'lment XSLT qui la contient. Les
variables dont la dclaration est fille de l'lment xsl:stylesheet sont donc globales.
L'attribut name dtermine le nom de la variable. La valeur est donne soit par une expression XPath dans l'attribut
select soit directement dans le contenu de l'lment xsl:variable. Un attribut optionnel as peut spcifier
le type de la variable. Les types possibles sont les types XPath [Section 6.1.4]. Dans l'exemple suivant, la variable
squares est dclare de type xsd:integer*. Elle contient donc une liste d'entiers ventuellement vide.
<xsl:variable name="squares" as="xsd:integer*">
<xsl:for-each select="1 to 5">
<xsl:sequence select=". * ."/>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="cubes" as="xsd:integer*"
select="for $i in 1 to 5 return $i * $i * $i"/>
Une variable dclare peut apparatre dans une expression XPath en tant prcde du caractre '$' comme dans
l'exemple suivant.
<xsl:value-of select="$squares"/>
131
Programmation XSLT
Une variable permet aussi de mmoriser un ou plusieurs nuds. Il est parfois ncessaire de mmoriser le nud
courant dans une variable afin de poufois y accder dans une expression XPath qui modifie contexte. Le fragment
de feuille de style mmorise le nud courant dans la variable current. Elle l'utilise ensuite pour slectionner
les lments publisher dont l'attribut id est gal l'attribut by du nud courant.
<xsl:variable name="current" select="."/>
<xsl:xsl:copy-of select="//publisher[@id = $current/@by]"/>
L'expression XPath //publisher[@id = $current/@by] n'est pas trs efficace car elle ncessite un
parcours complet du document pour retrouver le bon lment publisher. Elle peut avantageusement tre
remplace par un appel la fonction key. Il faut au pralable crer avec xsl:key un index des lments
publisher par leur attribut id. Cette approche est dveloppe dans l'exemple suivant.
Une variable peut aussi tre utilise, dans un souci d'efficacit pour mmoriser un rsultat intermdiaire. Dans
l'exemple suivant, le nud retourn par la fonction key est mmoris dans la variable result puis utilis
plusieurs reprises.
<!-- Indexation des lments publisher par leur attribut id -->
<xsl:key name="idpublisher" match="publisher" use="@id"/>
...
<!-- Sauvegarde du noeud recherch -->
<xsl:variable name="result" select="key('idpublisher', @by)"/>
<publisher>
<!-- Utilisation multiple du noeud -->
<xsl:copy-of select="$result/@*[name() != 'id']"/>
<xsl:copy-of select="$result/* | $result/text()"/>
</publisher>
8.10.2. Paramtres
La valeur par dfaut d'un paramtre est fixe au moment de sa dclaration par l'lment xsl:param. Parmi
les paramtres, le langage XSLT distingue les paramtres globaux et les paramtres (locaux) des rgles. Les
paramtres globaux sont dclars par un lment xsl:param fils de l'lment xsl:stylesheet. Leur valeur
est fixe au moment de l'appel au processeur XSLT. Leur valeur reste constanet pendant toute la dure du traitemet
et ils peuvent tre utiliss dans toute la feuille de style. La syntaxe pour fixer la valeur d'un paramtre global
dpend du processeur XSLT. Les processeurs qui peuvent tre utiliss en ligne de commande ont gnralement
pour une option pour ces paramtres. Le processeur xstlproc a, par exemple, des options --param et -stringparam dont les valeurs sont des expressions XPath. La seconde option ajoute implitement les quotes
''' ncessaires autour des chanes de caractres.
La dclaration d'un paramtre d'une rgle est ralise par un lment xsl:param fils de xsl:template.
Les dclarations de paramtres doivent tre les premiers fils. Le passage d'une valeur en paramtre est ralise
par un lment xsl:with-param fils de xsl:apply-templates ou xsl:call-template. Comme
pour xsl:variable, l'attribut name dtermine le nom de la variable. La valeur est donne soit par une
expression XPath dans l'attribut select soit directement dans le contenu de l'lment xsl:variable. Un
attribut optionnel as peut spcifier le type de la valeur.
Dans l'exemple suivant, la premire rgle (pour la racine /) applique la rgle pour le fils text avec le paramtre
color gal blue. La valeur par dfaut de ce paramtre est black.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="iso-8859-1" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="text">
<!-- Valeur du paramtre pour l'appel -->
<xsl:with-param name="color" select="'blue'"/>
</xsl:apply-templates>
132
Programmation XSLT
</xsl:template>
<xsl:template match="text">
<!-- Dclaration du paramtre avec 'black' comme valeur par dfaut -->
<xsl:param name="color" select="'black'"/>
<p style="color:{$color};"><xsl:value-of select="."/></p>
</xsl:template>
</xsl:stylesheet>
8.10.3. Rcursivit
La feuille de style suivant ralise le calcul rcursif d'un nombre Fn de la suite de Fibonacci dfinie par rcurrence
par F0 = 1, F1 = 1 et Fn+2 = Fn+1 + Fn pour n 0. L'entier n est fourni par le fichier XML en entre.
<?xml version="1.0" encoding="us-ascii"?>
<!-- Calcul des nombres de Fibonacci -->
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>Nombres de Fibonacci</title>
</head>
<body>
<h1>
<xsl:variable name="n" select="n/text()"/>
<xsl:text>F</xsl:text>
<sub><xsl:number format="1" value="$n"/></sub>
<xsl:text> = </xsl:text>
<xsl:call-template name="fibo">
<xsl:with-param name="n" select="$n"/>
</xsl:call-template>
</h1>
</body>
</html>
</xsl:template>
<xsl:template name="fibo">
<xsl:param name="n" select="1"/>
<xsl:choose>
<xsl:when test="$n = 0">
<xsl:number format="1" value="1"/>
</xsl:when>
<xsl:when test="$n = 1">
<xsl:number format="1" value="1"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="x">
<xsl:call-template name="fibo">
<!-- Espace ncessaire avant le '-'
<xsl:with-param name="n" select="$n
</xsl:call-template>
</xsl:variable>
<xsl:variable name="y">
<xsl:call-template name="fibo">
<!-- Espace ncessaire avant le '-'
<xsl:with-param name="n" select="$n
</xsl:call-template>
133
-->
-1"/>
-->
-2"/>
Programmation XSLT
</xsl:variable>
<xsl:number format="1" value="$x+$y"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
134
Programmation XSLT
135
Programmation XSLT
paramtres avec des valeurs par dfaut en donnant plusieurs dfinitions d'une fonction avec des nombres de
paramtres diffrents. Dans l'exemple suivant, la fonction fun:join-path est dfinie une premire fois avec
trois paramtres. La seconde dfinition avec seulement deux paramtres permet d'omettre le troisime paramtre
qui devient ainsi optionnel.
<!-- Dfinition d'une fonction join-path avec 3 paramtres -->
<xsl:function name="fun:join-path" as="xsd:string">
<xsl:param name="path1" as="xsd:string"/>
<xsl:param name="path2" as="xsd:string"/>
<xsl:param name="sep"
as="xsd:string"/>
<xsl:sequence select="concat($path1, $sep, $path2)"/>
</xsl:function>
<!-- Dfinition d'une fonction join-path avec 2 paramtres -->
<xsl:function name="fun:join-path" as="xsd:string">
<xsl:param name="path1" as="xsd:string"/>
<xsl:param name="path2" as="xsd:string"/>
<xsl:sequence select="concat($path1, '/' , $path2)"/>
</xsl:function>
...
<!-- Appel de la fonction 3 paramtres -->
<xsl:value-of select="fun:join-path('Directory', 'index.html', '/')"/>
<!-- Appel de la fonction 2 paramtres -->
<xsl:value-of select="fun:join-path('Directory', 'index.html')"/>
8.12. Modes
Il est frquent qu'une feuille de style traite plusieurs fois les mmes nuds du document d'entre pour en extraire
divers fragments. Ces diffrents traitements peuvent tre distingus par des modes. Chaque rgle de la feuille de
style dclare pour quel mode elle s'applique avec l'attribut mode de l'lment xsl:template. En parallle,
chaque application de rgles avec xsl:apply-templates spcifie un mode avec un attribut mode.
Chaque mode est identifi par un identificateur. Il existe en outre les valeurs particulires #default, #all et
#current qui peuvent apparatre dans les valeurs des attributs mode.
La valeur de l'attribut mode de l'lment xsl:template est soit la valeur #all soit une liste de modes, y
compris #default, spars par des espaces. La valeur #current n'a pas de sens dans ce contexte et ne peut
pas apparatre. La valeur par dfaut est bien sr #default.
<!-- Rgle applicable avec le mode #default -->
<xsl:template match="...">
...
<!-- Rgle applicable avec le mode test -->
<xsl:template match="..." mode="test">
...
<!-- Rgle applicable avec les modes #default foo et bar -->
<xsl:template match="..." mode="#default foo bar">
...
<!-- Rgle applicable avec tous les modes -->
<xsl:template match="..." mode="#all">
...
La valeur de l'attribut mode de l'lment xsl:apply-templates est soit #default soit #current soit
le nom d'un seul mode. La valeur #all n'a pas de sens dans ce contexte et ne peut pas apparatre. La valeur
#current permet appliquer des rgles avec le mme mode que celui de la rgle en cours. La valeur par dfaut
est encore #default.
<!-- Application avec le mode #default -->
<xsl:apply-templates select="..."/>
136
Programmation XSLT
...
<!-- Application avec le mode test -->
<xsl:apply-templates select="..." mode="test"/>
...
<!-- Application avec le mode dj en cours -->
<xsl:apply-templates select="..." mode="#current"/>
...
Dans l'exemple suivant, le nud text est trait d'abord dans le mode par dfaut #default puis dans le mode
test. Dans chacun de ces traitements, ses fils textuels sont traits d'abord dans le mode par dfaut puis dans son
propre mode de traitement. Les fils textuels sont donc, au final, traits trois fois dans le mode par dfaut et une
fois dans le mode test.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:template match="/">
<xsl:apply-templates select="text"/>
<xsl:apply-templates select="text" mode="test"/>
</xsl:template>
<xsl:template match="text" mode="#default test">
<xsl:apply-templates select="text()"/>
<xsl:apply-templates select="text()" mode="#current"/>
</xsl:template>
<xsl:template match="text()">
<xsl:text>Mode #default: </xsl:text>
<xsl:value-of select="."/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="text()" mode="test">
<xsl:text>Mode test: </xsl:text>
<xsl:value-of select="."/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
L'exemple suivant illustre une utilisation classique des modes. Le document est trait une premire fois en mode
toc pour en extraire une table des matires et une seconde fois pour crer le corps du document proprement dit.
<!-- Rgle pour la racine -->
<xsl:template match="/">
<html>
<head>
<title><xsl:value-of select="book/title"/></title>
</head>
<body>
<!-- Fabrication de la table des matires -->
<xsl:apply-templates mode="toc"/>
<!-- Fabrication du corps du document -->
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
...
<!-- Rgles pour la table des matires -->
<xsl:template match="book" mode="toc">
<h1>Table des matires</h1>
<ul><xsl:apply-templates mode="toc"/></ul>
137
Programmation XSLT
</xsl:template>
8.13. Indexation
Afin de pouvoir accder efficacement des nuds d'un document XML, il est possible de crer des index.
L'lment xsl:key cre un index. L'attribut name fixe le nom de l'index pour son utilisation. L'expression XPath
de l'attribut match dtermine les nuds qui sont indexs alors que l'expression XPath de l'attribut use spcifie
la cl d'indexation. L'lment xsl:key doit tre un fils de l'lment xsl:stylesheet.
<xsl:key name="idchapter" match="chapter" use="@id"/>
La fonction key de XPath permet de retrouver un nud en utilisant un index cr par xsl:key. Le premier
paramtre est le nom de l'index et le second est la valeur de la cl.
<xsl:value-of select="key('idchapter', $node/@idref)/title"/>
L'utilisation des index peut tre contourne par des expressions XPath approprie. L'expression ci-dessus avec la
fonction key est quivalente l'expression XPath ci-dessous.
<xsl:value-of select="//chapter[@id = $node/@idref]/title"/>
L'inconvnient de cette dernire expression est d'imposer un parcours complet du document pour chacune de ses
valuations. Si l'expression est value de nombreuses reprises, ceci peut conduire des problmes d'efficacit.
138
Programmation XSLT
<ul>
<xsl:for-each select="files/file">
<xsl:apply-templates select="document(@href)/cities/city"/>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="city">
<li><xsl:value-of select="."/></li>
</xsl:template>
</xsl:stylesheet>
L'ajout d'un lment xsl:sort comme fils de l'lment <xsl:apply-templates
select="document(@href)/cities/city"/> permet de trier les lments l'intrieur d'un des
documents rfrencs. Pour trier les lments globalement, il faut supprimer les deux itrations imbriques et les
remplacer par une seule itration comme dans l'exemple suivant.
<xsl:apply-templates select="document(files/file/@href)/cities/city">
<xsl:sort select="."/>
</xsl:apply-templates>
Dans l'expression XPath document(files/file/@href)/cities/city, on utilise le fait que la fonction
document() prend en paramtre une liste de noms de fichiers et qu'elle retourne l'ensemble des contenus des
fichiers.
139
Chapitre 9. XSL-FO
XSL-FO est un dialecte de XML permettant de dcrire le rendu de documents. Un document XSF-FO contient le
contenu mme du document ainsi que toutes les indications de rendu. Il s'apparente donc un mlange de HTML
et CSS [Chapitre 10] avec une syntaxe XML mais il est plus destin l'impression qu'au rendu sur cran. Le
langage XSL-FO est trs verbeux et donc peu adapt l'criture directe de documents. Il est plutt conu pour des
documents produits par des feuilles de style XSL [Chapitre 8].
140
10.2. Rgles
Une feuille de style est forme de rgles qui ont la forme suivante. Les espaces et les retours la ligne jouent
uniquement un rle de sparateurs. L'indentation de la feuille de style est donc libre.
selector {
property1: value1;
property2: value2;
...
propertyN: valueN;
}
Le slecteur selector dtermine quels sont les lments auxquels s'applique la rgle. Les proprits
property1, property2, , propertyN de tous ces lments prendront les valeurs respectives value1,
value2, , valueN. Chaque valeur est spare du nom de la proprit par le caractre ':'. Le caractre ';'
spare les couples proprit/valeur de la rgle. Il n'est donc pas indispensable aprs le dernier couple de la rgle.
Des commentaires peuvent tre mis dans les feuilles de styles en dehors ou dans les rgles en utilisant une syntaxe
identique celle du langage C. Ils commencent par les deux caractres /* et se terminent par les deux caractres
*/.
L'exemple ci-dessous est la feuille de style utilise par cette page-ci.
/* Fond blanc */
body {
background-color: white;
}
/* Equations et figures centres */
p.equation, p.figure {
text-align: center;
}
/* Zone de code : fond jaune clair, bordure noire et marges */
pre {
background-color: #ffffcc;
border: 1px solid black;
margin: 10px;
padding: 5px;
}
141
10.2.1. Mdia
Les rgles d'une feuille de style peuvent dpendre du mdia utilis pour rendre le document. Par mdia, on entend
le support physique servant matrialiser le document. Il peut s'agir d'un cran d'ordinateur, d'un projecteur, de
papier. La syntaxe est la suivante.
@media medium {
/* Rgles pour le mdia */
...
}
Les principales valeurs possibles pour medium sont screen pour un cran d'ordinateur, print pour du papier
et projection pour un projecteur.
10.2.2. Slecteurs
Un slecteur prend la forme gnrale suivante. Il est constitu par une suite de slecteurs spars par des virgules.
Il slectionne alors tous les lments slectionns par chacun des slecteurs individuels.
selector1, selector1, ..., selectorN
La forme la plus simple d'un slecteur est le nom name d'un lment comme h1, p ou encore pre. Tous les
lments de nom name sont alors slectionns. Dans l'exemple suivant, le fond de l'lment body, c'est--dire
de tout le document, est blanc.
body {
background-color: white;
}
Tous les lments dont l'attribut class contient la chane classname peuvent tre slectionns par le slecteur
.classname o le la valeur de l'attribut est prcde d'un point '.'.
L'attribut class d'un lment peut contenir plusieurs chanes spares par des espaces comme dans l'exemple
suivant. Un slecteur de forme .classname slectionne un lment si la chane classname est une des chanes
de la valeur de l'attribut class.
<p class="numbered equation"> ... </p>
Cette forme de slecteur peut tre combine avec le nom name d'un lment pour former un slecteur
name.classname qui slectionne tous les lments de nom name dont l'attribut class contient la chane
classname. Dans l'exemple suivant, tous les lments p de classe equation ou figure auront leur texte
centr.
p.equation, p.figure {
text-align: center;
}
L'lment unique dont l'attribut id a la valeur name peut tre slectionn par le slecteur #name o la valeur
de l'attribut est prcde d'un dise '#'. Dans l'exemple suivant, le contenu de l'lment h1 dont l'attribut id
vaut title sera de couleur rouge.
h1#title { color: red }
Le slecteur '*' slectionne tous les lments. Dans l'exemple suivant, tous les lments (c'est--dire le texte)
seront de couleur bleue l'exception des lments p qui seront de couleur grise.
* { color: blue }
142
p { color: gray }
Certaines parties d'un document qui ne correspondent pas un lment peuvent tre slectionnes par des pseudolments. La premire ligne et le premier caractre du contenu d'un lment name peuvent tre dsigns par
name:first-line et name:first-letter.
p:first-line {
text-indent: 15pt;
}
Le pseudo-lment :first-child permet en outre de slectionner le premier fils d'un lment. Dans l'exemple
suivant, la rgle s'applique uniquement la premire entre d'une liste.
li:first-child {
color: blue;
}
Les pseudo-lments :before et :after et la proprit content permettent d'ajouter du contenu avant et
aprs un lment.
li:before {
content: "[" counter(c) "]";
counter-increment: c;
}
Les pseudo-classes :link, :visited, :hover et :active s'appliquent l'lment a et permettent de
slectionner les liens, les liens dj traverss, les liens sous le curseur et les liens activs.
a:link
a:visited
a:hover
a:active
{
{
{
{
color:
color:
color:
color:
blue; }
magenta; }
red; }
red; }
143
}
Il est possible de mettre plusieurs prdicats portant sur les attributs comme dans l'exemple suivant. Le slecteur
suivant slectionne les lments p ayant un attribut lang de valeur fr et un attribut type de valeur center.
p[lang="fr"][type="center"] {
...
}
Il est possible de composer des slecteurs avec les oprateurs ' ' (espace), '>' et '+' pour former des nouveaux
slecteurs.
Le slecteur selector1 selector2 slectionne tous les lments slectionns par selector2 qui sont en
outre descendants dans l'arbre du document (c'est--dire inclus) d'un lment slectionn par selector1. Dans
l'exemple suivant, seuls les lments em contenus directement ou non dans un lment p auront leur texte en gras.
p em {
font-weight: bold;
}
Cet oprateur peut aussi combiner plusieurs slecteurs. Dans l'exemple suivant, sont slectionns les lments de
classe sc contenus dans un lment em lui mme contenu dans un lment p. Il y a bien un espace entre em et
.sc. Le slecteur p em.sc est bien sr diffrent.
p em .sc {
font-variant: small-caps;
}
Le slecteur selector1 > selector2 slectionne tous les lments slectionns par selector2 qui sont
en outre fils (c'est--dire directement inclus) d'un lment slectionn par selector1.
Le slecteur selector1 + selector2 slectionne tous les lments slectionns par selector2 qui sont
en outre frre droit (c'est--dire qui suivent directement) d'un lment slectionn par selector1.
10.2.3. Proprits
Les proprits qui peuvent tre modifies par une rgle dpendent des lments slectionns. Pour chaque lment
de XHTML, il y a une liste des proprits qui peuvent tre modifies.
10.2.4. Valeurs
Les valeurs possibles dpendent de la proprit. Certaines proprits acceptent comme display uniquement un
nombre dtermin de valeurs. D'autres encore prennent une couleur, un entier, un pourcentage, un nombre dcimal
ou une dimension avec une unit.
Pour les dimensions, il est ncessaire de mettre une unit parmi les units suivantes.
Symbole
Unit
px
pixel
pt
point = 1/72 in
pc
pica = 12 pt
em
ex
in
pouce
mm
millimtre
144
Symbole
Unit
cm
centimtre
10.3.2. Cascade
Plusieurs rgles peuvent s'appliquer un mme lment. Il y a souvent plusieurs feuilles de style pour le
mme document : une feuille de style par dfaut pour l'application, une autre fournie par l'auteur du document
et ventuellement une feuille donne par l'utilisateur. De plus, une mme feuille peut contenir des rgles qui
slectionnent le mme lment.
La priorit d'une rgle est d'abord dtermine par sa provenance. La feuille de style de l'auteur a priorit sur celle
de l'utilisateur qui a elle-mme priorit sur celle de l'application.
Pour les rgles provenant de la mme feuille de style, on applique l'algorithme suivant pour dterminer leur
priorit. On calcule une spcificit de chaque slecteur qui est un triplet (a,b,c) d'entiers. L'entier a est le nombre
d'occurrences de prdicats sur l'attribut id de forme #ident. L'entier b est le nombre de prdicats sur les autres
attributs y compris les attributs class de forme classname. Le nombre c est finalement le nombre de noms
d'lments apparaissant dans le slecteur. Les spcificits (a,b,c) et (a',b',c') des slecteurs des deux rgles sont
alors compares par ordre lexicographique. Ceci signifie qu'on compare d'abord a et a', puis b et b' si a est gal
a', puis finalement c et c' si (a,b) est gal (a',b').
Pour des rgles dont les slecteurs ont mme spcificit, c'est l'ordre d'apparition dans la feuille de style qui
dtermine la priorit. La dernire rgle apparue a une priorit suprieure.
145
To p
LM
LB
TM
Ma rg in
TB
Bo rd e r
TP
Pa d d in g
LP
RP
Le ft
Co n t e n t
RB
RM
Rig h t
BP
BB
BM
Bo t t o m
146
147
<head>
<title>Titre de la page</title>
<style type="text/css"><!-/* Contenu de la feuille de style */
/* Ce contenu est inclus dans un commentaire XML */
body { background-color: white; }
--></style>
</head>
Valeur
color
couleur
font
font-family
font-style
font-variant
normal, small-caps
font-weight
font-size
dimension
text-decoration
text-transform
word-spacing
normal ou dimension
letter-spacing
normal ou dimension
vertical-align
text-align
text-indent
dimension ou pourcentage
line-height
white-space
content
chane de caractres
10.7.2. Fond
Proprit
Valeur
background
background-attachement
scroll ou fixed
background-color
couleur
148
Proprit
Valeur
background-image
image
background-position
background-repeat
Valeur
width height
padding
padding-top
padding-right dimension ou pourcentage
padding-bottom padding-left
border-style
border-width
border-color
couleur
double,
float
clear
overflow
visibility
visible ou hidden
10.7.4. Listes
Proprit
Valeur
list-style
list-style-image
image
list-style-position
outside ou inside
list-style-type
149
llo , S VG !
e
H
Figure 11.1. Rendu du document ci-dessous
<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" width="200" height="100"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="textpath"
d="M 15,80 C 35,65 40,65 50,65 C 60,65 80,75 95,75
C 110,75 135,60 150,60 C 165,60 170,60 185,65"
style="fill:none;stroke:black;" />
</defs>
<text style="font-family:Verdana; font-size:28;
font-weight:bold; fill:red">
<textPath xlink:href="#textpath">
Hello, SVG!
</textPath>
</text>
<use xlink:href="#textpath" y="10"/>
</svg>
Rendu
Ligne
x2 ,y2
150
SVG
lment
Rendu
Rectangle
x,y
<rect
x=...
height=... />
y=...
wid t h
width=...
h e ig h t
Ellipse
<ellipse cx=... cy=... rx=... ry=... /
>
c x,c y
rx
ry
Ligne polygonale
<polyline
y3 ..."/>
points="x1
x3 ,y3
y1
x2
y2
x3
x1 ,y1
x4 ,y4
x2 ,y2
x3 ,y3
y1
x2
y2
x3
x1 ,y1
x4 ,y4
x2 ,y2
11.2.2. Chemins
lment
Rendu
Point de dpart
<path d="M x1 y1"/>
x1 ,y1
Ligne horizontale
<path d="M x1 y1 H x2"/>
x1 ,y1
Ligne verticale
x2 ,y1
x1 ,y1
x1 ,y2
151
SVG
lment
Rendu
Ligne
x2 ,y2
c x,c y
x2 ,y2
x1 ,y1
c x1 ,c y1
x3 ,y3
x2 ,y2
<path d="M x1 y1 Q cx cy x2 y2 T x3
y3"/>
x1 ,y1
c x1 ,c y1
x2 ,y2
c x2 ,c y2
x1 ,y1
c x1 ,c y1
c x3 ,c y3
x2 ,y2
c x2 ,c y2
x1 ,y1
x3 ,y3
c x,c y
x2 ,y2
x1 ,y1
Pour une introduction aux courbes de Bezier, on peut se rferer cette partie [Section 11.5].
11.2.3. Remplissage
lment
Rendu (PNG)
Rgle evenodd
<path d="..." fill="evenodd"/>
152
SVG
lment
Rendu (PNG)
Rgle nonzero
<path d="..." fill="nonzero"/>
11.3. Transformations
L'lment g permet de grouper plusieurs lments graphiques. Il est ainsi possible d'associer simlutanment
plusieurs lments des rgles de style communes.
L'lment g permet aussi d'appliquer des transformations affines sur les lments graphiques. L'attribut
transform de l'lment g contient une suite de transformations appliques successivments. Les transformations
possibles sont les suivantes.
Transformation
Action
translate(dx,dy)
Translation (dplacement)
scale(x) ou scale(x,y)
Dilatation
rotate(a) ou scale(a,cx,cy)
Rotation
skewX(x) et skewY(y)
Inclinaisons
153
SVG
P4
P2
P2
P3
P2
P1
P4
P1
P3
P1
P4
154
SVG
Si dans la construction prcdente, les milieux sont remplacs par les barycentres avec les poids t et 1-t, on obtient
le point de la courbe de coordonnes x(t), y(t).
P3
H
P2
L4 = R1
R2
L3
R3
L2
P1 = L1
P4 = R4
11.5.2. B-splines
Les courbes B-splines sont aussi des courbes de degr 3. Elles sont donc aussi dtermines par quatre points de
contrle. Contrairement une courbe de Bzier, une B-spline ne passe par aucun de ses points de contrle. Par
contre, les B-splines sont adaptes pour tre mises bout bout afin de former une courbe ayant de multiples points
de contrle.
Soient n+3 points P1,,Pn+3. Ils dterminent n B-spline s1,,sn de la manire suivante. Chaque B-spline si est
dtermine par les points de contrle Pi, Pi+1, Pi+2 et Pi+3.
Si les coordonnes des points de contrle sont (x1, y1), , (xn+3, yn+3), l'quation de la spline si est la suivante.
xi(t) = 1/6[ (1-t)3xi + (3t3-6t2+4)xi+1 + (-3t3+3t2+3t+1)xi+2 + t3xi+3] pour 0 t 1
yi(t) = 1/6[ (1-t)3yi + (3t3-6t2+4)yi+1 + (-3t3+3t2+3t+1)yi+2 + t3yi+3] pour 0 t 1
partir des quations dfinissant les splines si, on vrifie facilement les formules suivantes qui montrent que la
courbe obtenue en mettant bout bout les courbes si est de classe C2, c'est--dire deux fois drivable.
si(1) = si+1(0) = 1/6(Pi+1 + 4Pi+2 + Pi+3)
s'i(1) = s'i+1(0) = 1/2(Pi+3 - Pi+1)
s''i(1) = s''i+1(0) = Pi+3 - 2Pi+2 + Pi+1
11.5.3. Conversions
Puisque seules les courbes de Bzier sont prsentes en SVG, il est ncessaire de savoir passer d'une B-Spline
une courbe de Bzier. La B-spline de points de contrle P1, P2, P3 et P4 est en fait la courbe de Bzier dont les
points de contrle P'1, P'2, P'3 et P'4 sont calculs de la manire suivante. Si les coordonnes des points P1, P2,
P3 et P4 sont (x1, y1), (x2, y2), (x3, y3) et (x4, y4), les coordonnes (x'1, y'1), (x'2, y'2), (x'3, y'3) et (x'4, y'4) des
points P'1, P'2, P'3 et P'4 sont donnes par les formules suivantes pour les premires coordonnes et des formules
similaires pour la seconde.
x'1 = 1/6(x1 + 4x2 + x3)
155
SVG
156
12.1. SAX
12.1.1. Principe
Ap p lic a t io n
Do c u m e n t s o u rc e
s o u r c e . x ml
Eve n t
Ha n d le r
Pa rs e r
157
Programmation XML
* @version 1.0
*/
class TrivialSAXHandler extends DefaultHandler {
public void setDocumentLocator(Locator locator) {
System.out.println("Location : " +
"publicId=" + locator.getPublicId() +
" systemId=" + locator.getSystemId());
}
public void startDocument() {
System.out.println("Debut du document");
}
public void endDocument() {
System.out.println("Fin du document");
}
public void startElement(String namespace,
String localname,
String qualname,
Attributes atts) {
System.out.println("Balise ouvrante : " +
"namespace=" + namespace +
" localname=" + localname +
" qualname=" + qualname);
}
public void endElement(String namespace,
String localname,
String qualname) {
System.out.println("Balise fermante : " +
"namespace=" + namespace +
" localname=" + localname +
" qualname=" + qualname);
}
public void characters(char[] ch, int start, int length) {
System.out.print("Caractres : ");
for(int i = start; i < start+length; i++)
System.out.print(ch[i]);
System.out.println();
}
}
Lecture TrivialSAXRead.java d'un fichier XML
// IO
import
import
// SAX
import
import
java.io.InputStream;
java.io.FileInputStream;
javax.xml.parsers.SAXParserFactory;
javax.xml.parsers.SAXParser;
/**
* Lecture triviale d'un document XML avec SAX
* @author O. Carton
* @version 1.0
*/
class TrivialSAXRead {
public static void main(String [] args)
throws Exception
{
// Cration de la fabrique de parsers
158
Programmation XML
12.2. DOM
12.2.1. Principe
Ap p lic a t io n
Do c u m e n t s o u rc e
s o u r c e . x ml
Do c u m e n t t re e
Bu ild e r
159
Programmation XML
Du texte
</item>
et encore du texte.
</table>
La figure ci-dessous reprsente sous forme d'arbre le document XML prsent ci-dessus.
Do c u m e n t
Do c u m e n t Typ e
Co m m e n t
Pro c e s s in g In s t ru c t io n
Ele m e n t
At t rib u t e
Ele m e n t
At t rib u t e
At t rib u t e
Te xt
En t it yRe fe re n c e
Te xt
Ele m e n t
Co m m e n t
Te xt
Te xt
160
Programmation XML
Do c u m e n t Typ e
Ele m e n t
At t r
CDATASe c t io n
No d e
Ch a ra c t e rDa t a
Te xt
Co m m e n t
En t it y
En t it yRe fe re n c e
Pro c e s s in g In s t ru c t io n
No t a t io n
No d e Lis t
java.io.InputStream;
java.io.FileInputStream;
javax.xml.parsers.DocumentBuilderFactory;
javax.xml.parsers.DocumentBuilder;
org.w3c.dom.Document;
/**
* Lecture triviale d'un document XML avec DOM
* @author O. Carton
* @version 1.0
*/
class TrivialDOMRead {
public static void main(String [] args)
throws Exception
{
// Cration de la fabrique de constructeur de documents
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// Cration du constructeur de documents
DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
161
Programmation XML
12.3. Comparaison
La grande diffrence entre les API SAX et DOM est que la premire ne charge pas le document en mmoire
alors que la seconde construit en mmoire une reprsentation arborescente du document. La premire est donc
particulirement adapte aux (trs) gros documents. Par contre, elle offre des facilits de traitement plus rduites.
Le fonctionnement par vnements rend difficiles des traitements non linaires du document. Au contraire, l'API
DOM rend plus faciles des parcours de l'arbre.
12.4. AJAX
Cette page [http://developer.apple.com/internet/webcontent/xmlhttpreq.html] donne un petit historique de l'objet
XMLHttpRequest.
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>
Chargement dynamique
</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="Author" content="Olivier Carton" />
<script type="text/javascript">
// Dans la premire version de Google Suggest, la fonction
// s'appelait sendRPCDone. Elle s'appelle maintenant
// window.google.ac.Suggest_apply
window.google = new Object();
window.google.ac = new Object();
window.google.ac.Suggest_apply = sendRPCDone;
var XMLHttpRequestObject = false;
// Cration du gestionnaire de connexion
if (window.XMLHttpRequest) {
XMLHttpRequestObject = new XMLHttpRequest();
} else {
XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
}
// Fonction de chargement des donnes
function getData(url) {
if (XMLHttpRequestObject) {
// Mise en place de la requte
XMLHttpRequestObject.open("GET", url);
162
Programmation XML
163
Programmation XML
</html>
164
Annexe A. Rfrences
A.1. Cours XML
Cours du W3C [http://www.w3schools.com/]
Cours [http://www.gchagnon.fr/cours/xml/] de Gilles Chagnon
Cours [http://www.grappa.univ-lille3.fr/~torre/Enseignement/Cours/XML] de Fabien Torre
Cours [http://www710.univ-lyon1.fr/~ecoquery/enseignement/sibd/cours-xml/cours-xquery.html] d'Emmanuel
Coquery
Cours [http://www.issco.unige.ch/staff/andrei/xml/] D'Andrei Popescu-Belis
WikiTuto [http://www.wikituto.org/index.php/Cat%C3%A9gorie:Cours_XML]
A.2. Tutoriaux
Tutorial XSL-FO de RenderX [http://www.renderx.com/tutorial.html]
Tutorial Schematron (Svon) [http://www.zvon.org/xxl/SchematronTutorial/General/toc.html]
Tutorial Schematron (D. Pawson) [http://www.dpawson.co.uk/schematron/index.html]
A.3. Spcifications
Schmas XML [http://www.w3.org/XML/Schema]
Schma pour les schmas [http://www.w3.org/2001/XMLSchema.xsd]
Traductions franaises des documents du W3C [http://www.w3.org/2003/03/Translations/byLanguage?
language=fr]
CSS [http://www.w3.org/Style/CSS/]
A.5.2. CSS
Zen garden [http://www.csszengarden.com/]
MaxDesign [http://css.maxdesign.com.au/]
A list apart [http://www.alistapart.com/]
A.5.3. DocBook
Site DocBook [http://www.docbook.org/]
XSL stylesheets pour DocBook [http://www.sagehill.net/docbookxsl/index.html]
165
SP_CHARSET_FIXED="yes"
SP_ENCODING="XML"
SGML_CATALOG_FILES="/usr/share/sgml/opensp-1.5.2/OpenSP/xml.soc"
-s xmlfile.xml
166
Logiciels XML
167
168
Acronymes XML
SVG [ ]
Scalable Vector Graphics
SVRL [http://www.schematron.com/validators.html]
Schematron Validation Report Language
UBL [ ]
Universal Business Language
UCS [ ]
Universal Character Set
URI [ ]
Uniform Resource Identifier
URL [ ]
Uniform Resource Locator
URN
Universal Resource Name
WSDL [ ]
Web Services Description Language
XML [ ]
eXtensible Markup Language
XSD [ ]
XML Schema Definition
XSL [ ]
eXtensible Style Language
XSL-FO [ ]
XSL Formating Object
169
Bibliographie
XML
A. Michard. XML langage et applications. Eyrolles. Paris. 2001. 2-212-09206-7.
B. Marchal. XML by Example. Macmillan Couputer Publishing. 2000.
M. Morrison. XML. CampusPress. 2005.
F. Role. Modlisation et manipulation de documents XML. Lavoisier. 2005.
XPath
M. Kay. XPath 2.0 Programmer's Reference. Wiley Publishing, Inc.. Indianapolis. 2004.
Schmas XML
V. Lamareille. XML Schema et XML Infoset. Cpadus. 2006.
J.-J. Thomasson. Schmas XML. Eyrolles. 2003. 2-212-11195-9.
XSLT et XSL-FO
P. Drix. XSLT fondamental. Eyrolles. 2002.
D. Tidwell. XSLT. O'Reilly. 2001.
M. Kay. XSLT 2.0 Programmer's Reference. Wiley Publishing Inc.. 2004.
Michael Kay. XSLT 2.0 and XPath 2.0. Wiley Publishing, Inc.. Indianapolis. 2008. 978-0-470-19274-0.
CSS
C. Aubry. CSS 1 et CSS 2.1. Editions ENI. 2006.
SVG
J. Eisenberg. SVG Essentials. O'Reilly. 2002. 2-596-00223-8.
170
Index
A
anctre, 9
arbre
du document, 77
atomisation, 80
attribut, 10
xml:base, 15
B
balise
fermante, 8
ouvrante, 8
O
objet courant, 83
ordre du document, 81
P
parent, 9, 79
prologue, 5
S
schma, 33
section
littrale, 9
U
URL
de base, 11
codage
des caractres, 6
collation, 7, 83
commentaire, 13
contenu, 8
contexte
d'valuation, 82
dynamique, 82
statique, 82
D
descendant, 9
DTD, 17, 33
E
lment, 7, 8
racine, 7, 13, 17
enfant, 9, 79
entte, 6
espace de noms, 28, 72
cible, 73
par dfaut, 29
F
facette, 50
frre, 9
I
instructions de traitement, 14
J
jeton, 8, 24
N
nom, 8, 24
local, 28
qualifi, 28
nud courant, 83
171