(COURS) - Apprendre XML
(COURS) - Apprendre XML
(COURS) - Apprendre XML
com
<Derf:XML easy="true">
<Derf:title part="1">
Initiation à XML
</Derf:title>
</Derf:XML>
By F.REMISE
Microsoft MVP
I NTRODUCTION
W3C : XML a été conçu pour être facile à mettre en œuvre et interopérable avec SGML et HTML.
MSDN : Le XML est le format universel de données pour le Web.
A ceux que ces affirmations laissent rêveur, je propose un voyage initiatique au cœur de XML dont
la première étape commence ici.
Beaucoup d'entre vous, bercés par le chant des sirènes, se seront aventurés dans les méandres
de XML pour en ressortir complètement démoralisés au vu des différents standards et
spécifications constituant la bête.
Je vous propose ici de refaire le voyage accompagné d'un guide composé de 10 chapitres :
XML Part 1 : Document bien formé
XML Part 2 : Document valide 1 : DTD et définition d'éléments
XML Part 3 : Document valide 2 : DTD et définition d'attributs et d'entités
XML Part 4 : Namespaces et DataIsland
XML Part 5 : Mise en forme et affichage d'un doc XML : CSS
XML Part 6 : Mise en forme et affichage d'un doc XML : DataBinding avec DSO
XML Part 7 : Mise en forme et affichage d'un doc XML : DOM XML
XML Part 8 : Mise en forme et affichage d'un doc XML : XSL/XSLT et XPath
XML Part 9 : XML Schema
XML Part 10 : Autres standards et spécifications pour XML
XML : K ESAKO ?
Autant le dire tout de suite, XML n'est pas le remplaçant de HTML; L'évolution de HTML est plutôt
à voir en XHTML. XML et HTML sont complémentaires.
XML (eXtensible Markup Language) est une spécification proposée par le W3C (World Wide Web
Consortium) en 1998. XML, tout comme HTML, est issu de SGML (Standardized Generalized
Markup Language). XML est un métalangage pouvant servir de base pour la définition d'autres
langages (SMIL utilisé en vidéo, WML utilisé pour le WAP, MathML etc...).
Certains éléments constituant cette initiation seront abordés succinctement, soit parce
qu'ils font partie d'un autre module de formation soit parce qu'ils débordent du cadre
initiatique de ce support.
XML est un format standardisé ouvert ne nécessitant aucune licence, intégralement basé
texte et qui peut être associé à n'importe quel jeu de caractères.
De plus en plus d'applications utilisent le format XML; C'est le cas de certains SGBD mais
aussi d'outils de bureautique comme Microsoft Office 2003 ou Sun Open Office. XML est
également au cœur de la nouvelle plate-forme de développement de Microsoft : .NET.
Enfin, son interopérabilité et le fait que de grands acteurs de l'informatique dont IBM,
Microsoft et Sun préconisent l'utilisation d'XML, font que XML pourrait bien être l'avenir des
systèmes GED comme l'EDI ou le B to B.
En résumé
Le format XML n'enregistre que les données textuelles et la structure des données un peu comme
un base de données. Il peut donc être particulièrement utile pour des données structurées de type :
liste de produits, carnet d'adresses, etc...
XML est un métalangage à la grammaire stricte. Cela s'exprime par le respect de la casse, la
fermeture de chaque balise ouverte, l'encadrement par des guillemets des valeurs d'attributs,
l'échappement des caractères spéciaux, les balises ne peuvent être entrelacées.
C'est un standard ouvert, basé texte, de plus en plus diffusé et complètement interopérable ce qui
le rend, de fait, idéal pour le stockage de fichiers à long terme et lui attribut un rôle important dans
la gestion électronique de document et l'échange de données informatisées.
Le prologue
Il s'agit de la ligne d'introduction d'un document XML.
Cette ligne est obligatoire pour avoir un document considéré comme "bien formé". Il est
impératif de respecter la casse de cette ligne.
Cette ligne permet donc d'indiquer la version XML utilisée, le jeu de caractères utilisé et
l'autonomie du document.
L'autonomie d'un document XML est lié à l'utilisation d'une DTD. Si il n'y a pas de DTD ou si elle
est interne, le document est autonome et la valeur de l'attribut standalone peut être définie à
yes. Si la DTD référencée est externe la valeur de cet attribut doit être définie à no. Si l'attribut
standalone est omis, c'est la valeur no qui est prise par défaut.
Les attributs encoding et standalone sont facultatifs.
L'élément racine
L'élément racine est lui aussi obligatoire. Cet élément est une balise créée par vos soins. Elle est
unique dans le document. Elle peut être comparée à la balise <body></body> d'un document
HTML. Elle encadrera le contenu de votre document XML.
L'élément racine est obligatoire tout comme le prologue. Ce sont les seuls éléments
obligatoires. N'oubliez pas que XML est sensible à la casse, par conséquent <tag> et
<Tag> n'ont pas la même signification.
Le contenu
Pour le contenu, vous pouvez choisir, là aussi, vos propres noms de balises.
Exemple 1
Dans mon exemple, ces éléments seront contenus par le nœud racine
<librairie></librairie>.
Chaque livre de ma librairie sera représenté par un élément <livre></livre>; Cet
élément encadrera les sous éléments décrivant le livre : <titre></titre> -
<auteur></auteur> - <editeur></editeur>.
Listing du document XML : ex-1.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<librairie>
<livre>
<titre>CSS 2</titre>
<auteur>Daniel GLAZMAN</auteur>
<editeur>Eyrolles</editeur>
</livre>
<livre>
<titre>Formation à... XML</titre>
<auteur>Michael J. YOUNG</auteur>
<editeur>Microsoft Press</editeur>
</livre>
<livre>
<titre>Visual Basic .Net</titre>
<auteur>Richard CLARK</auteur>
<editeur>Microsoft Press</editeur>
</livre>
<livre>
<titre>ASP.Net – To the .Point</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
</livre>
</librairie>
Ouvrez un éditeur de texte et composez ces quelques lignes. Enregistrez le fichier avec
l'extension .xml et ouvrez le dans MSIE. Vous remarquez que le fichier apparaît sous forme
d'arborescence. Si vous faites la même expérience avec Netscape ou Opera, seul le texte pur,
c'est à dire le texte encadré par les balises, s'affiche.
Pour visualisé un document XML, il vaut faut un "parser" XML (parseur en français). Un
parseur est un analyseur syntaxique. MSIE possède un parseur XML.
Vous constatez également, et cela quelque soit le navigateur, que les caractères accentués
apparaissent correctement. Ceci est dû à la déclaration concernant le jeu de caractère contenu par
le prologue : iso-8859-1 soit Europe occidentale Latin 1. Il existe d'autres jeux de caractères.
Certains caractères ayant une signification particulière dans la grammaire du XML restent
interdits : < , > , &
Pour ces caractères comme pour les caractères pouvant poser des problèmes à
l'affichage utilisez les caractères de masquages (d'échappement) soit sous forme
d'entités nommées, soit sous forme d'entités codées.
Caractères de masquage
liste non exhaustive – Pour une liste plus complète rapportez-vous à l'annexe I du support HTML
Caractère Entité nommée Entité codée
< < <
> > >
& & &
Instructions de traitement :
Les instructions de traitement permettent de fournir des informations supplémentaires sur le
document aux analyseurs syntaxiques.
Une instruction de traitement commence par <? et se termine par ?>.
La plus utilisée de ces instructions est sûrement celle constituant le prologue d'un document XML :
<?xml version="1.0"?>
L'inclusion d'une référence à une feuille de styles utilise aussi ce type d'instruction. Nous en
reparlerons le moment venu.
Section CDATA :
Cette section permet d'inclure des données textuelles, des exemples de code…, dans un
document XML sans qu'il soit nécessaire de substituer les caractères spéciaux par des caractères
de masquage.
La mise en œuvre d'une section CDATA s'écrit ainsi :
<![CDATA[
données textuelles
]]>
Fred.
I NTRODUCTION
Dans le précédent Part, vous avez appris les quelques règles régissant la conception d'un
document XML bien formé. Je vous propose maintenant d'apprendre à définir vos balises et la
hiérarchisation de vos données XML avec une DTD et ainsi rendre votre document valide.
Document valide
Un document XML est dit "valide" s'il est "bien formé" et qu'il possède une DTD (Document Type
Definition).
L'utilisation d'une DTD est facultative mais nécessaire si l'on souhaite valider un document XML.
Pour saisir un des atouts de l'utilisation d'une DTD, imaginons que plusieurs développeurs
travaillent à l'élaboration de ma librairie sans concertation. Chacun ayant terminé sa part, on
regroupe les différents travaux. Malheureusement, certains développeurs ont ajouté un S à ma
balise <livres></livres> et d'autre l'ont nommé <œuvre></œuvre> ! Alors comment extraire
les bonnes informations dans cet imbroglio ?
Si mon équipe de développeurs avait utilisé une même DTD avec des règles définies, et vérifié la
validité de ses travaux XML avec un parser validant, il n'y aurait pas eu de malentendu et mon outil
de gestion de librairies fonctionnerait correctement.
Arrivé à ce niveau, il me paraît opportun de vous fournir les indications suivantes :
Pour vérifier la validité d'un document XML par rapport à sa DTD, il vous faut un parseur
validant. MSIE est un parseur non-validant ce qui veut dire qu'il ne vérifie pas la
conformité d'un document XML avec sa DTD.
Toutefois, il est possible de rendre MSIE validant avec l'aide d'un petit utilitaire de
Microsoft : IE Tools for Validating XML and Viewing XSLT Output. Vous trouverez cet
outil en téléchargement sur le site MSDN de Microsoft France dans la rubrique Technos
XML.
suivie par le nom que porte l'élément racine, suivi par l'instruction SYSTEM, suivie par l'URI du
fichier de la DTD encadrée par des guillemets.
<!DOCTYPE nœudracine SYSTEM "URI DTD externe">
Dans un même document XML, il est possible d'utiliser ensemble une DTD interne et une
DTD externe. Dans ce cas la déclaration DOCTYPE prend la forme suivante :
<!DOCTYPE nœudracine SYSTEM "URI DTD externe" [
instructions DTD interne
]>
La DTD externe est toujours traitée après la DTD interne.
9 Une DTD interne doit être déclarée avant l'élément racine et après le prologue; Elle est
introduite par l'instruction DOCTYPE immédiatement suivie par le nom que porte l'élément racine. La
syntaxe est la suivante :
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE nœudracine [
instructions de la DTD
]>
<nœudracine>
...
</nœudracine>
<auteur>Richard CLARK</auteur>
<editeur>Microsoft Press</editeur>
</livre>
<livre>
<titre>ASP.Net – To the .Point</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
</livre>
</librairie>
Tous les éléments d'un document XML doivent être déclarés explicitement dans une
DTD.
Les commentaires sont déclarés dans une DTD comme dans un document XML.
Déclarations utilisées
dans la syntaxe d'une DTD
Nom Description
!ATTLIST Définit les listes d'attributs
!ELEMENT Définit les types d'éléments
!ENTITY Définit les entités
!DOCTYPE Définit une DTD interne ou externe
Définit les entités non XML. Format de données ou programme utilisé
!NOTATION
pour traiter un format particulier.
Indique que l'élément défini peut avoir tout type de contenu légal.
ANY
<!ELEMENT nom_elmt ANY>
Opérateur de liaison ET. Indique que les nœuds enfants déclarés (dans
, une liste) sont tous obligatoires et dans l'ordre de leur déclaration.
<!ELEMENT nom_elmt_parent (noeud1, nœud2, noeud3)>
Opérateur de liaison OU. Indique qu'un seul des nœuds enfants déclarés
| (dans une liste) peut être utilisé. C'est au choix.
<!ELEMENT nom_elmt_parent (noeud1 | noeud2 | noeud3)>
Indique que le nœud enfant est optionnel; Il peut être utilisé 0 ou 1 fois.
Si ce caractère est placé après les parenthèses d'une liste de contenu,
?
il s'applique à tout le contenu.
<!ELEMENT nom_elmt_parent (noeud1?, noeud2, ...)>
Indique que le nœud enfant peut être utilisé une ou plusieurs fois. Si ce
caractère est placé après les parenthèses d'une liste de contenu, il
+
s'applique à tout le contenu.
<!ELEMENT nom_elmt_parent (noeud1 | noeud2 | ...)+>
Indique que le nœud enfant est optionnel. Il peut être utilisé 0, 1 ou
plusieurs fois. Si ce caractère est placé après les parenthèses d'une
*
liste de contenu, il s'applique à tout le contenu.
<!ELEMENT nom_elmt_parent (#PCDATA | nœud1 | ...)*>
Exemple 3
Pour illustrer quelques unes des spécifications de contenu présentées dans le tableau ci-dessus, je
vous propose de modifier la description des livres de ma librairie informatique :
Nous ajouterons un élément <collection></collection> qui sera optionnel.
Nous ajouterons également un élément <prix></prix>. Les prix seront classés par
catégorie (cat.1 pour les livres dont le prix est inférieur à 20€, cat.2 pour les prix compris
entre 20€ et 40€, cat.3 pour les prix entre 40€ et 60€, cat.4 pour les prix supérieurs à 60€).
Les catégories seront représentées par les sous-éléments <cat1></cat1>,
<cat2></cat2>, <cat3></cat3> et <cat4></cat4>, aucun ou un seul de ces sous-
éléments pourra apparaître, et ces sous-éléments n'auront pas de contenu.
Enfin, nous modifierons l'élément <auteur></auteur> afin que celui-ci puisse s'adapter
aux livres écrits par plusieurs auteurs.
<titre>ASP.Net</titre>
<auteur>Richard CLARK</auteur>
<editeur>Microsoft Press</editeur>
<collection>Formation à...</collection>
</livre>
<livre>
<titre>ASP.Net - To the .Point !</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
</livre>
<livre>
<titre>Construire une application XML</titre>
<auteur>Jean-Christophe BERNADAC</auteur>
<auteur>François KNAB</auteur>
<editeur>Eyrolles</editeur>
<collection>Solutions développeurs</collection>
<prix>
<cat2 />
</prix>
</livre>
<livre>
<titre>ASP.Net Professionnel</titre>
<auteur>Richard ANDERSON</auteur>
<auteur>Brian FRANCIS</auteur>
<auteur>Alex HOMER</auteur>
<auteur>Rob HOWARD</auteur>
<auteur>Dave SUSSMAN</auteur>
<auteur>Karli WATSON</auteur>
<editeur>Campus Press</editeur>
<prix>
<cat4 />
</prix>
</livre>
</librairie>
Fred.
I NTRODUCTION
Dans le Part.2 nous avons appris à définir les éléments et leur hiérarchisation dans une DTD; Mais
qu'en est-il des attributs ? C'est ce que je vous propose de découvrir dans ce nouveau Part.
Définition d'attributs
Les attributs XML ont la même fonction que les attributs HTML : préciser les caractéristiques des
éléments. On définit les attributs dans une DTD avec l'instruction <!ATTLIST
Tous les attributs utilisés doivent être déclarés explicitement dans une DTD.
Comme pour les balises XML, le développeur nomme à sa convenance les attributs tout
en respectant les mêmes contraintes.
On remarque ici qu'avant de définir le nom de l'attribut, on doit déclarer le nom de l'élément auquel
il est associé. Ensuite vient la spécification du type de l'attribut soit sa (ou ses) valeur(s). Enfin, on
précise le rôle de l'attribut avec une option.
Le type de l'attribut est obligatoire. En d'autres termes, toute déclaration d'attribut doit
impérativement posséder une valeur.
L'option est obligatoire. En d'autres termes, tout attribut déclaré doit posséder une option
précisant une valeur par défaut ou le comportement à tenir par le parser en cas d'attribut
non obligatoire.
Il existe 3 types de spécification d'attribut : le type énuméré, le type chaîne et le type prédéfini (par
mot clé). Ces spécifications sont décrites dans le tableau suivant :
Définit, pour l'attribut, une valeur par défaut. Si la valeur est omise, le parser
#FIXED
utilisera la valeur par défaut indiquée. Aucune autre valeur n'est admise.
"valdefaut"
<!ATTLIST nom_elmt nom_attrib CDATA #FIXED "val_defaut">
Indique que la valeur d'attribut est optionnelle et que le parser ne fera aucun
#IMPLIED remplacement si la valeur est omise.
<!ATTLIST nom_elmt nom_attrib (val1|val2) #IMPLIED>
Exemple 4
Pour illustrer quelques unes des possibilités de valeurs d'attributs et d'options présentées dans les
tableaux ci-dessus, je vous propose de transformer de nouveau la description des livres de ma
librairie informatique.
Nous transformons l'élément <prix></prix> en attribut, optionnel, de l'élément
<livre></livre> et ses sous-éléments <cat /> en valeurs d'attributs.
Nous ajoutons un attribut stock pour l'élément <titre></titre> avec une valeur par
défaut.
Nous ajoutons un attribut ISBN, obligatoire de type NMTOKEN, pour l'élément
<livre></livre> ainsi qu'un attribut code, obligatoire et de type identifiant unique.
Nous ajoutons aussi un attribut autrespub, optionnel de type IDREFS, pour l'élément
<auteur></auteur>; Cet attribut faisant référence aux autre publications de l'auteur.
Enfin, nous ajoutons quelques données supplémentaires dans notre document XML.
</livre>
</librairie>
9 Une entité générale interne parsée permet de remplacer une partie d'un document XML,
éléments compris. Sa forme est la suivante :
<!ENTITY nom_entité "valeur_entité">
Le nom de l'entité est choisi selon les mêmes règles que les noms d'attributs; Elle ne peut débuter
que par un caractère ou un tiret bas. La valeur de l'entité est une chaîne littérale encadrée par des
guillemets; Elle ne peut contenir ni esperluette (&) ni pourcentage (%) mais peut être constituée de
marqueurs XML ou/et de données XML.
Pour référencer l'entité, il suffit de placer celle-ci dans le corps du document XML en la faisant
débuter par une esperluette (&) et se terminer par un point virgule (;) : &nom_entité;
9 Une entité générale externe parsée est similaire à une entité générale interne parsée sauf
que la valeur de l'entité doit être une URI pointant vers le fichier de données. Sa forme est la
suivante :
<!ENTITY nom_entité SYSTEM "URI_fichierdedonnées">
Le fichier de données ne peut contenir que des éléments valides (données texte et/ou
éléments de marquages) pouvant être insérés dans un document XML.
On référence l'entité dans le document XML de la même manière que pour une entité
générale interne parsée.
9 Une entité générale externe non parsée permet d'insérer n'importe quelle type de données
dans un document XML (des données non XML). Une description du format des données doit
impérativement être déclarée dans la DTD à l'aide de la commande <!NOTATION . Sa forme est la
suivante :
Si l'entité correspond à la valeur d'un attribut (ce qui est le cas en général), il ne faut pas
oublier d'attribuer le type ENTITY ou ENTITIES à la valeur dans la déclaration de
l'attribut.
Le mot clé NDATA signifie que le fichier externe contient des données non parsées.
<librairie>
&rc;
<livre prix="cat2" ISBN="2-212-09051-X" code="DG1-0"
couverture="couvcss">
<titre stock="non">CSS 2</titre>
<auteur>Daniel GLAZMAN</auteur>
<editeur>Eyrolles</editeur>
</livre>
<livre prix="cat1" ISBN="2-84082-533-3" code="MJY1-0"
couverture="couvxml">
<titre stock="oui">XML</titre>
<auteur>Michael J. YOUNG</auteur>
<editeur>Microsoft Press</editeur>
<collection>Formation à...</collection>
</livre>
<livre ISBN="0-00000-000-0" code="GR1-1">
<titre>Construisons notre première application ASP.Net</titre>
<auteur autrespub="GR2-2 GR3-3 GR4-6 GR5-7">Grégory RENARD</auteur>
&asp-php;
</livre>
<livre prix="cat2" ISBN="2-212-09081-1" code="JCB1_FK1-0">
<titre stock="oui">Construire une application XML</titre>
<auteur>Jean-Christophe BERNADAC</auteur>
<auteur>François KNAB</auteur>
<editeur>Eyrolles</editeur>
<collection>Solutions développeurs</collection>
</livre>
<livre ISBN="0-00000-000-0" code="GR2-2">
<titre>Gestion d'un Datagrid et d'un moteur de recherches</titre>
<auteur autrespub="GR1-1 GR3-3 GR4-6 GR5-7">Grégory RENARD</auteur>
&asp-php;
</livre>
<livre prix="cat4" ISBN="2-7440-9005-0" code="RBARDK-0901">
<titre>ASP.Net Professionnel</titre>
<auteur>Richard ANDERSON</auteur>
<auteur>Brian FRANCIS</auteur>
<auteur>Alex HOMER</auteur>
<auteur>Rob HOWARD</auteur>
<auteur>Dave SUSSMAN</auteur>
<auteur>Karli WATSON</auteur>
<editeur>Campus Press</editeur>
<collection>Wrox</collection>
</livre>
<livre ISBN="0-00000-000-0" code="GR3-3">
<titre>Starter kit, réussir mon install...</titre>
<auteur autrespub="GR2-2 GR1-1 GR4-6 GR5-7">Grégory RENARD</auteur>
&asp-php;
</livre>
<livre ISBN="0-00000-000-0" code="FR1-4">
<titre>WEB.CONFIG : Configuration d'une application</titre>
<auteur autrespub="FR2-5">Frédéric REMISE</auteur>
&asp-php;
</livre>
<livre ISBN="0-00000-000-0" code="FR2-5">
<titre>Code Behind sans VS.NET : 2 méthodes d'écriture</titre>
<auteur autrespub="FR1-4">Frédéric REMISE</auteur>
&asp-php;
</livre>
<livre ISBN="0-00000-000-0" code="GR4-6">
<titre>Le formulaire et l'envoi de mail en .NET</titre>
<auteur autrespub="GR2-2 GR3-3 GR1-1 GR5-7">Grégory RENARD</auteur>
&asp-php;
</livre>
<livre ISBN="0-00000-000-0" code="GR5-7">
<titre>Gestion avancée d'un ListBox</titre>
<auteur autrespub="GR2-2 GR3-3 GR4-6 GR1-1">Grégory RENARD</auteur>
&asp-php;
</livre>
</librairie>
9 Une entité paramétrique interne parsée est déclarée dans une DTD et ne peut être
référencée qu'à l'intérieur d'une DTD. Le nom de l'entité est choisi selon les mêmes règles que les
noms d'attributs; Elle ne peut débuter que par un caractère ou un tiret bas. La valeur de l'entité est
une chaîne littérale encadrée par des guillemets; Elle ne peut contenir ni esperluette (&) ni
pourcentage (%) mais peut être constituée de marqueurs XML valides dans une DTD ou/et de
données XML valides dans une DTD. Sa forme syntaxique est la suivante :
<!ENTITY % nom_entité "valeur_entité">
Pour référencer l'entité, il suffit de placer celle-ci dans la DTD en la faisant débuter par un
pourcentage (%) et se terminer par un point virgule (;) : %nom_entité;
Une entité paramètre interne parsée peut contenir une série de marqueurs valides dans
une DTD ou contenir uniquement des données valides dans une DTD. Dans ce second
cas, elle peut être référencée dans une DTD uniquement si celle-ci est externe.
<librairie>
<livre niveau="débutant">
<titre>CSS 2</titre>
<auteur>Daniel GLAZMAN</auteur>
<editeur>Eyrolles</editeur>
</livre>
<livre>
<titre>Formation à... XML</titre>
<auteur>Michael J. YOUNG</auteur>
<editeur>Microsoft Press</editeur>
</livre>
<livre niveau="intermédiaire">
<titre>Formation à... ASP.Net</titre>
<auteur>Richard CLARK</auteur>
<editeur>Microsoft Press</editeur>
</livre>
</librairie>
Si vous vous amusez à réinsérer le contenu de la DTD externe dans le document XML et
que vous testez cette nouvelle page dans MSIE, vous remarquerez que celui-ci vous
déclare une erreur.
9 Une entité paramétrique externe parsée est similaire à une entité paramétrique interne
parsée à l'exception faite que sa valeur est une référence à un fichier externe.
Le fichier externe doit contenir une série de marqueurs valides dans une DTD.
Ce type d'entité s'apparente au principe des DTD externes mais avec l'avantage de
pouvoir en référencer plusieurs.
Pour illustrer ce type d'entité, j'ai légèrement modifié l'exemple 7. La DTD de l'exemple 7 a été
scindé en 3 parties; Les deux premières parties sont réparties dans deux fichiers de DTD distincts
et la troisième partie est décrite au sein de la DTD du document XML.
Exemple 8 :
Listing de la DTD externe 1 : ex-8a.dtd
<?xml version="1.0" encoding="iso-8859-1"?>
<!ENTITY % nivo "débutant|intermédiaire|avancé|expert">
<!ELEMENT librairie (livre+)>
<!ELEMENT livre (titre, auteur, editeur)>
<!ATTLIST livre niveau (%nivo;) 'débutant'>
Les sections IGNORE et INCLUDE ne sont valides qu'à l'intérieur d'une DTD externe.
Exemple 9 :
Listing de la DTD externe : ex-9.dtd
<?xml version="1.0" encoding="iso-8859-1"?>
Testez cet exemple et vérifiez sa validité; Refaite un test après avoir remplacé IGNORE par
INCLUDE dans la DTD. Vous comprendrez la différence !
Pour conclure ce chapitre sur les DTD, je me dois de vous indiquer que les DTD sont de
plus en plus souvent remplacées par des XSD : XML Schema Definition.
Vous trouverez une introduction aux Schemas XML sur le Part. 9 de cette Initiation à
XML.
Fred.
I NTRODUCTION
Ce nouveau Part. sera moins conséquent que les précédents. Je vais ici vous présenter et essayer
de définir deux concepts inhérents aux XML que sont les Espaces de Nom et les Ilots de Données.
Vous aurez besoin de connaître ces notions pour bien appréhender les prochains Part.
Pour utiliser un espace noms référencé, il faut préfixer les éléments et les attributs qui en
sont issus par le nom de l'espace de noms suivi de deux points ( : ).
Pour imager l'utilisation des Namespaces dans le cadre d'une définition de nouveaux langages
inhérents à un besoin métier, je vous propose l'exemple suivant.
Imaginons, dans mon modèle de librairie XML, que nous ayons nommé l'élément correspondant à
l'auteur du livre <nom></nom> et que nous décidions d'ajouter un nouvel élément qui concernerait
le traducteur du livre (si celui-ci n'a pas été rédigé dans la langue de Molière) et que nous le
nommions également <nom></nom>. Il deviendrait, bien évidemment, difficile de faire la
différence entre nos deux éléments <nom></nom>.
C'est là qu'interviennent les Espaces de Noms.
Exemple 10 :
Listing du document XML : ex-10.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<librairie xmlns:auteur="http://www.asp-php.net/auteur"
xmlns:traducteur="http://www.asp-php.net/traducteur" >
<livre>
<titre>Formation à... XML</titre>
<auteur:nom>Michael J. YOUNG</auteur:nom>
<traducteur:nom>James GUERIN</traducteur:nom>
<editeur>Microsoft Press</editeur>
</livre>
</librairie>
Il est tout à fait possible, dans un même élément, de faire référence à plusieurs espaces
de noms.
L'URI de l'espace peut être fictive.
<librairie xmlns:html="http://www.w3c.org/TR/REC-html40/">
<livre>
<titre>Formation à... XML</titre>
<auteur>Michael J. YOUNG</auteur>
<html:a href="http://microsoft.com/france/mspress/">
<editeur>Microsoft Press</editeur>
</html:a>
</livre>
</librairie>
Tout ceci n'a que peu d'intérêt pour l'instant; Effectivement, vous pouvez constater que le
navigateur n'affiche rien de plus qu'une banale arborescence XML.
Pour avoir un affichage HTML dans le navigateur il faut impérativement attacher une
feuille de style à notre document XML. Nous aborderons les feuilles de styles dans le
prochain chapitre. En attendant, attacher une feuille de styles fictive à notre document en
insérant juste avant l'élément racine la ligne suivante : <?xml-stylesheet
href="fictive.css" type="text/css"?>
Vous constatez qu'en insérant du HTML/XHTML dans un document XML et en y attachant une
feuille de styles fictive, il est possible de mettre en forme un document XML. J'aborderai d'autres
méthodes de mise en forme (plus pratiques et plus puissantes) dans le chapitre suivant.
Plus simple qu'ActiveX, la syntaxe permettant l'insertion d'îlots de données dans une page HTML :
<xml id="nomIdentifiantIlot">
<?xml version="1.0"?>
données xml
</xml>
Il est également possible d'insérer un fichier XML de cette façon dans un document HTML :
<xml id="nomIdentifiant" src="URL document XML"></xml>
Vous en apprendrez plus sur la gestion des Ilots de données dans une page HTML/XHTML dans le
chapitre suivant à la section Liaison de données.
I NTRODUCTION
Nous y voilà enfin !... Mettre en forme et afficher un document XML dans une page Web.
C'est la première technique de base pour la mise en forme de documents XML que je souhaite
vous présenter ici. Les trois Parts suivant traiteront chacun d'une technique différente.
En fait, contrairement à ce que j' énonce dans l'introduction de ce Part, vous avez déjà vu, dans le
Part précédent, comment faire une mise en forme simple en insérant du HTML dans un document
XML.
Comme pour l'insertion d'éléments HTML au sein d'un document XML, si vous souhaitez
obtenir un affichage reproduisant la mise en forme du style appliqué, il est nécessaire de
faire un lien vers une feuille de styles fictive.
De plus, pour rendre le document XML valide, il ne faut pas oublier de déclarer l'attribut
style dans la DTD comme ceci : <!ATTLIST nom_element style CDATA
#IMPLIED>
Je vous déconseille l'utilisation de styles locaux. Ils ne correspondent pas à la
philosophie du XML : séparation de la structure et des données de la mise en forme.
Définissez plutôt les styles uniquement au sein d'un fichier CSS lié au document XML
(voir deuxième solution).
La seconde solution consiste tout simplement à lier un fichier de feuilles de styles CSS au
document XML avec l'instruction de traitement suivante :
<?xml-stylesheet href="URL document CSS" type="text/css"?>
Exemple 13 :
Listing du document CSS : ex-13.css
/* Fichier de Styles CSS : ex-13.css */
livre
{
font-family: arial;
font-size: 12px;
color: #000000;
display: block;
background: #cccccc;
margin: 5px;
padding: 5px;
width: 300px;
}
titre
{
font-weight: bold;
display: block;
}
auteur
{
color: #ff6600;
display: block;
}
collection
{
font-size: 10px;
display: block;
}
Le listing du document XML (ex-13.xml) est partiel; Pour le compléter, il vous suffit de récupérer le
contenu du listing ex-4.xml en y ajoutant l'instruction de traitement pour le lier à la feuille de styles
au document.
Remarquez que le nom des sélecteurs CSS sont identique aux noms des éléments XML
à formater. C'est impératif.
Vous constaterez également que l'on ne peut agir sur les attributs des éléments XML.
C'est une des faiblesses des styles CSS utilisés pour la mise en forme de documents
XML.
I NTRODUCTION
La méthode que je vous propose d'aborder dans ce part est plus laborieuse à mettre en oeuvre et
un tantinet plus compliquée que la précédente (CSS) mais elle a aussi l'avantage de permettre la
gestion des attributs, du tri et de la pagination.
L'affichage d'un document XML à l'aide de la technique des liaisons de données avec
HTML et DSO est essentiellement adaptée pour les documents XML dont la structure est
similaire à celle d'une base de données (structure symétrique).
Exemple 14 :
Listing du document HTML : ex-14.html
<?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">
<head>
<title>Initiation à XML : Liaison de données</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<xml id="databindEX4" src="ex-4.xml" />
</body>
</html>
Certains éléments HTML, comme <tr></tr> et <td></td>, ne peuvent pas être liés à
un élément XML.
Dans l'exemple qui va suivre, le document XML de ma librairie a été simplifié afin d'être le plus
symétrique possible. Tous les attributs ainsi que leurs définitions ont été supprimés.
Exemple 15 :
Listing du document DTD : ex-15.dtd
<!ELEMENT librairie (livre+)>
<!ELEMENT livre (titre, auteur, editeur, collection?)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT editeur (#PCDATA)>
<!ELEMENT collection (#PCDATA)>
<titre>XML</titre>
<auteur>Michael J. YOUNG</auteur>
<editeur>Microsoft Press</editeur>
<collection>Formation à...</collection>
</livre>
<livre>
<titre>ASP.Net</titre>
<auteur>Richard CLARK</auteur>
<editeur>Microsoft Press</editeur>
<collection>Formation à...</collection>
</livre>
<livre>
<titre>Construisons notre première application ASP.Net</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
<livre>
<titre>Construire une application XML</titre>
<auteur>Collectif</auteur>
<editeur>Eyrolles</editeur>
<collection>Solutions développeurs</collection>
</livre>
<livre>
<titre>Gestion d'un Datagrid et d'un moteur de recherches</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
<livre>
<titre>ASP.Net Professionnel</titre>
<auteur>Collectif</auteur>
<editeur>Campus Press</editeur>
<collection>Wrox</collection>
</livre>
<livre>
<titre>JavaScript</titre>
<auteur>David FLANAGAN</auteur>
<editeur>O'Reilly</editeur>
<collection>La référence</collection>
</livre>
<livre>
<titre>Starter kit, réussir mon install...</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
<livre>
<titre>WEB.CONFIG : Configuration d'une application</titre>
<auteur>Frédéric REMISE</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
<livre>
<titre>Code Behind sans VS.NET : 2 méthodes d'écriture</titre>
<auteur>Frédéric REMISE</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
<livre>
<titre>Le formulaire et l'envoi de mail en .NET</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
<livre>
<titre>Gestion avancée d'un ListBox</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
</librairie>
<body>
<xml id="dso15" src="ex-15.xml" />
<table datasrc="#dso15" border="0" cellspacing="0" cellpadding="5">
<tr style="background-color: #cccccc; font: bold 12px verdana;">
<td>Titre</td>
<td>Auteur</td>
<td>Editeur</td>
<td>Collection</td>
</tr>
<tr style="font: 10px verdana;">
<td><span datafld="titre" /></td>
<td><span datafld="auteur" /></td>
<td><span datafld="editeur" /></td>
<td><span datafld="collection" /></td>
</tr>
</table>
</body>
</html>
L'attribut datasrc placé dans la balise <table></table> permet de lier celle-ci à notre îlot de
données dso15 (jeu d'enregistrements), et les attributs datafld dans les balises <span />
permettent de les lier au différents champs (éléments) de notre l'îlot afin d'en afficher le contenu.
En visualisant le document HTML (ex-15.html) dans MSIE, on constate que les contenus des
balise <tr></tr> sont dupliqués. La liaison de données duplique automatiquement les balises
<tr></tr> pour chaque enregistrement contenu dans le document XML. C'est pratique pour la
ligne des contenus mais gênant pour la ligne d'entête contenant les titres de colonne.
Pour pallier à ce petit problème, nous allons feinter ; Nous savons que la liaison de données
duplique les balise <tr></tr>, et bien remplaçons cette balise, pour la première ligne, par un tag
<thead></thead> comme indiqué ci-dessous :
...
<thead style="background-color: #cccccc; font: bold 12px verdana;">
<td>Titre</td>
<td>Auteur</td>
<td>Editeur</td>
<td>Collection</td>
</thead>
...
9 Etablir une liaison entre des éléments HTML et des attributs XML
Dans l'exemple précédent, le document XML a été rebâti de façon symétrique et complètement
dépouillé d'attributs. L'élément <auteur> à lui aussi été modifié afin de ne plus pouvoir apparaître
plusieurs fois pour un même livre.
Si ces modifications n'avaient pas été apportées, nous n'aurions eu qu'une visualisation partielle,
voir aucune, dans notre navigateur. Car, comme je vous l'ai mentionné au début de cette section,
l'affichage d'un document XML avec une liaison de données DSO est adapté essentiellement aux
données XML conçues sur le même schéma qu'une base de donnée.
Il est malgré tout possible d'utiliser des attributs et des éléments redondants dans un même
enregistrement. Mais c'est un peu plus compliqué.
Les attributs d'un élément XML sont perçus par le DSO comme des nœuds enfants de cet élément.
C'est un peu comme si, dans une base de données, le champ d'une de vos table contenait des
sous champs. Cela est possible mais à condition que ce champ soit lié aux champs d'une autre
table.
Et bien, avec une liaison DSO et HTML cela correspond à des tables imbriquées. C'est à dire qu'un
élément possédant des attributs correspondra à une table imbriquée donc à un sous
enregistrement et chacun de ses attributs seront perçus comme les champs de cette sous table ou
de ce sous enregistrement.
Pour illustrer tout ça, nous allons ré-intégrer l'attribut ISBN que nous affecterons à l'élément
<titre></titre> ainsi que l'attribut couverture (correspondant à la photo de la première de
couv.). Nous redonnerons aussi à l'élément <auteur></auteur> la possibilité de posséder
plusieurs items.
Exemple 16 :
Listing du document DTD : ex-16.dtd
<!ELEMENT librairie (livre+)>
<!ELEMENT livre (titre, auteur+, editeur, collection?)>
<!ELEMENT titre (#PCDATA)>
<!ATTLIST titre ISBN NMTOKEN #REQUIRED couverture CDATA #IMPLIED>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT editeur (#PCDATA)>
<!ELEMENT collection (#PCDATA)>
<collection>Formation à...</collection>
</livre>
<livre>
<titre ISBN="-">Construisons notre première application
ASP.Net</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
<livre>
<titre ISBN="2-212-09081-1">Construire une application XML</titre>
<auteur>Jean-Christophe BERNADAC</auteur>
<auteur>François KNAB</auteur>
<editeur>Eyrolles</editeur>
<collection>Solutions développeurs</collection>
</livre>
<livre>
<titre ISBN="2-10-006564-5" couverture="images/rcvbnet.jpg">Visual
Basic .Net</titre>
<auteur>Richard CLARK</auteur>
<editeur>Microsoft Press</editeur>
<collection>Au coeur de</collection>
</livre>
<livre>
<titre ISBN="-">Gestion d'un Datagrid et d'un moteur de
recherches</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
<livre>
<titre ISBN="2-7440-9005-0">ASP.Net Professionnel</titre>
<auteur>Richard ANDERSON</auteur>
<auteur>Brian FRANCIS</auteur>
<auteur>Alex HOMER</auteur>
<auteur>Rob HOWARD</auteur>
<auteur>Dave SUSSMAN</auteur>
<auteur>Karli WATSON</auteur>
<editeur>Campus Press</editeur>
<collection>Wrox</collection>
</livre>
<livre>
<titre ISBN="2-84177-212-8"
couverture="images/jsref.jpg">JavaScript</titre>
<auteur>David FLANAGAN</auteur>
<editeur>O'Reilly</editeur>
<collection>La référence</collection>
</livre>
<livre>
<titre ISBN="-">Starter kit, réussir mon install...</titre>
<auteur>Grégory RENARD</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
<livre>
<titre ISBN="-">WEB.CONFIG : Configuration d'une application</titre>
<auteur>Frédéric REMISE</auteur>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</livre>
<livre>
<body>
<xml id="dso16" src="ex-16.xml" />
<table datasrc="#dso16" border="0" cellspacing="0" cellpadding="5">
<thead style="background-color: #cccccc; font: bold 12px verdana;" >
<td>Couverture</td>
<td>Titre</td>
<td>ISBN</td>
<td>Auteur</td>
<td>Editeur</td>
<td>Collection</td>
</thead>
<tr style="font: 10px verdana;">
<td>
<table datasrc="#dso16" datafld="titre" border="0"
cellspacing="0" cellpadding="0">
<tr><td>
<img datafld="couverture" />
</td></tr>
</table>
</td>
<td>
<table datasrc="#dso16" datafld="titre" border="0"
cellspacing="0" cellpadding="0">
<tr><td style="font: bold 11px;">
<span datafld="$text" />
</td></tr>
</table>
</td>
<td>
Avez vous remarqué que pour accéder aux données caractères des éléments <titre></titre>
et <auteur></auteur> j'ai attribué la valeur $text à l'attribut datafld ? La raison est que pour
atteindre le contenu des attributs d'un élément, on cré une espèce de sous enregistrement avec
une table imbriquée en la qualifiant avec un attribut datasrc et un attribut datafld auquel on
donne comme valeur le nom de l'élément. Dans ce cas, l'élément n'est plus tout à fait un champ
mais plutôt un enregistrement hiérarchisé dans lequel chaque attribut ainsi que les données
caractères de l'élément correspondent à des nœuds enfants (donc des champs). Chaque champs
dépendant d'un attribut à pour étiquette le nom de l'attribut dont il dépend mais les données
caractères n'ont pas d'étiquettes. C'est pour ça que le DSO attribut la valeur $text à l'étiquette
d'un champ représentant les données d'un élément possédant des attributs.
En résumé, pour accéder aux données caractères d'un élément possédant des attributs
ou pour un élément redondant on utilise la valeur de champ $text :
datafld="$text".
Pour créer plusieurs pages d'enregistrements et naviguer dans ces pages, il faut indiquer à la table
combien, au maximum, celle-ci doit restituer d'enregistrements par page avec l'attribut
datapagesize dont la description vous a été fournie dans le tableau Liste des attributs spéciaux
HTML/DSO.
Pour pouvoir manipuler la table avec les méthodes énumérées dans le tableau précédent, il faut lui
attribuer un identifiant avec l'attribut id.
L'exemple suivant utilise le même document XML que l'exemple 16.
Exemple 17 :
Listing du document HTML : ex-17.html
<?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">
<head>
<title>Initiation à XML : Liaison de données</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"
/>
</head>
<body>
<xml id="dso16" src="ex-16.xml" />
<table width="80%" border="0">
<tr>
<td align="left">
<a href="#" onclick="librairie.previousPage()">Précédent</a>
</td>
<td align="right">
<a href="#" onclick="librairie.nextPage()">Suivant</a>
</td>
</tr>
</table>
<table datasrc="#dso16" datapagesize="4" id="librairie" border="0"
cellspacing="0" cellpadding="5">
<thead style="background-color: #cccccc; font: bold 12px verdana;" >
<td>Couverture</td>
<td>Titre</td>
<td>ISBN</td>
<td>Auteur</td>
<td>Editeur</td>
<td>Collection</td>
</thead>
<tr style="font: 10px verdana;">
<td>
<table datasrc="#dso16" datafld="titre" border="0"
cellspacing="0" cellpadding="0">
<tr><td>
<img datafld="couverture" />
</td></tr>
</table>
</td>
<td>
<table datasrc="#dso16" datafld="titre" border="0"
cellspacing="0" cellpadding="0">
<tr><td style="font: bold 11px;">
<span datafld="$text" />
</td></tr>
</table>
</td>
<td>
<table datasrc="#dso16" datafld="titre" border="0"
cellspacing="0" cellpadding="0">
<tr><td style="font: 10px;">
<span datafld="ISBN" />
</td></tr>
</table>
</td>
<td>
<table datasrc="#dso16" datafld="auteur" border="0"
cellspacing="0" cellpadding="0">
<tr><td style="font: bold 10px; color: #993300">
<span datafld="$text" />
</td></tr>
</table>
</td>
<td ><span datafld="editeur" /></td>
<td><span datafld="collection" /></td>
</tr>
</table>
</body>
</html>
Il possible de créer des scripts (JScript/JavaScript) plus complexes pour manipuler un jeu
d'enregistrements avec les méthodes et les propriétés énumérées ci-dessous.
Liste des méthodes et propriétés d'un recordset
liste non exhaustive
Propriété/Méthode Description
I NTRODUCTION
Cette dernière méthode avant la solution ultime, que je vous présenterai dans le prochain part, est
plus souple que la précédente et peut être utilisée pour tous types de documents XML.
Ensuite, il faut récupérer l'îlot de données (nœud du nœud document) afin de pouvoir accéder à
l'ensemble des objets DOM XML. Pour ce faire, dans la section script du document HTML, on
affecte à une 'variable objet' le document XML en utilisant la méthode XMLDocument de l'objet
document :
<script language="JavaScript" type="text/javascript">
VariableObjet = nomIdentifiant.XMLDocument;
</script>
Vous trouverez dans le tableau suivant une liste des propriétés les plus utiles classées par objets.
Certaines de ces propriétés retournent des objets de type collection. La plupart de ces propriétés
sont communes à l'ensemble des types de nœuds.
Liste des propriétés classées par objet
liste non exhaustive
Propriété Objet Description
Vous trouverez dans le tableau ci-dessous une liste des méthodes les plus utiles classées par
objets. Certaines de ces méthodes peuvent être communes à plusieurs des types de nœuds.
Liste des méthodes classées par objets
liste non exhaustive
Méthode Objet Description
}
</script>
</head>
<body onload="fDisplayLivre();">
<xml id="dso16" src="ex-16.xml" />
<table border="0" cellspacing="0" cellpadding="5">
<tr>
<td width="100" height="100" align="left" valign="middle">
<img id="couverture" border="0" />
</td>
<td align="left" valign="top" style="font: 10px verdana">
<span id="livre" style="font: 10px verdana;" />
</td>
</tr>
<tr>
<td style="font: 11px verdana" align="left">
<a href="#" onclick="fDisplayLivre(i--)"> << Livre
précédent</a>
</td>
<td style="font: 11px verdana" align="right">
<a href="#" onclick="fDisplayLivre(i++)">Livre suivant
>></a>
</td>
</tr>
</table>
</body>
</html>
I NTRODUCTION
Voici enfin la solution ultime pour l'affichage et la mise en forme d'un document XML : XSL ou
plutôt XSL-T.
Les styles XSL ne définissent pas de règles de styles mais des modèles (templates). Chaque
modèle définit le ou les nœuds pour lesquels il doit s'appliquer, il peut contenir des objets de
transformation (éléments HTML/XHTML et XSL).
Si aucun mode de sortie n'est spécifié ou si le mode choisi est XML, les éléments de
sortie HTML doivent impérativement respecter la syntaxe XHTML ; En d'autres termes,
chaque élément HTML doit être correctement fermé.
<xsl:template match="pattern">
<div style="font: 12px">
<xsl:value-of select="pattern" />
</div>
</xsl:template>
Dans ce petit exemple, le modèle est défini par l'élément XSL <xsl:template> et l'attribut match
détermine le nœud pour lequel doit s'appliquer le modèle. L'élément XSL <xsl:value-of>
permet de récupérer le contenu texte de l'élément XML spécifié par la valeur de l'attribut select. La
valeur des attributs match et select doit être un chemin de localisation (path) désignant une
branche particulière de la hiérarchie du document XML ; Dans la terminologie XSL ce type de
chemin est appelé pattern.
La syntaxe des patterns est un langage particulier non-XML connu sous le nom de
XPath.
Comme pour les styles CSS, il nous faut établir une liaison entre le document XML et la feuille de
styles XSL à l'aide d'une instruction de traitement.
<?xml-stylesheet type="text/xsl" href="URL document styles XSL"?>
Dans l'exemple qui va suivre, le but recherché est d'afficher uniquement le titre de chacun des
livres simplement en modifiant le pattern de l'attribut select de l'élément <xsl:value-of>.
Listing du document XSL : ex-19b.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<div style="font: 12pt verdana">
<xsl:value-of select="librairie/livre/titre" />
</div>
</xsl:template>
</xsl:stylesheet>
Je modifie de nouveau mon exemple pour que celui-ci affiche tous les titres. Pour cela, j'utilise un
élément <xsl:apply-templates> et j'en profite pour demander un tri ascendant avec
l'élément <xsl:sort>.
Voilà qui est mieux. J'aurais pu utiliser un élément <xsl:for-each> pour créer la répétition
plutôt qu'un élément <xsl:apply-templates> comme dans l'exemple 19d.
<xsl:template match="/">
<xsl:for-each select="librairie/livre">
<xsl:sort select="titre" order="descending" />
<span style="font: 10px verdana" />
<xsl:value-of select="titre" /><br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
On gagne quelques lignes. Maintenant essayons d'afficher uniquement les titres des livres
faisant partie de la collection ASP.NET – To the .Point !. Une simple modification dans le pattern
de l'attribut select de l'élément <xsl:for-each> suffit.
Afin de vous présenter l'opérateur logique not() avec un élément <xsl:if>, l'exemple suivant
affiche uniquement le titre des livres dont l'élément <titre></titre> ne possède pas
d'attribut couverture.
Pour avoir un exemple d'extraction de valeur d'attribut, je vous propose de demander à notre
feuille de style d'afficher le titre de chaque livre en ajoutant devant la chaîne de caractères Titre :,
Pour conclure cette série d'exemples, celui qui suit affiche le titre, l'ISBN, les auteurs et l'éditeur de
chaque livre dont les auteurs ne sont ni G. RENARD, ni F. REMISE. D'autre part, il affiche un lien,
si celui-ci existe, vers le site de l'auteur ; Bien sûr, le document XML ex-19.xml aura été modifié en
conséquence ainsi que sa DTD. Dans mon exemple, seul l'auteur R. CLARK a été modifié.