Cours XML Avancé
Cours XML Avancé
Renseignements généraux :
Cours : XML avancé
Code : GL004
Préalable : HTML
Durée : 30 heures
Enseignant : NGUETCHUENG TCHUNTE Francis
Téléphone: (237) 696 15 20 72 /679 20 87 43
Courriel: fnguetchueng@[Link]
Matériel didactique :
Volumes de références : HAROLD, E. R., MEANS, W. S., XML in a Nutshell, 3rd Edition, O’Reilly, 2004,
ISBN: 0-596-00764-7.
Alexandre BRILLANT ,XML cours et exercices ,Eyrolles,2007
Logiciels de base : Cooktop 2.5
Xmlspy
Objectifs Généraux :
Comprendre l’utilisation de la technologie XML pour la gestion des données en présentant
les aspects essentiels de XML de manière concise et illustrée par de nombreux exemples
Maitriser la syntaxe XML ,la validation de document par des DTD, des schémas et
schematrons , le langage XPATH, la transformation de document par XLST ,ainsi que la
programmation XQuery
Contenu
Chapitre 1 : introduction aux document XML
1
Chapitre 1 : Introduction au document XML
Introduction
Aujourd'hui, les organisations doivent faire face à des besoins de plus en plus importants
d'échanges de données entre des plate-formes hétérogènes. Par exemple : l'application de CRM(
Customer Relationship Manager) doit garder la trace de toutes les correspondances avec les
clients ; le système de gestion documentaire doit communiquer avec la suite bureautique pour
valider les rapports et les propositions commerciales ; l'ERP doit savoir retrouver, extraire et
synthétiser les données des analyses financières et des statistiques de la CRM pour aider au
mieux les dirigeants à orienter la stratégie de l'organisation, etc.
Si l'on sait, de nos jours, facilement stocker et gérer un certain nombre de données structurées
et définies (nombres, relations, etc.), il est encore relativement complexe d'appliquer ces mêmes
méthodes aux données hétérogènes et peu structurées que sont les données bureautiques
(emails, rapports, documentation technique, documentation projets, etc.). Ces données, qui
peuvent s'avérer critiques et vitales, sont peu ou pas valorisées par les organisations qui les
produisent.
Ainsi, il est très difficile, voire impossible, pour une personne de retrouver facilement les emails
envoyés par un de ses collègues à un client dans le cadre d'un projet auquel tous deux
participent.
Il en va de même pour les rapports, les notes, les analyses métiers, etc. Il est donc de plus en
plus critique pour les organisations de pouvoir capturer, gérer, partager et valoriser ces flux
d'informations peu structurées et hétorogènes.
XML, standard ouvert largement accepté et déployé par l'industrie, peut aider à résoudre ce défi
: permettre aux données hétérogènes et peu structurées d'être utilisées par le système
d'information de l'organisation dans son ensemble.
I-Présentation
L'historique suivant retrace les grandes étapes qui ont conduit à la naissance de XML.
L'ancêtre de XML est le langage SGML qui a été introduit en 1986 par C. Goldfarb. SGML a
été conçu pour des documentations techniques de grande ampleur. Sa grande complexité a
freiné son utilisation en dehors des projets de grande envergure. En 1991, T. Berners-Lee a
défini le langage HTML pour le WEB. Ce langage est une version simplifiée à l'extrême de
SGML, destinée à une utilisation très ciblée. XML est, en quelque sorte, intermédiaire entre
SGML et HTML. Il évite les aspects les plus complexes de SGML tout en gardant
suffisamment de souplesse pour une utilisation généraliste. La version 1.0 de XML a été
publiée en 1998 par le consortium W3C (World Wide Web Consortium). Une redéfinition
XHTML de HTML 4.0 à travers XML a été donnée en 1999. Une seconde version 1.1, qui est
simplement une mise à jour pour les caractères spéciaux en lien avec Unicode, a, ensuite, été
publiée en 2004.
Intérêts
2
XML est devenu omniprésent dans le monde de l'informatique. De nombreux standards sont
apparus et permettent à des applications différentes de stocker mais surtout de partager des
documents. L'exemple le plus emblématique et le plus connu est le format OpenDocument qui
est utilisé par OpenOffice, maintenant appelé LibreOffice, mais aussi par d'autres suites
bureautiques comme KOffice. Un autre exemple est le format de dessins vectoriels SVG utilisé
par Inkscape. Ce succès de XML est en grande partie du à ses qualités. Nous allons d'abord
énumérer ces caractéristiques essentielles qui ont conduit à ce développement puis nous allons
les détailler plus en profondeur.
Une des idées directrices de XML est la séparation entre contenu et présentation. Il faut bien
distinguer le contenu d'un document et la présentation qui en est donnée. Un même contenu
peut être rendu de façons très différentes. Cet ouvrage peut, par exemple, se présenter comme
un livre imprimé ou comme une collections de pages WEB. Le contenu est constitué, au départ,
de textes et d'illustrations mais aussi de liens entre ces éléments. L'organisation du texte en
chapitres, sections et sous-sections ainsi que les renvois entre chapitres font partie intégrante
du contenu du document. La présentation est au contraire la façon de présenter ce contenu au
lecteur.
Cette séparation entre contenu et présentation est difficile à obtenir. Le rédacteur d'un document
a souvent une présentation en tête et il est tentant pour lui d'essayer de l'imposer.
La séparation est encore plus marquée en XML car la signification des balises n'est pas figée
comme en HTML. La règle est alors de choisir les balises pour organiser le document en
privilégiant la structure de celui-ci par rapport à une éventuelle présentation.
OFX : Open Financial eXchange pour les échanges d'informations dans le monde
financier
MathML : Mathematical Markup Language permet de représenter des formules
mathématique
CML : Chemical Markup Language permet de décrire des composés chimiques
SMIL : Synchronized Multimedia Integration Language permet de créer des
présentations multimédia en synchronisant diverses sources : audio, vidéo, texte,...
1-EXEMPLE
On commence par donner un premier exemple de document XML comme il peut être écrit
dans un fichier [Link]. Ce document représente une bibliographie de livres sur
XML. Ce document contient une liste de livres avec pour chaque livre, le titre, l'auteur,
l'éditeur , l'année de parution, le numéro ISBN et éventuellement une URL.
4
<ttitre>Designing with web standards</titre>
<auteur>Jeffrey Zeldman</auteur>
<annee>2003</année>
<editeur>New Riders</editeur>
<isbn>0-7357-1201-8</isbn>
</livre>
...
</bibliographie>(5)
(1) Entête XML avec la version 1.0 et l'encodage iso-8859-1 des caractères.
(2) Commentaire délimité par les chaînes de caractères <!-- et -->.
(3) Déclaration de DTD externe dans le fichier [Link].
(4) Balise ouvrante de l'élément racine bibliographie
(5) Balise fermante de l'élément racine bibliograpie
2-1) Prologue
Le prologue contient deux déclarations facultatives mais fortement conseillées ainsi que des
commentaires et des instructions de traitement. La première déclaration est l'entête XML
qui précise entre autre la version de XML et le codage du fichier. La seconde déclaration est
5
la déclaration du type du document (DTD) qui définit la structure du document. La
déclaration de type de document est omise lorsqu'on utilise des schémas XML ou d'autres
types de modèles qui remplacent les DTD. La structure globale du prologue est la suivante.
<?xml ... ?> Entête XML
<!DOCTYPE root-element [ Prologue
... DTD
]>
Les différentes parties du prologue sont détaillées dans les sections suivantes.
Entête XML
L'entête utilise une syntaxe <?xml ... ?> semblable à celle des instructions de
traitement qu'elle ne soit pas véritablement une instruction de traitement. L'entête XML a
la forme générale suivante.
<?xml version="..." encoding="..." standalone="..." ?>
Cette entête peut contenir trois attributs version, encoding et standalone. Il ne
s'agit pas véritablement d'attributs car ceux-ci sont réservés aux éléments mais la syntaxe
identique justifie ce petit abus de langage.
Chaque attribut a une valeur délimitée par une paire d'apostrophes ''' ou une paire de
guillemets '"'. L'attribut version précise la version d'XML utilisée. Les valeurs possibles
actuellement sont 1.0 ou 1.1. L'attribut encoding précise le codage des caractères
utilisé dans le fichier. Les principales valeurs possibles sont USASCII,
ISO-8859-1, UTF-8, et UTF-16. Ces noms de codage peuvent aussi être écrits en
minuscule. L'attribut standalone précise si le fichier est autonome, c'est-à-dire s'il
requiert ou non des ressources extérieures. La valeur de cet attribut peut être yes ou no.
L'attribut version est obligatoire et l'attribut encoding l'est aussi dès que le codage
des caractères n'est pas le codage par défaut UTF-8. Voici quelques exemples d'entête XML.
<?xml version="1.0"?>
<?xml version='1.0' encoding='UTF-8' ?>
<?xml version="1.1" encoding="iso-8859-1" standalone="no" ?>
Le corps du document est constitué de son contenu qui est organisé de façon hiérarchique à
la manière d'un système de fichiers à l'exception qu'aucune distinction n'est faite entre
fichiers et répertoire. L'unité de cette organisation est l'élément. Chaque élément peut
contenir du texte simple, d'autres éléments ou encore un mélange des deux. Comme dans
une arborescence de fichiers, il y a un élément appelé élément racine qui contient
l'ensemble du document.
6
- Élément
Dans la balise ouvrante, le caractère '<' doit être immédiatement suivi du nom de
l'élément. En revanche, il peut y avoir des espaces entre le nom et le caractère '>'. La
balise fermante ne peut pas contenir d'espace.
Lorsque le contenu est vide, c'est-à-dire lorsque la balise fermante suit immédiatement la
balise ouvrante, les deux balises peuvent éventuellement se contracter en une seule balise
de la forme <name/> formée du caractère '<',
Comme chaque élément possède une balise ouvrante et une balise fermante, les balises
vont nécessairement par paire. À toute balise ouvrante correspond une balise fermante et
inversement. L'imbrication des balises doit, en outre, être correcte. Si deux éléments tag1
et tag2 ont un contenu commun, alors l'un doit être inclus dans 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/>
- Sections littérales
Les caractères spéciaux '<', '>' et '&' ne peuvent pas être inclus directement dans le
contenu d'un document.
Ils peuvent être inclus par l'intermédiaire des entités prédéfinies
Il est souvent fastidieux d'inclure beaucoup de caractères spéciaux à l'aide des entités. Les
sections littérales, appelées aussi sections CDATA en raison de la syntaxe permettent
d'inclure du texte qui est qui recopié verbatim.
Une section littérale commence par la chaîne de caractères '<![CDATA[' et se termine
par la chaîne ']]>'.
Tous les caractères qui se trouvent entre ces deux chaînes font partie du contenu du
document, y compris les caractères spéciaux.
7
Une section CDATA ne peut pas contenir la chaîne de caractères ']]>' qui permet à
l'analyseur lexical de détecter la fin de la section. Il est en particulier impossible d'imbriquer
des sections CDATA.
- Attributs
Les balises ouvrantes peuvent contenir des attributs associés à 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 zéro ou plusieurs associations de
valeurs à des attributs comme dans les exemples ci-dessous.
<tag attribute="value"> ... </tag>
<tag attribute1="value1" attribute2="value2"> ... </tag>
Lorsque le contenu de l'élément est vide et que la balise ouvrante et la balise fermante sont
contractées en une seule balise, celle-ci peut contenir des attributs comme la balise
ouvrante.
- Élément racine
Tout le corps du document doit être compris dans le contenu d'un unique élément appelé
élément racine. Le nom de cet élément racine est donné par la déclaration de type de
8
document si celle-ci est présente. L'élément bibliographie est l'élément racine de
l'exemple donné au début du chapitre.
- Commentaires
Les commentaires sont délimités par les chaînes de caractères '<!--' et '-->' comme
en HTML. Ils ne peuvent pas contenir la chaîne '--' formée de deux tirets '-' et ils ne
peuvent donc pas être imbriqués. Ils peuvent être présents dans le prologue et en particulier
dans la DTD. Ils peuvent aussi se situer dans le contenu de n'importe quel élément et après
l'élément racine. Un exemple de document XML avec des commentaires partout où ils
peuvent apparaître est donné ci-dessous.
<carnet>
<personne>…
</personne>
<personne>…
</personne>
</carnet>
S’il fallait supprimer les éléments personne au profit d’attributs, il faudrait utiliser une
convention de nommage complexe des attributs (avec une numérotation pour chaque
personne…) ce qui ferait perdre tout intérêt à XML qui sert justement à structurer des
données.
On peut définir cependant quelques règles simples pour déterminer s’il est préférable
d’utiliser un attribut ou un élément. Lorsqu’une valeur est de taille modeste, a peu de
chance d’évoluer vers une structure plus complexe, et n’est pas répétée, alors l’attribut
peut tout à fait convenir. Dans tous les autres cas, l’élément reste incontournable. Si vous
avez un doute entre un attribut et un élément, alors choisissez toujours l’élément qui est
le plus ouvert et garantira le plus facilement une évolution.
9
Les noeuds textes
Dans un document XML, ce qui est appelé donnée est le texte qui est associé à l’attribut,
c’est-à-dire sa valeur, ou à l’élément, c’est-à-dire son contenu. Les données constituent le
coeur du document, et tout le reste, le formalisme, ne sert qu’à séparer et classer ces
données.
Celles-ci sont dites terminales dans l’arborescence XML, dans la mesure où il ne peut
y avoir de structuration supplémentaire. Dans le vocabulaire propre à DOM (Document
Object Model), que nous aborderons dans un autre chapitre, la donnée apparaît comme un
noeud texte. Elle est bien entendu liée au prologue puisque l’encodage sert à désigner le jeu
de caractères utilisé dans votre document.
Dans le premier exemple XML que nous avons donné, le texte XML est une donnée liée à
l’attribut titre de l’élément cours. Introduction… est une donnée liée à l’élément plan.
Comme certains caractères sont réservés à la syntaxe XML, il faut être vigilant lors de
l’écriture des données.
Exemple :
<calcul>
if ( a<b et b>c) ...
</calcul>
Dans cet exemple, on voit bien que <b et b> n’est pas une balise mais fait partie des données
liées à l’élément calcul. Ce que nous comprenons facilement n’est pas sans ambiguïté pour
un parseur qui identifiera une balise de syntaxe incorrecte.
Pour résoudre ce problème, nous disposons d’entités prédéfinies. L’entité en elle-même
peut être perçue comme un raccourci vers une autre valeur, ce qui a l’avantage de faciliter la
maintenance (changement de valeur avec répercussions) et de masquer les conflits
syntaxiques.
Voici la liste des entités prédéfinies :
• < équivalent de < (less than) ;
• > équivalent de > (greater than) ;
• & équivalent de & (ampersand) ;
10
Ces règles de syntaxe sont à respecter impérativement pour qu’un document XML soit bien
formé.
• Le nom d’un élément ne peut commencer par un chiffre.
• Si le nom d’un élément est composé d’un seul caractère il doit être dans la plage [a-zA-Z]
(c’est-à-dire une lettre minuscule ou majuscule sans accent) ou _ ou :.
• Avec au moins 2 caractères, le nom d’un élément peut contenir _, -, . et : plus les
caractères alphanumériques (attention, le caractère : est réservé à un usage avec les espaces
de nom que nous aborderons par la suite).
• Tous les éléments ouverts doivent être fermés.
• Un élément parent est toujours fermé après la fermeture des éléments fils. Voici un
contre-exemple où l’élément fils b est incorrectement fermé après la fermeture de son
élément parent a : <a><b></a></b>.
Pour connaître plus précisément les caractères autorisés, vous pouvez vous reporter à la
grammaire XML du W3C disponible à l’adresse [Link]
20060816/#sec-well-formed.
11
</math>
Très brièvement, mo désigne un opérateur, mrow une expression, mi et mn
respectivement des opérandes variable (par exemple x) et nombre.
Ici nous avons décrit l’expression : x^2+4x+4.
Le format VoiceXML
VoiceXML est un standard pour décrire des choix (processus de questions/réponses) liés à
des répondeurs vocaux ([Link]
<vxml version="2.0">
<menu>
<prompt>Faire un choix :<enumerate/></prompt>
<choice next="[Link]
</choice>
<choice next="[Link]
</choice>
<noinput>Merci de faire un choix <enumerate/></noinput>
</menu>
</vxml>
Très brièvement, menu représente une liste de choix, prompt est une question, choice une
réponse possible et noinput la phrase produite si aucun choix n’est réalisé ; le menu est
rappelé avec enumerate.
12
Chapitre 2 : VALIDATION d’un document XML
INTRODUCTION :
Nous avons vu comment il était possible d’écrire du XML en respectant ses règles de syntaxe et
d’obtenir ainsi un document XML bien formé. Dans un document XML nous devons parfois spécifier
des contraintes plus précises et propres à notre langage XML. Cela va prendre ici la forme d’une
DTD( définition de type de document) .
On dira alors qu’ en plus d’être bien formée, le document est valide par rapport à une certaine DTD.
Cette spécification d’une grammaire pour un langage et la possibilité de tester automatiquement son
respect par un document donné, présentent les avantages suivants :
NB : A titre de rappel une DTD n’est pas obligatoire pour document XML.
Une DTD peut être stocké dans deux endroits différents. Elle peut être incorporé au document
XML et elle est donc dite INTERNE ou bien être un fichier a part; là on parle DTD Externe.
La déclaration d’une dtd interne arrive dans l’entête du document XML on trouve d’abord le mot clé
"DOCTYPE" suivi de l'élément servant de racine au document et enfin, la DTD elle-même entre
crochets
<!DOCTYPE palette [
]>
<palette>
</palette>
13
Lorsque la DTD est externe, celle-ci est contenue dans un autre fichier dont l'extension est
généralement .dtd.
Le document XML se contente alors de donner l'adresse de sa DTD pour que les logiciels puissent y
accéder.
L'adresse de la DTD peut être donnée explicitement par une URL ou par un FPI (Formal Public
Indentifier).
Les FPI sont des noms symboliques donnés aux documents. Ils sont utilisés avec des catalogues qui
établissent les correspondances entre ces noms symboliques et les adresses réelles des documents.
Il est possible de mélanger les deux notations pour avoir une partie de la DTD dans un fichier séparé,
et une autre partie embarqué dans le document XML.
]>
<palette>
</palette>
1 Généralités:
Le "nom" est le nom de l'élément et le type d'élément est le type auquel il est associé. Un élément peut
être du type texte, vide, en séquence ou choix d'éléments. Dans ces deux derniers cas, on indique la
liste d'éléments enfant.
14
2. Elément Texte :
3. Elément Vide : Un vide est comme son nom l'indique, un élément qui n'a aucun contenu.
Lors de la déclaration de séquences, ou de choix d'éléments, à chaque élément enfant peut être attribué
une indication d'occurrence.
Ex
L'élément 1(elt1); ne comprend aucune indication d'occurrence. Il doit donc apparaitre une seule et
unique fois dans L'élément 0(elt0).
L'élément 2? (elt2?); a pour indication "?", cela signifie que l'élément doit apparaitre au maximum
une fois (il peut ne pas apparaitre du tout).
L'élément 3+ (elt3+); signifie que l’élément doit apparaitre au moins une fois.
L'élément 4*(elt4*) i.e l’élément peut apparaitre autant de fois que l'auteur le désire, voir pas du tout.
5. Séquence D'éléments
Une séquence d'éléments est une liste ordonnée d'éléments, qui doivent apparaitre en tant qu'éléments
enfants de l'élément que l'on est en train de définir.
Cette liste est composée d’éléments séparés par des virgules, et elle est placée entre parenthèses.
e.g.
<!ELEMENT infoindividu(nom,prenom,sexe,sp)>
<infoindividu>
<nom>Kacmany</nom>
15
<prenom>Herve</prenom>
<sexe>masculin</sexe>
<SP> 70</SP>
</infoindividu>
<infoindividu>
<prenom>Herve</prenom>
<nom>Kacmany</nom>
<sexe>masculin</sexe>
<SP> 70</SP>
</infoindividu>
6. Choix D'éléments
Un choix d'élément donne le choix dans une liste de plusieurs éléments possible.
L'utilisation précise dépend des indicateurs d'occurrence. Cette liste est composé d'éléments séparé par
le caractère "|".
EX
<!ELEMENT infoindividu(nom|prenom)>
<infoindividu>
<nom> Kacmany</nom>
</infoindividu>
7. Eléments Quelconque
L'élément quelconque est un élément fourre-tout dans une DTD. Il peut contenir tout autre élément
défini dans la DTD aussi bien qu'être vide ou contenir du texte.
Les éléments enfant éventuelle peuvent apparaitre dans n'importe quel ordre et en quantités non
définie.
16
<!ELEMENT elt ANY>
Un élément à contenu mixte peut contenir aussi bien du texte que des éléments enfant. Il se
présente comme une liste de choix avec des indicateurs d'occurrences bien choisi.
Ex
<Citation> l'argent fait le bonheur <auteur> Nguetchueng</auteur> datant de février 2008 </citation>
<!ELEMENT N°CNI(#PCDATA)>
<!ELEMENT dateetablissement(#PCDATA)>
<!ELEMENT nom(#PCDATA)>
<!ELEMENT prenom(#PCDATA)>
<!ELEMENT sexe(#PCDATA)>
<!ELEMENT SP(#PCDATA)>
La syntaxe des DTD utilise cette fois ATTLIST suivi du nom de l’élément concerné, suivi
des attributs, pour chacun de ces attributs on trouvera son nom, son type, et son caractère optionnel ou
non. Une déclaration d’attribut typique aura la formule suivante :
17
Dans ce cas, L’élément identité possède 4 attributs : prénom, nom, surnom et nationalité.
Les deux premiers attributs (prénom et nom) sont obligatoire (REQUIRED). Son absence déclenche
une erreur du vérificateur syntaxique sur le fichier XML. Le troisième attribut surnom est optionnel
(IMPLIED) pas obligatoire. Le dernier quant à lui attribue une valeur par défaut pour l’attribut
nationalité. Ainsi, s’il n’est pas spécifié, l’attribut par défaut prendra la valeur par défaut
Camerounaise. Il est à noter également la possibilité pour un attribut d’être fixe. I.E. prendre
systématiquement une valeur (FIXED).
1- CDATA : C’est le type général qui permet de saisir un texte quelconque pour un attribut de ce type.
Il est même possible d’utiliser ici des caractères habituels réservé à XML <, >.
2- Le NMTOKEN : Il s’agit ici d’un nom XML sans restrictions sur le premier caractère ici qui peut
être un chiffre. Une contrainte essentielle est donc qu’un attribut de ce type ne contiendra pas
d’espace.
4- ENUMERATION : Dans ce cas, l’attribut ne peut prendre qu’un nombre finit de valeurs. Et on la
donne la liste exhaustive, ces valeurs séparé par des traits verticaux Exemple :
< !ATTLIST date jour (lundi| Mardi| Mercredi|Jeudi| Vendredi|Samedi| Dimanche) #REQUIRED
5- ID : Il doit s’agir d’un nom XML qui identifie de manière unique l’élément autrement dit, une
valeur qui apparait dans un tel attribut n’apparait pas une seconde fois dans le même document. Cette
notion est comparable à une clé primaire mais il faut garder en esprit qu’un type ID ne peut pas être un
nombre. Ex. < !ATTLIST diplôme intitulé CDATA #REQUIRED code ID#REQUIRED>
6- IDREF : Un attribut de type IDREF dois contenir une valeur utilisé comme type ID ailleurs dans
le document.
Les déclarations d’entité permettent de disposer de l’équivalant des raccourcis claviers et des
caractères à priori non accessible dans le jeu de caractères associé.
18
Elles servent à définir des symboles qui sont utilisé ailleurs que dans les DTD. Ce sont en
quelques sortes des raccourcis d’écriture. Ex.
Ce sont des symboles pouvant être définie dans une DTD et utilisé dans un document XML
comme raccourci d’écriture. La définition entière du symbole est entièrement incluse dans la DTD.
Ex.
Si le code associé à une entité devient très important, il peut être intéressant de le déclarer
dans un fichier appart. Ex .
4- Entités prédéfinies
Il existe des entités prédéfinies permettant d'inclure les caractères spéciaux '<', '>', '&', ''' et '"' dans
les contenus d'éléments et dans les valeurs d'attributs. Ces entités sont indispensables car ces caractères spéciaux
ne peuvent pas apparaître directement dans le contenu du document. Ces entités sont les suivantes.
Entité Caractère
< <
> >
& &
" "
' '
Tableau 3.1. Entités prédéfinies
B- XML SCHEMA :
19
Dans un premier temps, un fichier XML si on voulait le standardiser, en utilisant un vrai langage générale
de description devrai dépendre d’une DTD. Mais ce format de description, hérité du SGML souffre de
nombreuses déficiences :
Conçu pour pallier à déficiences précitées des DTD, XML SCHEMA propose en plus des fonctionnalités fourni
par les DTD des nouveautés :
typage des données est introduit, ce qui permet la gestion des Booléens, les entiers des intervalles de
temps
Les indicateurs des éléments peuvent être tout nombre négatif.
La notion d’héritage : Les éléments peuvent hériter d’un contenu et des attributs d’un autre élément.
Comme tout document XML, Un schéma XML commence par un prologue et a un élément racine.
</xsd :schema>
L’élément racine est le xsd :schema ayant pour attribut le xmlms :xsd qui fait référence à l’espace de noms
utilisé pour l’écriture du fichier.
Remarque :
Tous les éléments d’un schéma doit commencer par le préfixe xsd :
B .2 : Déclaration d’Eléments.
où element et type sont respectivement le nom et le type de l'élément. Ce type peut être un des types
prédéfinis comme xsd:string ou xsd:integer ou encore un type défini dans le schéma.
EX
< ? xml version= " 1.0 " encoding= " ISO-8859-1 " ?>
20
</xsd:element>
</xsd:schema>
Le schéma précédent déclare deux éléments; un élément telephone et un élément prenom. Chaque
élément est typé, donc doit respecter un certain format de données. L’élément telephone a ainsi un type qui est
type numéro, qui est un type complexe, définie par l’utilisateur. L’élément prenom est du type xsd :string qui est
un type simple prédéfini de XML schéma.
Remarque :
Lorsque le type est simple, il est possible de donner une valeur par défaut ou une valeur fixe à l'élément comme
dans les deux exemples suivants. Il faut pour cela donné des valeurs aux attributs default ou fixed de
l'élément xsd:element.
Les éléments pouvant contenir des éléments enfant ou possédant des attributs sont dit de type complexe alors
qu’un élément n’en contenant pas sont dit de type simple.
b) autre déclaration
Lors de la déclaration d'un élément, il est possible de décrire explicitement le type. La déclaration du type est
alors le contenu de l'élément xsd:element. Le type est alors local et sa déclaration prend alors une des deux
formes suivantes où element est le nom de l'élément déclaré.
<xsd:element name="element">
<xsd:simpleType>
...
</xsd:simpleType>
</xsd:element>
<xsd:element name="element">
<xsd:complexType>
...
</xsd:complexType>
</xsd:element>
A la différence des éléments, les attributs sont des types simple c'est-à-dire ne peut contenir d’autres
éléments ou attributs. De plus, les déclarations d’attributs doivent être placées après les définitions des types
complexes.
Exemple :
< xsd :attribute name = " langue" type= "xsd :string "/>
Nous pouvons comme dans les DTD ajouter d’autres indicateurs à l’aide des trois attributs optionnel suivants ;
« use, default, fixed ».
21
<xsd:attribute name =”langue” type=”xsd:string” use=”optional” default = “français” />
XML:schema permet de spécifier des types de données bien plus fine que le langage DTD. Il distingue
notamment deux types : Les types Simple et les types Complexe.
Les types de données simples ne peuvent contenir ni attribut, ni élément enfant. Il en existe de
nombreux prédéfinis, mais il est également possible d’en dériver des nouveaux.
a- Types Prédéfinie :
Il existe de nombreux types prédéfinie dans la bibliothèque de xml :schema. On peut citer quelques-
uns :
--Decimal, integer, long, negativeinteger, int, positiveinteger, byte, date, time, datetime, gyear, gday,
…, ID, IDREF, NMTOKEN, ENTITY, …
Xml schema possède 3 types de listes chaînées. Il est également possible de créer une liste
personnalisée par dérivation des types existant.
Ex
</xsd:simpleType>
<telephone> 74 77 14 00 </telephone>
On peut désirer par exemple que le type autorisé soit un nombre, soit une chaîne de caractères. Il est
possible de le faire à l’aide d’une déclaration d’union.
Ex
</xsd:SimpleType>
22
<adresse> 99 02 92 73 </adresse>
Elle consiste à ajouter des contraintes à un type de base. On distingue différents types de contraintes
qu’on appelle facettes et elles sont différentes du type qui subit la restriction.
Exemple1 :
</xsd:restriction>
</xsd:simpleType>.
<xsd:length value=”10”/>
</xsd :simpleType>
<xsd:minlength value=”6”/>
<xsd:maxlength value=”20”/>
</xsd :simpleType
23
<xsd :simpleType name= " typetemperature ">
</xsd :simpleType>
Elle permet de spécifier quels sont les caractères autorisé à l’aide de la balise <xsd :pattern>
Example :
</xsd :simpleType>
Dans cet exemple, et + signifie que l’on peut mettre n’importe quel caractère au moins une fois, et qu’entre les
deux chaines dois impérativement apparaître le caractère « @ ». il existe bien d’autres types de restriction
dans le site de :
[Link]
2- Types Complexes.
Un élément de type simple ne peut contenir de sous éléments. Il est nécessaire de déclarer les types
complexes, les éléments ayant des enfants ou des attributs, et on pourra déclarer des séquences d’éléments,
des types de choix, et des contraintes d’occurrence.
24
Exemple : élément : photo ayant un attribut ; source
<xsd:ComplexType>
</xsd:complexType>
</xsd :element>
Exemple :
<xsd:ComplexType>
<xsd:simpleContent>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd :element>
« SimpleContent » c’est pour préciser que l’élément ne possède pas d’élément enfant.
C- Contenu Complexe.
Il s’agit à nouveau d’utiliser <xsd :complextype> puis de lister les sous éléments autorisé au sein de
l’une de ces balises. Dans la balise <xsd :sequence> les sous éléments doivent apparaître dans l’ordre quand on
use plus tôt <xsd :all >, les sous éléments doivent tous apparaître mais dans un ordre quelconque
<xsd :choice> : Seulement un des sous éléments dois apparaître au choix.
Ex.
<xsd :complexType>
<xsd :sequence>
<xsd :element name= "titre " monOccurs= " 1 " maxOccurs= " 1 " type ="xsd :string">
25
<xsd :element name= "photo " minOccurs= "0 " maxOccurs= "1 " type= "xsd :string">
<xsd :element name= "url " minOccurs= "1 " maxOccurs= "unbounded " type="xsd :string" >
</xsd :sequence>
d- Contenu Mixte :
On définit pour cela un type complexe en précisant un attribut «mixed :» celui-ci indiquant que du texte
peut se glisser entre tous les sous éléments autorisé.
Xml schema
</ xsd:choice>
</xsd:complexeType>
</ xsd:element>
Nous n’allons pas ici entrer dans les détails de la notion d’espaces de noms mais simplement apprendre
à valider un document XML d’après un schéma XML. Dans le cas d’une référence locale, correspondant à une
DTD du type externe (ou system), on fait référence au schéma dans le document XML en utilisant l’attribut
noNamespaceSchemaLocation
26
CHAPITRE 3 :Le langage de requête
XPATH
Introduction
Présentation
♦ Toutes les applications ayant besoin de repérer un fragment de document XML peuvent
utiliser ce langage.
♦ Les feuilles de style XSL, les pointers XPOINTER et les liens XLINK utilisent de manière
intensive les expressions XPATH.
♦ XPATH est un premier pas vers un langage d'interrogation d'une base de données XML
(XQuery).
27
expr1 + expr2 une opération (+, -, mod, div)
expr1 = expr2 un test d'égalité (=, !=)
expr1 > expr2 une comparaison (<, <=, >, >=)
expr1 or expr2 ou expr1 and expr2
(expression) une parenthèse
chemin un chemin
Les chemins
L'ensemble initial est soit le noeud courant (forme relative) soit la racine (forme absolue).
Exemple :
/stock/produit/comment
{ / } --> stock -->
{ /stock } --> produit -->
{ /stock/produit[1], /stock/produit[2] } --> comment -->
{ /stock/produit[1]/comment }
child
les fils du noeud courant (c'est l'axe par défaut). Ces deux expressions sont identiques :
produit/child::nom
produit/nom
self
28
le noeud courant,
/stock/produit[ cond1 ]/self::produit[ cond2 ]
/stock/produit/self::prix résultat vide
descendant
les descendants du noeud courant
/stock/descendant::prix
descendant-or-self
les descendants du noeud courant plus lui-même.
parent
le noeud parent du noeud courant (si il existe),
/stock/produit/comment/parent::produit/prix
ancestor
les ascendants du noeud courant
/stock/produit/comment/ancestor::stock/produit
ancestor-or-self
que dire ?
following-sibling
les noeuds frères placés après le noeud courant,
preceding-sibling
les noeuds frères placés avant le noeud courant,
following
les noeuds placés après dans le document,
preceding
29
les noeuds placés avant dans le document,
attribute
les noeuds de type attribut du noeud courant,
/stock/produit/prix/attribute::monnaie
namespace
les noeuds de type espace de nom du noeud courant,
III-Les filtres
Filtrer les noeuds nommés
identificateur
les noeuds de l'axe qui portent ce nom.
/stock/produit/prix/attribute::monnaie
*
les noeuds de l'axe qui ont un nom (attribut ou élément)
/stock/*/prix/attribute::*
text()
tous les noeuds de type texte de l'axe.
/stock/produit/*/text()
processing-instructions()
tous les noeuds de type instruction de traitement de l'axe,
node()
tous les noeuds de l'axe sauf la racine,
/stock/produit/prix/node()
Chaîne de caractères :
Booléen :
true() ou false()
boolean(expression) renvoie vrai ssi l'argument est
o le booléen vrai
o un nombre différent de zéro
o la chaîne de longueur supérieure à zéro
o un ensemble de noeuds non vide
boolean(10) = true
boolean(0) = false
boolean('hello') = true
boolean('') = false
boolean(true()) = true
boolean(false()) = false
boolean(/stock/produit) = true
boolean(/stock/comment) = false
Nombre réel :
31
100 ou 234.56
number( expression )
number(10) = 10
number('10.12') = 10.12
number(' 10.120 ') = 10.12
number(' 10x ') = NaN (not a number)
number(true()) = 0
number(false()) = 1
number(/stock/*/prix) = 50 (le premier)
number(/stock/prix) = NaN
V- Les conditions
Rappel : les sélecteurs de noeuds sont de la forme :
Condition d'existence
/stock/produit[ prix/attribute::monnaie ]
/stock/produit[ prix[ attribute::monnaie ] ]
Ces expressions sélectionnent les noeuds produit à condition qu'un prix existe avec l'attribut
monnaie précisé.
Un exemple étrange :
/stock/produit[ /stock/*/prix ]
Condition de position
numéro
vraie ssi le noeud courant a cette position dans le contexte courant.
produit[ 2 ][ comment ]
produit[ comment ][ 2 ]
La première expression sélectionne les noeuds produit en deuxième position si il
possède un élément fils comment, la seconde sélectionne le deuxième noeud produit
qui possède un élément fil comment.
32
Les conditions logiques
+, -, mod, div,
opérations utilisables sur les nombres (conversion automatique).
produit[(prix div 10) = (prix mod 10)]
sum( noeuds )
renvoie la somme des noeuds après les avoir transformés en nombre.
count( noeuds )
renvoie le nombre de noeuds.
floor( nombre )
arrondi par le bas.
ceiling( nombre )
arrondi par le haut.
round( nombre )
arrondi par le plus proche.
true() et false()
constantes
not( boolean )
vraie ssi le paramètre est faux.
33
produit[not(prix != 100)]
tous les prix sont égaux à 100.
last()
vraie ssi le noeud est le dernier du contexte courant.
position()
renvoie la position dans le contexte du noeud courant.
local-name( noeud )
renvoie la partie locale de l'étiquette d'un noeud.
namespace-uri( noeud )
renvoie la partie espace de nom de l'étiquette d'un noeud.
name( noeud )
renvoie l'étiquette d'un noeud.
id( chaines )
renvoie les noeuds identifiés par au moins une des étiquettes,
id('CD')/prix
id('CD Voiture SX2500 CD')/prix
id( /reference/attribute::ref )/prix
string( objet )
renvoie une version chaîne du paramètre.
concat( chaîne1, ..., chaîneN )
concaténation de chaînes.
string-length( chaîne )
renvoie la longueur d'une chaîne.
normalize-space( chaîne )
renvoie une version normalisée (suppression des blancs au début et à la fin et
remplacement de toute suite de blancs par un seul).
normalize-space(' AB CD E ') = 'AB CD E'
les blancs comprennent l'espace, le retour à la ligne (codes 10 et 13) et la tabulation
(code 9).
translate( ch1, ch2, ch3 )
renvoie une copie de ch1 dans laquelle les caractères présents dans ch2 sont remplacés
par les caractères de même position dans ch3.
translate('ABCD', 'AC', 'ac') = 'aBcD'
substring-before( ch1, ch2 )
renvoie la chaîne res définie par ch1 = res + ch2 + reste.
substring-after( ch1, ch2 )
renvoie la chaîne res définie par ch1 = reste + ch2 + res.
substring( chaîne, début ) et substring( chaîne, début, len )
extraction de sous-chaîne.
starts-with( ch1, ch2 )
vraie ssi ch1 débute par ch2.
contains( ch1, ch2 )
vraie ssi ch1 contient ch2.
34
Simplifications
Afin d'éviter une trop grande lourdeur, les simplifications suivantes sont autorisées :
35
CHAPITRE 4 : XSLT
Introduction : Le XSL signifie ; eXtensible Stylesheet Language ou encore langage eXtensible de feuilles de
style. Cette abréviation recouvre en fait 3 langages.
Le Xpath
XSLT -FO : pour XSLT Formating Objects. Et ça désigne un langage permettant le contrôle de la mise
en page finale de la transformation.
Toute transformation XLST est donc d'abord un fichier XML auquel on donne généralement l'extension
XSL
Il contient au minimum:
<?xml version="1.0"?>
.....
</xsl:stylesheet>
Le premier besoin est de pouvoir récupérer des valeurs dans le document XML d'origine on utilise
Xpath.
1) L'instruction value-of
Dans sa forme la plus simple et la plus utilisée, l'élément value Of est associé à son attribut "select" qui
lui contient une requête xpath désignant une désignant une valeur(le contenu d'un élément textuel d'un attribut ou
d'un résultat de calcul.
<xsl:value-of select="nom"/>
<xsl:value-of select="@date"/>
<xsl:value-of select="."/>
<xsl:value-of select="count(/persones/personne)"/>
L'appel à l'instruction value-of provoque la sortie de la valeur calculée dans le document final.
2- Les Variables
Un autre besoin est de récupérer une valeur ou des nœuds et simplement de les stocker avant de la
traiter, pour cela on définit la variable par: xsl:variable à qui on associe deux attributs: On associe l'attribut
"name" pour nommer la variable et l'attribut "select" contenant une requête Xpath
36
Une fois la variable définie on peut l'utiliser typiquement grâce à une requête xpath en utilisant son nom
avec l'insigne Dollar
exemple:
3- Copy, Copy-of
L'expression Copy-of reproduit un ensemble de nœud récupéré par un select avec la sous arborescence
de chacun. Et l'instruction copy ne copie que le nœud courant sans son contenu et sans ses fils
<xsl:copy-of select="*"/>
<xsl:copy-of select="diplome"/>
<xsl:copy> coucou</xsl:copy>
On utilise des modèles pour décrire la transformation portant sur un certain type de nœud. Elle est
présentée par l'élément <xsl:template>
cet élément contient le code Xml à produire pour créer le nouveau document. On y trouve donc des
balises du nouveau format mais aussi des instructions xslt comme celle déja vue précédemment. On peut
éventuellement utiliser des appels dans d'autres modèles exactement comme les fonctions et les procédures.
Dans l'utilisation la plus courante l'élément <xsl:template> est muni d'un attribut match, contenant une
requête Xpath. Les nœuds concernés par la transformation sont ceux qui vérifies cette requête.
exemple:
<xsl:template match="personne">
</xsl:template>
Lorsque l'on décrit une règle de transformation, il faut garder à l'esprit que les requêtes Xpath sont
évaluées par rapport au nœud courant. Dans l'exemple suivant, nom et année sont respectivement un sous
élément et un attribut diplome que l'on est en train de transformer.
<xsl:template match="diplome">
<h2>
<xsl:value-of select="nom"/>
<h2>
<p>
obtenu en <xsl:value-of="@année"/>
37
</p>
</xsl:template>
2) Apply-templates.
L’instruction apply-template permet de faire des appels dans des model Template.
Enfin, les appels se font à l'aide de l'instruction apply-templates et d'un attribut select contenant une
requête XPath : celle-ci sélectionne des nœuds pour lesquels on va chercher des règles de transformation à
activer. Ci-dessous, une feuille XSLT complète, qui commence par traiter la racine.
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="mesdiplomes" />
</body>
</html>
</xsl:template>
<xsl:template match="mesdiplomes">
<h1>Mon cursus</h1>
<xsl:apply-templates select="diplome" />
</xsl:template>
<xsl:template match="diplome">
<h2>
<xsl:value-of select="nom" />
</h2>
<p>
Obtenu en <xsl:value-of select="@année" />
</p>
</xsl:template>
</xsl:stylesheet>
Précisons que l'attribut select de apply-templates n'est pas obligatoire, il peut être omis. Dans ce cas, on
va chercher à appliquer les règles de transformation à chacun des noeuds fils (ce qui revient à poser
select="node()" par défaut). Cela est particulièrement intéressant dans le cas d'un contenu mixte :
<xsl:template match="paragraph">
<p>
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="important">
<em><xsl:value-of select="." /></em>
</xsl:template>
Lors de la transformation d'un paragraphe, les noeuds texte seront recopiés à l'identique, tandis que les éléments
important seront traités par la seconde règle.
38
Terminons avec des utilisations des instructions copy-of et copy. L'exemple suivant remplace les éléments
paragraph en éléments p tandis que le contenu, probablement mixte (texte et balises), est recopié à l'identique
:
<xsl:template match="paragraph">
<p>
<xsl:copy-of select="*" />
</p>
</xsl:template>
La règle ci-dessous permet de récupérer l'ensemble d'un document XML en ajoutant un attribut à chacune des
balises ouvertes :
<xsl:template match="*|/">
<xsl:copy>
<xsl:attribute name="lang">fr</xsl:attribute>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
1) <xsl :for-each>
Il permet de créer une boucle dans la quel sont appliqué des transformations. Son utilisation est. de la forme :
<xsl :for-each>
</xsl :for-each>.
Ex
</li> </xsl:for-each>
</ul>
2) <xsl :sort>
C’est un élément qui permet d’effectuer un tri sur un jeu de nœuds. Il doit être placé soit dans un élément
<xsl :for-each>, soit dans un élément <xsl :apply-template>. Ex
<xsl :sort select= " nœud " order= " ascending|descending "
Data-type correspond au type de données, ordre correspond à l’ordre du tri et case-order indique si le tri a lieu
sur les majuscules ou les minuscules en premier.
Ex
<ul>
39
<xsl:sort select=”auteur” order=”descending”/>
<li>
<xsl:value-of select=”auteur”/>
<xsl:value-of select=”titre”/>
</li>
</xsl:for-each>
</ul>
1) <xsl :if> :
Il est possible de tester la présence d’in attribut, ou d’un élément avec le <xsl :if>. Son usage
est de la forme suivante : <xsl :if test= « condition »> action </xsl :if>. le test prends la valeur 1 ou 0
suivant le resultat de la condition. Ex. <xsl :if test= "@langue= "français " "> ce livre est en français
</xsl :if>
2) <xsl :choose>
Cet élément permet de définir une liste de choix et d’affecter à chaque choix une
transformation différente. Chaque choix est définie par un élément <xsl :when> et un traitement par
défaut peut être spécifié par l’élément <xsl :otherwise>.
<ul>
<li>
<xsl:choose />
</xsl :choose>
</li>
</xsl:for-each>
</ul>
V- Complément
L’élément <xsl :template> peut être appelé indépendamment d’une sélection d’un nœud. Pour cela, il faut
renseigner l’attribut nœud et l’appeler et l’utiliser.
40
2) Les éléments <xsl :param> et <xsl :with-param>
Ils permettent de passer des valeurs aux modèles. Un paramètre est crée avec un élément <xsl :param> et est
passé à un model avec <xsl :with-param>. Les deux éléments ont deux attributs. L’attribut name, qui est
obligatoire et donne un nom aux paramètres. Et l’attribut select qui est facultatif, c’est une expression Xpath,
permettant de donner une valeur par défaut aux paramètres. Ex On veut calculer une expression polynomiale.
Pour cela, créons un modele pour ce calcul. f(x)=2x²-5x+3
<xsl:value-of select=”2*$varriablex*$variablex+(-5)*$variablex+3”>
</xsl:template>
Il suffit alors de l’appeler en lui passant différentes valeurs pour évaluer l’expression x
<xsl:with-param name=”variablex”select=”2”/>
</xsl:call-template>
3 <xsl :output>
: c’est un élément vide à placer comme premier enfant du <xsl :stylesheet> et qui permet de spécifier les options
concernant l’arbre de sortie. L’utilisation de cet élément est de la forme :
Example:
Cet exemple permet d’indiquer que le fichier de sortie sera au format html4.01, conforme a la DTD public de
html et que le jeu de caractères utilisé est iso 8859-1.
<xsl :element name= "nomelement" use-attribute-sets= "Jeux des attributs"> </xsl :element>
<xsl :attribute name= "nomdel’attribut "> valeur < /xsl :attribute >
Il est parfois nécessaire de scinder une feuille de style en plusieurs feuilles différentes. Pour cela, il suffit de
spécifier dans la feuille de style maitresse un appel à une autre feuille de style soit par l’élément <xsl :include>
ou <xsl :import> exemple :
41
Chapitre 5 XQUERY
Le rôle de XQuery XML est similaire au rôle de la base de données dans SQL.
XQuery est conçu pour interroger les données XML - ne se limite pas aux documents XML,
des formulaires XML peuvent également inclure toute présentation des données, y compris les
bases de données.
HTML / XHTML
XML / espace de noms XML
XPath
"[Link]":
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
42
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
XQuery utilise des fonctions pour extraire des données à partir du document XML.
doc("[Link]")
expression de chemin
XQuery utilise des expressions de chemin pour naviguer dans des documents XML à travers
les éléments.
L'expression de chemin d'accès suivant pour "[Link]" sélectionner tous les fichiers dans
l'élément de titre:
doc("[Link]") /bookstore/book/title
43
(/ Librairie select élément de librairie, / livre Sélectionne tous les éléments du livre sous
l'élément de librairie, et / titre Sélectionne tous les éléments de titre sous chaque élément de
livre)
prédicat
XQuery utilise prédicats pour définir un document XML à partir des données extraites.
Le prédicat suivant est utilisé pour sélectionner tous les éléments du livre sous l'élément de
librairie, et la valeur de l'élément de livre sélectionné élément de prix de moins de 30 doit être
inférieure à:
doc("[Link]")/bookstore/book [price<30]
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
doc("[Link]")/bookstore/book[price>30]/title
Cette expression peut être sélectionnée au-dessus de tous les éléments de titre sous les
éléments du livre sous l'élément de la librairie, et la valeur de l'élément de prix qui doit être
supérieur à 30.
44
FLWOR expression ci-dessous les données sélectionnées et de la voie ci-dessus est le même
que l'expression suivante:
for $x in doc("[Link]")/bookstore/book
where $x/price>30
return $x/title
sortie:
for $x in doc("[Link]")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
FLWOR est «Car, Let, Where, Order par, Return" seulement prendre acronyme.
déclarations pour tous les éléments du livre sous l'élément de librairie dans une variable
nommée $ x extraction.
où l' élément de déclarations sélectionnées élément de prix du livre des valeurs supérieures à
30.
ordre par la déclaration définit l'ordre de tri. Sera triés selon l'élément de titre.
instruction de retour précise ce qu'ils reviennent. Dans ce renvoie les éléments de titre.
45
for $x in doc("[Link]")/bookstore/book/title
order by $x
return $x
L'expression ci-dessus permet de sélectionner tous les éléments de titre des éléments du livre
sous l'élément de librairie en vertu, par ordre alphabétique et retourner les éléments de titre.
Maintenant, nous voulons utiliser les listes de table HTML toute notre bibliographie de
librairie. Nous avons ajouté <ul> et <li> balises à FLWOR expression:
<ul>
{
for $x in doc("[Link]")/bookstore/book/title
order by $x
return <li>{ $x }</li>
}
</ul>
<ul>
<li><title lang="en">Everyday Italian</title></li>
<li><title lang="en">Harry Potter</title></li>
<li><title lang="en">Learning XML</title></li>
<li><title lang="en">XQuery Kick Start</title></li>
</ul>
Maintenant, nous voulons supprimer l'élément de titre, mais seulement afficher les données
dans l'élément de titre.
<ul>
{
for $x in doc("[Link]")/bookstore/book/title
order by $x
return <li>{ data( $x ) }</li>
}
</ul>
<ul>
<li>Everyday Italian</li>
<li>Harry Potter</li>
<li>Learning XML</li>
<li>XQuery Kick Start</li>
</ul>
syntaxe XQuery
46
XQuery est sensible à la casse, les éléments de XQuery, les attributs et les variables doivent
être des noms de XML juridiques.
for $x in doc("[Link]")/bookstore/book
return if ( $x/@category="CHILDREN" )
then <child>{data($x/title)}</child>
else <adult>{data($x/title)}</adult>
Notez que les "If-Then-Else" syntaxe: parenthèses après la si expression est nécessaire. sinon
il est également nécessaire, mais en écriture seule "else ()" peut être.
<adult>Everyday Italian</adult>
<child>Harry Potter</child>
<adult>Learning XML</adult>
<adult>XQuery Kick Start</adult>
comparaison XQuery
Dans XQuery, il y a deux façons de comparer les valeurs.
Comparer les différences entre les deux procédés sont les suivants:
47
$bookstore//book/@q > 10
Si la valeur de la propriété q est supérieur à 10, l'expression ci-dessus renvoie une valeur true.
Les exemples suivants, si le retour est seulement q, et sa valeur est supérieure à 10, alors
l'expression renvoie vrai. Si plus d'une q est retournée, une erreur se produit:
$bookstore//book/@q gt 10
for $x in doc("[Link]")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
pour - (facultatif) pour chacun des éléments groupés renvoyés par l'expression dans
une variable
laissez - (facultatif)
où - (en option) fixé une condition
commande par - (en option) définir l'ordre dans les résultats
retour - les dispositions dans les résultats renvoyés contenu
pour la déclaration
déclaration pour la variable liée à chaque article retourné par l'expression. pour la déclaration
Iteration. Il peut y avoir plusieurs pour la même déclaration dans une expression de FLWOR.
Pour un certain nombre de fois dans une instruction for en boucle, vous pouvez utiliser des
mots-clés à:
for $x in (1 to 5)
return <test>{$x}</test>
Résultats:
48
<test>1</test>
<test>2</test>
<test>3</test>
<test>4</test>
<test>5</test>
for $x at $i in doc("[Link]")/bookstore/book/title
return <book>{$i}. {data($x)}</book>
Résultats:
Dans la déclaration permet également de plus d'une expression. S'il vous plaît utiliser une
virgule pour séparer chaque expression:
Résultats:
déclaration laisse
laissez déclaration peut être répartition variable complète, et d'éviter répété la même
expression. laissez déclaration ne provoque pas itération.
let $x := (1 to 5)
return <test>{$x}</test>
Résultats:
<test>1 2 3 4 5</test>
où les déclarations
où la déclaration est utilisée pour définir le résultat d'une ou plusieurs conditions (critères).
49
commande par déclaration
commande par déclaration pour trier les résultats d'un ordre prédéterminé. Ici, nous voulons
trier les résultats en fonction de la catégorie et le titre:
for $x in doc("[Link]")/bookstore/book
order by $x/@category, $x/title
return $x/title
Résultats:
déclaration de retour:
déclaration de retour précise pour renvoyer le contenu.
for $x in doc("[Link]")/bookstore/book
return $x/title
Résultats:
VI Fonctions XQuery
XQuery contient plus de 100 fonctions intégrées. Ces fonctions peuvent être utilisées pour les
valeurs de chaîne, numérique, date et comparaison du temps, le noeud et la manipulation
QName, la manipulation de la séquence, les valeurs booléennes, et ainsi de suite. Vous
pouvez également définir vos propres fonctions XQuery.
[Link]
Astuce: appeler préfixe, tel que fn :: fonction souvent par chaîne de fn (). Cependant, depuis
fn: est le préfixe par défaut de l'espace de noms, les noms de fonctions ne doivent pas utiliser
le préfixe lorsqu'il est appelé.
50