(COURS) - Apprendre XML

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 51

Initiation à XML - www.cti-formation.

com

<Derf:XML easy="true">
<Derf:title part="1">
Initiation à XML
</Derf:title>
</Derf:XML>

By F.REMISE
Microsoft MVP

[email protected]

www.asp-php.net By F.Remise alias Derf ©


Initiation à XML - www.cti-formation.com

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

Avant de poursuivre la lecture de cet article, assurez-vous d'être en pleine possession de


la pratique et des connaissances nécessaires et suffisantes pour HTML/XHTML, CSS,
JavaScript/JScript et sur l'architecture générale du Web.

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.

Les avantages de XML


XML permet de définir ses propres balises et ses propres attributs. Il est donc plus flexible
que HTML qui, lui, ne possède qu'un nombre limité de balise.
Un document XML peut être validé par des règles strictes, contenues par des DTD ou des
Schémas, décrivant sa structure et la hiérarchisation de ses données.
Les informations ainsi que le traitement de la mise en forme sont rigoureusement séparés
de la structure du document XML.

www.asp-php.net By F.Remise alias Derf © 2/6


Initiation à XML - www.cti-formation.com

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.

Les inconvénients de XML


Le principal inconvénient, à mon sens, pourrait venir du format lui même : le format texte;
Les données stockées au format texte sont en général plus volumineuses que celles
stockées au format binaire.
Du point de vue purement Web, on peut également mentionner le fait qu'il est impossible
d'utiliser du XML pur pour créer les pages d'un site sans l'associer à d'autres langages (que
nous aborderons, pour certains, dans cet série d'article) tel que HTML, CSS, XSLT, Scripts
DOM ou encore ASP.Net.
Contrairement aux "validateurs" HTML plutôt permissifs, les "validateurs" XML sont dénués
de tout laxisme; Mais est-ce vraiment un inconvénient quand on vise l'interopérabilité ?

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.

S TRUCTURE D ' UN FICHIER XML DE BASE : DOCUMENT B IEN F ORME

Document bien formé (well-formed)


Un document XML est dit "bien formé" (well-formed) s'il est constitué d'un prologue et d'un élément
racine (nœud racine).
Pour l'ensemble de mes démonstrations, je prendrai comme exemple la gestion des ouvrages
d'une librairie spécialisée dans les livres informatiques.

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.

<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>

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 à

www.asp-php.net By F.Remise alias Derf © 3/6


Initiation à XML - www.cti-formation.com

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.

Pour notre exemple, nous nommerons l'élément racine librairie :


<?xml version="1.0" encoding="iso-8859-1"?>
<librairie>
...
</librairie>

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

www.asp-php.net By F.Remise alias Derf © 4/6


Initiation à XML - www.cti-formation.com

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.

Jeux de caractères du Standard Unicode


liste non exhaustive
Norme Correspondance
UTF-8 Jeu de caractères universel sur 8 bits
UTF-16 Jeu de caractères universel sur 16 bits

Jeux de caractères du Standard ISO


liste non exhaustive
Norme Correspondance
ISO-8859-1 Latin 1 – Langues d'Europe de l'ouest et d'Amérique latine
ISO-8859-2 Latin 2 – Langues d'Europe centrale et Slaves
ISO-8859-3 Latin 3 – Langues Espéranto, Galicienne, Maltaise et Turc
ISO-8859-4 Latin 4 – Langues Estonienne, Lettonne et Lithuanienne
ISO-8859-5 Langue Cyrilliques
ISO-8859-6 Langue Arabe
ISO-8859-7 Langue Grecque
ISO-8859-8 Langue Hébraïque
ISO-8859-9 Latin 5 – Langue Turc
ISO-8859-10 Latin 6 – Langues Groenlandaises et Lapones

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
< &lt; &#60;
> &gt; &#62;
& &amp; &#38;

Commentaires, Instructions de traitement et section CDATA


Les commentaires :
Les commentaires sont introduits dans un document XML comme dans un document HTML :
<!-- commentaires -->

www.asp-php.net By F.Remise alias Derf © 5/6


Initiation à XML - www.cti-formation.com

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
]]>

Les sections CDATA ne peuvent pas être imbriquées.

C'est la fin de cette première étape.


Je vous donne rendez-vous très prochainement pour la suite :
XML Part 2 : Document valide 1 : DTD et définition d'éléments

En attendant "XML-isez" bien vos données.

Fred.

www.asp-php.net By F.Remise alias Derf © 6/6


Initiation à XML – Part 2 - www.cti-formation.com

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.

DTD : DOCUMENT V ALIDE

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.

DTD ! et quécécé ???


La DTD permet de définir un ensemble de règles pour la structure d'un document XML et la
hiérarchisation des données. C'est dans le DTD que l'on définit les balises (éléments ou nœuds)
pouvant être utilisées dans le document XML, auxquelles on pourra éventuellement adjoindre une
définition d'attributs typés et valués. La DTD est tout simplement un modèle servant à définir votre
langage de balises.
Une DTD peut être interne ou externe à un document XML.
Le langage utilisé pour définir une DTD est le SGML.

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.

Structure d'une DTD


Comme je le mentionnais dans la section précédente, on peut déclarer une DTD soit en interne
soit en externe.
Une DTD externe doit être enregistrée dans un fichier texte portant l'extension .dtd.
La déclaration de l'utilisation d'une DTD externe doit se faire avant l'élément racine et après le
prologue. Elle est introduite dans le document XML par l'instruction DOCTYPE immédiatement

www.asp-php.net By F.Remise alias Derf © 2/6


Initiation à XML – Part 2 - www.cti-formation.com

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>

Chaque instruction de la DTD est introduite par : <!


Chaque balise (en XML, les balises sont aussi appelées éléments et dans certains cas on parle de
nœuds) est définie par l'instruction <!ELEMENT suivie du nom que porte l'élément en question.
Outre le nom que porte l'élément, il faut aussi indiquer soit le nom des sous-éléments que peut
contenir l'élément parent, soit le type de l'élément si celui-ci est un nœud enfant.
Exemple 2
Voici un exemple de DTD appliqué au document XML de ma librairie (exemple 1) :
Listing du document XML : ex-2.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie [
<!-- Ceci est un élément parent : c'est l'élément racine -->
<!ELEMENT librairie (livre+)>
<!-- ceci est un nœud enfant de LIBRAIRIE,
et l'élément parent de TITRE, AUTEUR et EDITEUR -->
<!ELEMENT livre (titre, auteur, editeur)>
<!—Les 3 élément suivant sont des nœuds enfants de l'élément LIVRE -->
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT editeur (#PCDATA)>
]>
<librairie>
<!-- Il existe 4 livres référencés dans ma 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>

www.asp-php.net By F.Remise alias Derf © 3/6


Initiation à XML – Part 2 - www.cti-formation.com

<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.

Caractères et Mots clés utilisés


pour la spécification de contenu d'éléments d'une DTD

Caractère / Mot clé Description

Indique que l'élément défini peut avoir tout type de contenu légal.
ANY
<!ELEMENT nom_elmt ANY>

Indique que l'élément défini ne peut pas avoir de contenu.


EMPTY
<!ELEMENT nom_elmt EMPTY>

Indique que l'élément défini peut contenir une chaîne de caractères. Ce


mot clé peut être associé à une liste de contenu; Dans ce cas, il se place
(#PCDATA)
en première position de la liste.
<!ELEMENT nom_elmt (#PCDATA)>
Délimite une liste de contenu en précisant le nom et l'ordre des nœuds
(..., ...) enfants.
<!ELEMENT nom_elmt_parent (noeud1, noeud2, noeud3)>

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)>

www.asp-php.net By F.Remise alias Derf © 4/6


Initiation à XML – Part 2 - www.cti-formation.com

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.

Listing du document XML : ex-3.xml


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie [
<!ELEMENT librairie (livre+)>
<!ELEMENT livre (titre, auteur+, editeur, collection?, prix?)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT editeur (#PCDATA)>
<!ELEMENT collection (#PCDATA)>
<!ELEMENT prix (cat1 | cat2 | cat3 | cat4)?>
<!ELEMENT cat1 EMPTY>
<!ELEMENT cat2 EMPTY>
<!ELEMENT cat3 EMPTY>
<!ELEMENT cat4 EMPTY>
]>
<librairie>
<livre>
<titre>CSS 2</titre>
<auteur>Daniel GLAZMAN</auteur>
<editeur>Eyrolles</editeur>
</livre>
<livre>
<titre>XML</titre>
<auteur>Michael J. YOUNG</auteur>
<editeur>Microsoft Press</editeur>
<collection>Formation à...</collection>
<prix>
<cat1 />
</prix>
</livre>
<livre>

www.asp-php.net By F.Remise alias Derf © 5/6


Initiation à XML – Part 2 - www.cti-formation.com

<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>

Fin de cette deuxième étape.


Je vous donne rendez-vous très prochainement pour la suite :
XML Part 3 : Document valide 2 : DTD et définition d'attributs et d'entités

En attendant "XML-isez" bien vos données.

Fred.

www.asp-php.net By F.Remise alias Derf © 6/6


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

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.

DTD : DOCUMENT V ALIDE – 2 E PARTIE

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.

La syntaxe générale d'une déclaration d'attribut est la suivante :


<!ATTLIST nom_element nom_attribut TypeAttribut #OptionAttribut>

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 :

Liste des valeurs d'attributs par types

Type Valeur Description

Une suite de valeurs séparée par un trait vertical. L'attribut ne


(val1 | val2 |
Enuméré pourra prendre qu'une seule de ces valeurs.
etc.)
<!ATTLIST nom_elmt nom_attrib (v1 | v2)>

Une suite de noms de notation séparé par un trait vertical.


NOTATION (val1
Enuméré Chaque nom doit correspondre exactement à un nom de
| val2 | etc.)
notation déclaré dans la DTD.

Accepte n'importe quel chaîne de caractères.


Chaîne CDATA
<!ATTLIST nom_elmt nom_attrib CDATA>

www.asp-php.net By F.Remise alias Derf © 2 / 12


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

Définit comme valeur d'attribut une entité non parsée déclarée


Prédéfini ENTITY dans une DTD.
<!ATTLIST nom_elmt nom_attrib ENTITY #option>

Definit comme valeur d'attribut plusieurs entités (séparées par


Prédéfini ENTITIES des espaces) non parsées déclarées dans une DTD.
<!ATTLIST nom_elmt nom_attrib ENTITIES #option>

Indique que l'attribut possède une valeur unique pour chaque


élément. La valeur peut contenir une ou plusieurs lettres, des
Prédéfini ID chiffres, des points (.), des tirets hauts (-) ou bas (_), et un
double point (:).
<!ATTLIST nom_elmt nom_attrib ID #option>

Indique que la valeur de l'attribut se réfère à un ID d'un autre


Prédéfini IDREF attribut.
<!ATTLIST nom_elmt nom_attrib IDREF #option>

Identique à IDREF excepté que la valeur de l'attribut peut se


référer à plusieurs ID, chaque valeur étant séparée par un
Prédéfini IDREFS
espace.
<!ATTLIST nom_elmt nom_attrib IDREFS #option>

Indique que la valeur de l'attribut est une chaîne de caractères


pouvant contenir une ou plusieurs lettres, des chifrres, des
Prédéfini NMTOKEN
points (.), des tirets hauts (-) ou bas (_), et un double point (:).
<!ATTLIST nom_elmt nom_attrib NMTOKEN #option>

Identique à NMTOKEN excepté que l'attribut peut avoir plusieurs


Prédéfini NMTOKENS valeurs séparées par des espaces.
<!ATTLIST nom_elmt nom_attrib NMTOKENS #option>

Le tableau suivant décrit les options d'attributs :

Liste des Options

Mot clé Description


Définit, pour l'attribut, une valeur par défaut. Si la valeur est omise, le parser
utilisera la valeur par défaut indiquée. Mais il est possible d'affecter une autre
"valdefaut"
valeur issue de la liste des valeurs déclarées.
<!ATTLIST nom_elmt nom_attrib (val1|val2) "val_defaut">

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>

www.asp-php.net By F.Remise alias Derf © 3 / 12


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

Indique qu'une valeur d'attribut est obligatoire.


#REQUIRED
<!ATTLIST nom_elmt nom_attrib (val1|val2) #REQUIRED>

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.

Listing du document XML : ex-4.xml


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie [
<!ELEMENT librairie (livre+)>
<!ELEMENT livre (titre, auteur+, editeur, collection?, prix?)>
<!ATTLIST livre prix (cat1|cat2|cat3|cat4) #IMPLIED ISBN NMTOKEN
#REQUIRED code ID #REQUIRED>
<!ELEMENT titre (#PCDATA)>
<!ATTLIST titre stock (oui|non) "non">
<!ELEMENT auteur (#PCDATA)>
<!ATTLIST auteur autrespub IDREFS #IMPLIED>
<!ELEMENT editeur (#PCDATA)>
<!ELEMENT collection (#PCDATA)>
]>
<librairie>
<livre prix="cat2" ISBN="2-212-09051-X" code="DG1-0">
<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">
<titre stock="oui">XML</titre>
<auteur>Michael J. YOUNG</auteur>
<editeur>Microsoft Press</editeur>
<collection>Formation à...</collection>
</livre>
<livre prix="cat1" ISBN="2-84082-865-0" code="RC1-0">
<titre stock="non">ASP.Net</titre>
<auteur autrespub="RC2-0">Richard CLARK</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>
<editeur>ASP-PHP.net</editeur>

www.asp-php.net By F.Remise alias Derf © 4 / 12


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

<collection>ASP.Net - To the .Point !</collection>


</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 prix="cat2" ISBN="2-10-006564-5" code="RC2-0">
<titre stock="oui">Visual Basic .Net</titre>
<auteur autrespub="RC1-0">Richard CLARK</auteur>
<editeur>Microsoft Press</editeur>
<collection>Au coeur de</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>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</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>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</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>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</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>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</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>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>
</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>
<editeur>ASP-PHP.net</editeur>
<collection>ASP.Net - To the .Point !</collection>

www.asp-php.net By F.Remise alias Derf © 5 / 12


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

</livre>
</librairie>

Vous trouverez des exemples d'utilisation d'entités et de notations dans la section


suivante.

Définition d'entités et de notations


Le terme "d'entités" ne devrait pas vous être tout à fait inconnu; En HTML, il n'est pas rare que
vous ayez à remplacer des caractères (caractères accentués par exemple) par des entités
nommées ou codées (caractères d'échappement). Nous avons également abordé le sujet pour
XML dans le chapitre "Structure d'un document XML…"
Les entités XML, peuvent être comparées à des variables. Elles permettent de remplacer n'importe
quel texte par une chaîne de caractères (parsée ou non parsée) au sein de la DTD ou au sein du
document XML.
En XML, il existe différents type d'entités que l'on peut classer en deux familles : Les entités
générales et les entités paramétriques. Les entités sont déclarées dans la DTD avec l'instruction
<!ENTITY .
Les entités peuvent également faire référence à des données externes. Si il s'agit de données non
parsée, il faut déclarer dans la DTD une notation avec l'instruction <!NOTATION . Une notation
permet de décrire le format des données de l'entité en fournissant soit l'adresse d'une description
de format, soit un type mime, soit l'adresse d'une application susceptible de traiter le format.
Les entités générales sont référencées dans un document XML tandis que les entités
paramétriques sont référencées dans une DTD.
Les entités parsées sont des entités dont le contenu sera analysé par le parseur XML à
l'opposé des entités non parsées qui, elles, ne le seront pas.

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 :

www.asp-php.net By F.Remise alias Derf © 6 / 12


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

<!NOTATION nom_notation SYSTEM "URL_description_ou_application">


<!ENTITY nom_entité SYSTEM "URL_fichier_de_données" NDATA nom_notation>

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.

Un exemple pour illustrer ces trois types d'entités générales : Exemple 5


ƒ Dans l'exemple précédent, vous aurez sans doute remarqué que la collection ASP.Net - To
the .Point ! de l'éditeur ASP-PHP.net apparaît assez souvent; Pour économiser quelques
lignes et surtout les touches de mon clavier, je vous propose de créer une entité générale
interne parsée que l'on nommera asp-php pour remplacer les lignes éditeur et collection
(marquage XML compris).
ƒ Pour les publications de R. CLARK, nous mettrons en place une entité générale externe
parsée que nous nommerons rc et qui fera référence au fichier externe rc.xml.
ƒ Enfin, nous ajouterons un attribut couverture optionnel à l'élément <livre></livre>;
Cet attribut sera une entité générale externe non parsée correspondant à l'image de la
couverture du livre et dont le type sera décrit par un type mime. Nous n'appliquerons cet
attribut qu'aux livres de D. GLAZMAN et M.J. YOUNG.

Listing du fichier externe : rc.xml


<?xml version="1.0" encoding="iso-8859-1"?>
<livre prix="cat1" ISBN="2-84082-865-0" code="RC1-0">
<titre stock="non">ASP.Net</titre>
<auteur autrespub="RC2-0">Richard CLARK</auteur>
<editeur>Microsoft Press</editeur>
<collection>Formation à...</collection>
</livre>
<livre prix="cat2" ISBN="2-10-006564-5" code="RC2-0">
<titre stock="oui">Visual Basic .Net</titre>
<auteur autrespub="RC1-0">Richard CLARK</auteur>
<editeur>Microsoft Press</editeur>
<collection>Au coeur de</collection>
</livre>

Listing du document XML : ex-5.xml


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie [
<!ELEMENT librairie (livre+)>
<!ELEMENT livre (titre, auteur+, editeur, collection?, prix?)>
<!ATTLIST livre prix (cat1|cat2|cat3|cat4) #IMPLIED ISBN NMTOKEN
#REQUIRED code ID #REQUIRED couverture ENTITY #IMPLIED>
<!ELEMENT titre (#PCDATA)>
<!ATTLIST titre stock (oui|non) "non">
<!ELEMENT auteur (#PCDATA)>
<!ATTLIST auteur autrespub IDREFS #IMPLIED>
<!ELEMENT editeur (#PCDATA)>
<!ELEMENT collection (#PCDATA)>
<!ENTITY asp-php "<editeur>ASP-PHP.net</editeur><collection>ASP.Net -
To the .Point !</collection>">
<!ENTITY rc SYSTEM "rc.xml">
<!NOTATION JPG SYSTEM "image/jpeg">
<!ENTITY couvcss SYSTEM "css.jpg" NDATA JPG>
<!ENTITY couvxml SYSTEM "xml.jpg" NDATA JPG>
]>

www.asp-php.net By F.Remise alias Derf © 7 / 12


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

<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>

www.asp-php.net By F.Remise alias Derf © 8 / 12


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

&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.

Ci-dessous, 2 exemples démontrant l'utilisation de ce type d'entité. Pour en faciliter la


compréhension, j'ai largement épuré notre exemple "librairie".
Premier exemple : Exemple 6
Dans cet exemple, je définis un attribut niveau pour l'élément livre. Cet attribut est encapsulé dans
une entité paramètre interne parsée nommée nivo.
Listing du fichier XML : ex-6.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie [
<!ENTITY % nivo "<!ATTLIST livre niveau
(débutant|intermédiaire|avancé|expert) 'débutant'>">
<!ELEMENT librairie (livre+)>
<!ELEMENT livre (titre, auteur, editeur)>
%nivo;
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT editeur (#PCDATA)>
]>

<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>

www.asp-php.net By F.Remise alias Derf © 9 / 12


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

Deuxième exemple : Exemple 7


Dans cet exemple, seules les valeurs de l'attribut niveau sont encapsulées dans l'entité
paramètre interne parsée nommée nivo. Ici, une DTD externe est obligatoire.
Listing de la DTD externe : ex-7.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'>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT editeur (#PCDATA)>

Listing du document XML : ex-7.xml


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie SYSTEM "ex-7.dtd">
<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'>

www.asp-php.net By F.Remise alias Derf © 10 / 12


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

Listing de la DTD externe 2 : ex-8b.dtd


<?xml version="1.0" encoding="iso-8859-1"?>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>

Listing du document XML : ex-8.xml


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie [
<!ENTITY % dtd8a SYSTEM "ex-8a.dtd">
<!ENTITY % dtd8b SYSTEM "ex-8b.dtd">
%dtd8a;
%dtd8b;
<!ELEMENT editeur (#PCDATA)>
]>
<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>

Sections IGNORE et INCLUDE


Une section IGNORE permet de désactiver temporairement une partie de la DTD, c'est à dire faire
en sorte que le parser n'analyse pas une partie donnée de la DTD, un peu à la manière des
commentaires en JavaScript.
La forme syntaxique d'une section IGNORE est la suivante :
<![IGNORE[
déclarations de marquage à désactiver
]]>
Il est également possible de réactiver momentanément une partie ignorée en remplaçant le mot clé
IGNORE par INCLUDE.
La forme syntaxique d'une section INCLUDE est la suivante :
<![INCLUDE[
déclaration de marquage précédemment désactivée à réactivée
temporairement
]]>

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"?>

www.asp-php.net By F.Remise alias Derf © 11 / 12


Initiation à XML – Part. 3 - 2003 - www.cti-formation.com

<!ELEMENT librairie (livre+)>


<!ELEMENT livre (titre, auteur, editeur)>
<![IGNORE[
<!ENTITY % nivo "<!ATTLIST livre niveau
(débutant|intermédiaire|avancé|expert) 'débutant'>">
%nivo;
]]>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT editeur (#PCDATA)>

Listing du document XML : ex-9.xml


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie SYSTEM "ex-9.dtd">
<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>

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.

Fin de cette troisième étape.


Je vous donne rendez-vous très prochainement pour la suite :
XML Part 4 : Namespaces et DataIsland

En attendant "XML-isez" bien vos données.

Fred.

www.asp-php.net By F.Remise alias Derf © 12 / 12


Initiation à XML – Part. 4 - 2003 - www.cti-formation.com

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.

E SPACES DE NOMS ET I LOTS DE DONNEES

Généralités sur les Espaces de Noms


Dans leur forme générale, les Espaces de Noms (Names Spaces) permettent d'éviter les doubles-
sens de certains éléments XML portant le même nom mais ayant des significations différentes. En
d'autres termes, les Espaces de Noms permettent de différencier des éléments et des attributs
provenant de vocabulaires différents avec des significations différentes et pouvant être amenés à
partager le même nom.
Les Espaces de Noms sont fréquemment utilisés en XML; Soit pour faire référence à un
langage défini par le développeur pour des besoins métiers, soit pour faire référence à
une spécification (ou langage) faisant partie de la nébuleuse XML comme c'est le cas,
par exemple, avec XSLT ou XLink.

La forme syntaxique d'une référence à un espace de noms est la suivante :


<element xmlns:nom_espacenoms="URI décrivant l'espace de noms">

Pour référencer un élément ou un attribut appartenant à un espace de nom particulier la syntaxe


est la suivante :
<nom_espacenom:nom_element nom_espacenom:nom_attribut="val_attribut">
...
</nomespacenom:nom_element>

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>

www.asp -php.net By F.Remise alias Derf © 2/4


Initiation à XML – Part. 4 - 2003 - www.cti-formation.com

<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.

Un exemple plus complet et valide, intégrant une DTD…


Exemple 11 :
Listing du document XML : ex-11.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie [
<!ELEMENT librairie (livre+)>
<!ATTLIST librairie xmlns:auteur CDATA #FIXED "http://www.asp-
php.net/auteur">
<!ATTLIST librairie xmlns:traducteur CDATA #FIXED "http://www.asp-
php.net/traducteur">
<!ELEMENT livre (titre, auteur:nom, traducteur:nom, editeur)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur:nom (#PCDATA)>
<!ELEMENT traducteur:nom (#PCDATA)>
<!ELEMENT editeur (#PCDATA)>
]>
<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>

Insertion d'éléments HTML dans un document XML


Les Espaces de Noms sont aussi utilisés pour insérer des éléments HTML/XHTML dans un
document XML. Pour insérer des éléments HTML/XHTML dans un document XML, il faut utiliser
un espace de noms spécifique et réservé : xmlns:html="http://www.w3c.org/TR/REC-
html40/"
Toutes les balises XHTML/HTML utilisées dans un document XML doivent être préfixées par :
html:
Dans l'exemple qui suit, j'ai ajouté une balise de lien HTML pour l'éditeur.
Exemple 12 :
Listing du document XML : ex-12.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie [
<!ELEMENT librairie (livre+)>
<!ATTLIST librairie xmlns:html CDATA #FIXED
"http://www.w3c.org/TR/REC-html40/">
<!ELEMENT livre (titre, auteur, editeur)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>

www.asp -php.net By F.Remise alias Derf © 3/4


Initiation à XML – Part. 4 - 2003 - www.cti-formation.com

<!ELEMENT editeur (#PCDATA)>


]>

<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.

Insertion d'éléments XML dans un document HTML : Data Island


A l'inverse de ce que nous venons de voir dans la section précédente, il est possible d'insérer des
éléments/données XML au sein d'un document HTML/XHTML, on parle alors d'Ilots de données
(DataIsland).
Avec la technologie ActiveX de Microsoft il est possible d'insérer des données XML dans un
document HTML/XHTML :
var nomVariable = new ActiveXObject("Microsoft.XMLDOM");
nomVariable.load("URL document XML");

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>

ou comme ceci dans une document XHTML :


<xml id="nomIdentifiant" src="URL document 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.

Fin de cette quatrième étape.


Je vous donne rendez-vous très prochainement pour la suite :
XML Part 5 : Mise en forme et affichage d'un doc XML avec CSS

En attendant "XML-isez" bien vos données.


Fred.

www.asp -php.net By F.Remise alias Derf © 4/4


Initiation à XML – Part. 5 - 2003 - www.cti-formation.com

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.

M ISE EN FORME ET AFFICHAGE DE FICHIERS XML SUR LE W EB

Avec les CSS


Le but de cette section n'est pas de vous enseigner le langage des feuilles de styles en cascade
(CSS) que vous êtes sensé connaître, mais plutôt de vous montrer comment lier un document XML
et des éléments XML à une feuille de styles CSS.
Si les CSS ne sont ni la meilleure ni la plus puissante solution pour la mise en forme d'un
document XML, elles représentent, malgré tout, la solution la plus simple.
Pour lier un élément XML à un style, la première solution consiste en l'utilisation de l'attribut style
au sein de l'élément à formater. Pour que la mise en forme apparaisse, il est nécessaire de faire un
lien vers une feuille de styles fictive.
<nom_element style="attributs de style">
...
</nom_element>

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;

www.asp-php.net By F.Remise alias Derf © 2/3


Initiation à XML – Part. 5 - 2003 - www.cti-formation.com

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;
}

Listing du document XML : ex-13.xml


<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet href="ex-13.css" type="text/css"?>
<!DOCTYPE librairie [
...
]>
<librairie>
...
</librairie>

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.

www.asp-php.net By F.Remise alias Derf © 3/3


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

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.

M ISE EN FORME ET AFFICHAGE DE FICHIERS XML SUR LE W EB

Avec liaison de données : DSO XML


L'affichage d'un document XML avec la technique des liaisons de données (data binding) est en
fait une association de différentes technologies : HTML, DHTML, JScript, Ilots de données, scripts
utilisant le modèle objet DSO (Data Source Object), l'objet recordset ADO (ActiveX Data Object).
Les différentes techniques présentées dans cette section seront survolées. Je vous
rappelle que ce cours est une Initiation à XML et non une expertise ou une spécialisation
pour DSO, JScript, ADO ou encore DOM que vous aborderez dans la prochaine section.
C'est par souci d'intégrité et afin de vous apporter une connaissance et une vision globale
de la technologie XML que ces différents points sont abordés.
Tous ces points, y compris les technologies .NET, ASP et PHP pouvant être mentionnées
durant l'étude de ce chapitre, font l'objet de cours (et de supports) spécifiques.

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).

9 Etablir une liaison entre HTML et XML


C'est la technique des Ilots de données qui est utilisée.
J'ai délibérément rendu conforme mon document HTML à la norme XHTML (exemple 14)
et ceci, non pour vous embrouiller, mais plutôt pour vous familiariser avec cette re-
formulation du HTML qui, n'en doutez pas, sera monnaie courante dans un avenir très
proche en développement de pages Web.

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>

www.asp-php.net By F.Remise alias Derf © 2 / 12


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

9 Etablir une liaison entre des éléments HTML et XML


C'est le modèle objet DSO qui est utilisé pour faire cette liaison. DSO stocke les données XML
sous forme de jeu d'enregistrement (recordset). Pour être plus précis, l'objet recordset du DSO
XML est un objet recordset ADO, ce qui nous permettra d'avoir accès à toute une collection de
propriétés et de méthodes (bien connues des développeurs ASP) pour la gestion des
enregistrements.
Le DSO XML peut aussi renvoyer un objet DOMDocument par le biais de sa propriété
XMLDocument. Vous en apprendrez plus sur cette technique dans la prochaine section.
ƒ L'élément XML racine représente le jeu d'enregistrement
ƒ Chaque nœud enfants de l'élément racine représente un enregistrement
ƒ Et les sous éléments de ces nœuds enfants représentent les champs d'un enregistrement.

Ce modèle d'accès aux données nécessite l'utilisation d'attributs HTML spéciaux :


Liste des attributs spéciaux HTML/DSO
liste non exhaustive
Attribut Description
Permet de lier un élément HTML à un îlot de données XML. La
datasrc="#nom_id_source" valeur de l'attribut doit être le nom de l'identifiant ID qui a été
donné à l'îlot de données précédé du signe #.
Permet de lier un élément HTML à un élément XML. La valeur
datafld="nom_elmt"
de cet attribut doit être le nom de l'élément XML à lier.
Permet de paramétrer le nombre d'enregistrements XML à
datapagesize="val_num" afficher dans une table HTML pour la gestion de la pagination.
L'attribut attend une valeur numérique.
Avec l'option HTML, cet attribut force le navigateur à traiter les
dataformatas="html"
éléments HTML qui auraient été insérés dans un document
dataformatas="text"
XML. L'option TEXT est l'option par défaut.

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)>

Listing du document XML : ex-15.XML


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie SYSTEM "ex-15.dtd">
<librairie>
<livre>
<titre>CSS 2</titre>
<auteur>Daniel GLAZMAN</auteur>
<editeur>Eyrolles</editeur>
</livre>
<livre>

www.asp-php.net By F.Remise alias Derf © 3 / 12


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

<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>

www.asp-php.net By F.Remise alias Derf © 4 / 12


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

<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>

Listing du document HTML : ex-15.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="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>
...

www.asp-php.net By F.Remise alias Derf © 5 / 12


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

Voilà, le tour est joué et notre affichage est correct.

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)>

Listing du document XML : ex-16.xml


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE librairie SYSTEM "ex-16.dtd">
<librairie>
<livre>
<titre ISBN="2-212-09051-X">CSS 2</titre>
<auteur>Daniel GLAZMAN</auteur>
<editeur>Eyrolles</editeur>
</livre>
<livre>
<titre ISBN="2-84082-533-3">XML</titre>
<auteur>Michael J. YOUNG</auteur>
<editeur>Microsoft Press</editeur>
<collection>Formation à...</collection>
</livre>
<livre>
<titre ISBN="2-84082-865-0"
couverture="images/rcaspnet.jpg">ASP.Net</titre>
<auteur>Richard CLARK</auteur>
<editeur>Microsoft Press</editeur>

www.asp-php.net By F.Remise alias Derf © 6 / 12


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

<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>

www.asp-php.net By F.Remise alias Derf © 7 / 12


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

<titre ISBN="-">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 ISBN="-">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 ISBN="-">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>

Listing du document HTML : ex-16.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 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>

www.asp-php.net By F.Remise alias Derf © 8 / 12


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

<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>

Bon, ce n'est pas très joli à l'affichage mais le résultat est là !


Quelques explications s'imposent; Comme vous pouvez le voir, j'ai imbriqué des tables pour avoir
accès à mes attributs mais aussi aux multiples auteurs de certains enregistrements. Pour les
attributs de l'élément <titre></titre> j'aurais pu construire une table avec 3 cellules plutôt que
de faire 3 tables dans 3 cellules de la table principale. Mais je ne voulais pas m'ennuyer avec des
colspan.
Voyez comme il est simple d'afficher une image : <img datafld="nom_element ou
nom_attribut" />. L'attribut src de la balise <img /> est remplacé par datafld.
Il en est de même avec l'attribut href d'un lien, l'attribut value d'un champ de saisie,
l'attribut checked d'un bouton radio ou d'une case à cocher, etc.
La liaison d'un tag HTML avec un attribut XML se fait de la même manière qu'avec un
élément XML : datafld="nom_attribut".

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".

9 Pagination et manipulation d'un recordset


Une table liée à un recordset possède quelques méthodes permettant de gérer la pagination en
JScript.
Liste des méthodes d'une balise table
liée à un jeu d'enregistrement
Méthode Description

www.asp-php.net By F.Remise alias Derf © 9 / 12


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

firstPage() Méthode affichant la première page des enregistrements.

lastPage() Méthode affichant la dernière page des enregistrements.

nextPage() Méthode affichant la page suivante des enregistrements.

previousPage() Méthode affichant la page précédente des enregistrements.

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>

www.asp-php.net By F.Remise alias Derf © 10 / 12


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

</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

Méthode permettant l'ajout d'un enregistrement


recordset.addNew()
dans le jeu d'enregistrements du cache.
Méthode permettant la suppression d'un
recordset.delete() enregistrement dans le jeu d'enregistrements du
cache.
Méthode permettant un déplacement vers
recordset.move(valeur)
l'enregistrement spécifié.

Méthode permettant un déplacement vers le


recordset.moveFirst()
premier enregistrement.

Méthode permettant un déplacement vers le


recordset.moveLast()
dernier enregistrement.

Méthode permettant un déplacement vers


recordset.moveNext()
l'enregistrement suivant.

www.asp-php.net By F.Remise alias Derf © 11 / 12


Initiation à XML – Part.6 - 2003 - www.cti-formation.com

Méthode permettant un déplacement vers


recordset.movePrevious()
l'enregistrement précédent.

Propriété indiquant que l'on a atteint le début


recordset.BOF
d'un jeu d'enregistrement.

Propriété indiquant que l'on a atteint la fin d'un


recordset.EOF
jeu d'enregistrement.
Propriété permettant d'atteindre et d'extraire le
recordset.fields("nom_champ").value contenu d'un champ. fields est une collection
de tous les champs d'un enregistrement.

Ne pas oublier de préfixer recordset par l'identifiant de l'îlot de données :


rso16.recordset.move(8);

Les méthodes d'ajout et de suppression d'enregistrement (que je n'ai pas référencées


dans mon tableau) n'ont que peu d'intérêt. Elles n'agissent que sur la copie en cache des
enregistrements.

www.asp-php.net By F.Remise alias Derf © 12 / 12


Initiation à XML – Part. 7 – 2003 - www.cti-formation.com

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.

M ISE EN FORME ET AFFICHAGE DE FICHIERS XML SUR LE W EB

Avec le DOM XML


Cette section ne constitue ni une formation, ni un support à la programmation DOM, mais plutôt
une rapide présentation de ses possibilités.
Le modèle de programmation DOM (Document Object Model) permet, avec l'utilisation de scripts,
de gérer la mise en forme d'un document XML à partir d'une page HTML. Il est plus souple que le
modèle DSO car il permet l'affichage de tous types de documents XML, même ceux qui ne sont
pas structurés de façon symétrique. Il est composé d'objets, de propriétés et de méthodes
permettant la gestion des différents composants d'un document XML.

9 Liaison au document XML et récupération du nœud document :


Pour pouvoir agir sur un document XML avec le DOM il faut, dans un premier temps, que celui-ci
soit lié à la page HTML selon le principe des Ilots de données.
<xml id="nomIdentifiant" src="URL document 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>

9 Les objets d'un document XML :


Les différents composants d'un document XML sont représentés par des objets DOM. Dans la
terminologie DOM, ces différents objets sont appelés des nœuds.
Liste des principaux objets DOM pour un document XML
liste non exhaustive
Objet (type de nœud) Description

Document Représente le document XML dans sa totalité.

Element Représente un élément de l'arborescence.

Attribute Représente un attribut.


Représente le contenu texte d'un élément ou
Text
d'un attribut.

www.asp-php.net By F.Remise© alias Derf © 2/6


Initiation à XML – Part. 7 – 2003 - www.cti-formation.com

9 Propriétés et Méthodes des objets DOM XML :


Les objets n'auraient pas d'intérêt s'ils ne possédaient pas quelques propriétés et fonctions.

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

Contient le nœud racine du document


documentElement Document
XML.

url Document Renvoie l'URL du document XML.

Renvoie l'état du document XML lors du


chargement ou du traitement. Etats
readyState Document possibles : 0 => UNITIALIZED – 1 =>
LOADING – 2 => LOADED – 3 =>
INTERACTIVE – 4 => COMPLETED
Renvoie le nombre de nœuds d'une
NodeList - Attribute -
length collection ou le nombre de caractères
Text
dans le texte d'un nœud.
Contient la collection de tous les nœuds
attributes Propriété commune attributs d'un nœud parent. Le nom de
cette collection est : NamedNodeMap
attributes(numIndice)
Contient le nœud attribut dont l'indice a
ou Propriété commune
été spécifié en argument (à partir de 0).
attributes.item(numIndice)
Contient la collection de tous les nœuds
childNodes(numIndice) enfants (hors attributs) d'un nœud
ou Propriété commune parent dont l'indice a été spécifié en
childNodes.item(numIndice) argument (à partir de 0). Le nom de
cette collection est : NodeList
Contient le premier nœud enfant (hors
firstChild Propriété commune
attributs) d'un nœud parent.

Contient le dernier nœud enfant (hors


lastChild Propriété commune
attributs) d'un nœud parent.

Contient le nœud suivant d'un nœud de


nextSibling Propriété commune
même niveau.

Renvoie le nom du nœud courant. C'est


nodeName Propriété commune
à dire le nom de l'élément XML.

Renvoie le type du nœud courant.


nodeTypeString Propriété commune
(document, element, attribute,…)
Retourne la valeur du nœud.
nodeValue Propriété commune Essentiellement pour des nœuds de
type Attribute ou Text.
Contient le nœud parent du nœud
parentNode Propriété commune
courant (hors attributs).

www.asp-php.net By F.Remise© alias Derf © 3/6


Initiation à XML – Part. 7 – 2003 - www.cti-formation.com

Contient le nœud précédent d'un nœud


previousSibling Propriété commune
de même niveau.

Renvoie le contenu texte d'un nœud et


text Propriété commune
de tous ses descendants.

Renvoie le contenu XML d'un nœud et


xml Propriété commune
de tous ses descendants.

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

NodeList - Contient le nœud suivant de la


nextNode()
NamedNodeMap collection.

Contient le nœud dont l'attribut de type


nodeFromID("id") Document ID possède la valeur spécifiée en
argument.

Renvoie la valeur de l'attribut spécifié en


getAttribute("attr") Element
argument de l'élément courant.

Contient le nœud attribut dont le nom


getAttributeNode("attr") Element
est spécifié en argument.

Contient la collection de tous les nœuds


de type élément qui ont le nom de
Document - l'élément spécifié en argument pour
getElementsByTagName("elmt")
Element l'élément courant. Contient tous les
nœuds éléments et leur descendance si
l'argument est "*".

Contient le nœud attribut dont le nom a


getNamedItem("attr") NamedNodeMap été spécifié en argument pour la
collection NamedNodeMap courante.

www.asp-php.net By F.Remise© alias Derf © 4/6


Initiation à XML – Part. 7 – 2003 - www.cti-formation.com

9 Illustration par l'exemple de l'utilisation du DOM XML


Dans l'exemple suivant je vous propose d'afficher les livres, contenus dans le document XML ex-
16.xml, fiche par fiche avec deux boutons de navigation.
Le document XML étant identique à celui de l'exemple 16, je ne vous donne ici que le document
HTML.
Exemple 18 :
Listing du document HTML : ex-18.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" />
<script language="JavaScript" type="text/javascript">
i = 0;
function fDisplayLivre(){
doc = dso16.XMLDocument;
var strAuteur="";

//Récupération de tous les noeuds LIVRE du document


collectionlivre = doc.documentElement.getElementsByTagName("livre");
nbrlivre = collectionlivre.length;

i = (i>collectionlivre.length -1) ? collectionlivre.length -1 : i ;


i = (i<0) ? 0 : i ;

//Récupération du TITRE, de l'ISBN et de l'EDITEUR pour le livre courant


strTitre = collectionlivre.item(i).childNodes(0).text;
strISBN =
collectionlivre.item(i).childNodes(0).attributes(0).nodeValue;
strEditeur =
collectionlivre.item(i).getElementsByTagName("editeur").item(0).text;

//Récupération de tous les noeuds AUTEUR pour le livre courant


collectionauteur =
collectionlivre.item(i).getElementsByTagName("auteur");
nbrauteur = collectionauteur.length;
for(aut=0;aut<nbrauteur;aut++){
strAuteur = strAuteur + collectionauteur.item(aut).text + "<br />";
}

//Récupération de la de la COLLECTION si il y en a une pour le livre courant


if(collectionlivre.item(i).getElementsByTagName("collection").length!=0){
strCollection =
collectionlivre.item(i).getElementsByTagName("collection").item(0).text;
} else {
strCollection = "";
}

//Affichage de l'image de couverture si il y en a une pour le livre courant


if(collectionlivre.item(i).childNodes(0).attributes(1)!=null){
couverture.src =
collectionlivre.item(i).childNodes(0).attributes(1).nodeValue;
} else {
couverture.src = "images/blanc.gif";
}

//Affichage de l'ensemble des informations du livre courant

www.asp-php.net By F.Remise© alias Derf © 5/6


Initiation à XML – Part. 7 – 2003 - www.cti-formation.com

livre.innerHTML = "<span style='font: bold 14px;'>" + strTitre +


"</span><br />"
+ "<span>ISBN : </span><span style='color: #ff6900'>" +
strISBN + "</span><br />"
+ "<span>Auteur(s) : </span><br /><span style='font: bold
10px;'>" + strAuteur + "</span><br />"
+ "<span>Edition : </span><span>" + strEditeur +
"</span><br />"
+ "<span>Collection : </span><span>" + strCollection +
"</span>"

}
</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--)"> &lt;&lt; Livre
précédent</a>
</td>
<td style="font: 11px verdana" align="right">
<a href="#" onclick="fDisplayLivre(i++)">Livre suivant
&gt;&gt;</a>
</td>
</tr>
</table>
</body>
</html>

www.asp-php.net By F.Remise© alias Derf © 6/6


Initiation à XML – Part. 8 – 2003/2004 - www.cti-formation.com

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.

M ISE EN FORME ET AFFICHAGE DE FICHIERS XML SUR LE W EB

Avec XSL / XSL-T


La solution ultime pour l'affichage et la mise en forme de documents XML se nomme : XSL
(eXtensible Stylesheet Language). Avec XSL on a une maîtrise absolue sur le rendu d'un
document XML; Non seulement XSL permet de personnaliser la présentation des informations,
mais il permet aussi de choisir, d'organiser, de modifier, d'ajouter ou encore de trier et filtrer les
données. Avec XSL, on a un accès total à l'ensembles des éléments constituants d'un document
XML.
Dans cette section, je vais vous présenter les bases d'une sous spécification de XSL connue sous
l'acronyme XSL-T (XSL Transformation). En fait, XSLT transforme un document XML en document
HTML.
Un document XSL est un document XML bien formé respectant la sémantique XSL. Une
présentation XSL, permet d'allier la souplesse du HTML avec la richesse des styles CSS ainsi que
la puissance des scripts DOM.
D'autres transformations sont possibles avec XSL-T : XML vers SVG, XML vers WML et
avec la sous spécification XSL-FO : XML vers RTF, XML vers PDF.

9 Document XSL : Notions de base :


Une feuille de style XSL est un document texte qui doit être externe au document XML et porter
l'extension .xsl
Le document XSL doit contenir un prologue et un élément racine faisant référence à l'espace de
nom utilisé.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
</xsl:steelesheet>

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>

www.asp-php.net By F.Remise© alias Derf © 2/9


Initiation à XML – Part. 8 – 2003/2004 - www.cti-formation.com

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"?>

9 Eléments XSL – abréviations XPath - prédicats :


Je vous propose ici un rapide survol de quelques éléments XSL et de la syntaxe XPath abrégée à
travers plusieurs tableaux.
Eléments XSL de base
liste non exhaustive
Eléments Attributs Descriptions
Représente l'élément document et
identifie le document comme étant une
feuille de style.
version= "1.0"
<xsl:stylesheet> L'attribut version précise la version
xmlns:xsl="namespace"
de la spécification XSLT.
L'attribut xmlns:xsl précise l'espace
de nom utilisé.
Définit un modèle qui sera appliqué aux
branches de la hiérarchie du document
<xsl:template> match="pattern"
XML défini par le pattern de l'attribut
match.
Applique le modèle de transformation
aux descendants immédiats de
l'élément courant.
<xsl:apply-tempates> select="pattern"
L'utilisation de l'attribut select permet
de spécifier par un pattern les
descendants à traiter.
Permet de préciser le mode de sortie
method="HTML | XSL | de la transformation par le biais de
<xsl:output>
text" l'attribut method : soit HTML soit XML.
Le mode par défaut est XML.
Permet d'extraire le contenu de
<xsl:value-of> select="pattern" l'élément ou de l'attribut spécifié par le
pattern de l'attribut select.
Exécute un tri des nœuds en fonction
match="pattern" des critères définis par les attributs
select, order pour préciser le sens
order="ascending | (ascendant ou descendant) et data-
<xsl:sort> descending" type pour préciser la nature de la clé
de tri (texte ou numérique). L'élément
data-type="text | sort ne peut être qu'un enfant des
number" éléments <xsl:apply-template>
ou <xsl:for-each>.

www.asp-php.net By F.Remise© alias Derf © 3/9


Initiation à XML – Part. 8 – 2003/2004 - www.cti-formation.com

Définit un modèle pouvant être appliqué


<xsl:for-each> select="pattern" de façon répétitive aux nœuds spécifiés
par le pattern de l'attribut select.

Définit un traitement conditionnel dont


<xsl:if> test="expression" les termes sont définis par l'attribut
test.

Définit une liste d'options permettant de


choisir une possibilité parmi d'autres.
Chaque option est définie par un
<xsl:choose>
élément <xsl:when> et le traitement
par défaut par l'élément
<xsl:otherwise>.

Définit une option pour un élément


<xsl:when> test="expression" <xsl:choose> dont les termes sont
décrits par l'expression de l'attribut test.

Définit une option par défaut pour un


<xsl:otherwise>
élément <xsl:choose>.

Définit un nœud de type chaîne de


<xsl:text> caractères pour le document résultant
de la transformation.

Ajoute l'attribut spécifié par l'attribut


<xsl:attribute> name="attribut"
name à l'élément de sortie.

Définit une liste d'attributs identifiée par


<xsl:attribute-set> name="id"
le nom spécifié par l'attribut name.

Applique la liste d'attributs spécifiée par


<xsl:use> attribute-set="list" l'attribut attribute-set à l'élément
de sortie.

Quelques abréviations de la syntaxe XPath (chemin d'accès)


liste non exhaustive
Expressions Descriptions
/ Séparateur d'éléments.
ex: elmt1/elmt2 Utilisé seul, représente la racine du document XML.
//
Représente tous les descendants du nœud courant.
ex: //elmt
.
Représente le nœud courant.
ex: ./elmt
..
Représente le parent du nœud courant.
ex: ../elmt
[ ]
Précise une sélection de façon conditionnelle (prédicat).
ex: elmt[expression]
@
Représente l'attribut du nœud courant.
ex: elmt[@attribut="valeur"]
*
Représente tous les petits enfants du nœud courant
ex: */elmt

www.asp-php.net By F.Remise© alias Derf © 4/9


Initiation à XML – Part. 8 – 2003/2004 - www.cti-formation.com

Fonctions, prédicats, expressions et opérateurs


liste non exhaustive
Fonction Type Descriptif

Renvoie la position d'un enfant pour le


position() Fonction de nœuds.
nœud courant

Renvoie le nombre d'enfants pour le


last() Fonction de nœuds.
nœud courant

Renvoie le nombre de nœuds pour le


count(node) Fonction de nœuds.
nœud passé en argument

not(bool) Fonction booléenne. Renvoie l'inverse de l'argument

or Fonction booléenne. Expression logique OU

and Fonction booléenne. Expression logique ET

= Opérateur booléen. Teste une égalité

!= Opérateur booléen. Teste une différence

< Opérateur booléen. Teste une infériorité

> Opérateur booléen. Teste une supériorité

<= Opérateur booléen. Teste une infériorité ou une égalité

>= Opérateur booléen. Teste une supériorité ou une égalité

www.asp-php.net By F.Remise© alias Derf © 5/9


Initiation à XML – Part. 8 – 2003/2004 - www.cti-formation.com

9 Illustration par l'exemple de XSLT :


Les exemples qui suivent illustrent l'utilisation de certains éléments XSL. Tous ces exemples
utilisent le document XML ex-16.xml auquel on a ajouté une instruction de traitement permettant de
le lier aux documents XSL donnés en exemple.
Exemple 19 :
Ce premier exemple, très simple, applique à l'ensemble des nœuds enfants le modèle défini.
Listing du document XSL : ex-19a.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="*" />
</div>
</xsl:template>
</xsl:stylesheet>

Comme vous pouvez le constater le rendu n'est pas génial.

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>

Ici, j'affiche bien un titre mais un seul; celui du premier élément !

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>.

Listing du document XSL : ex-19c.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="/">
<xsl:apply-templates select="librairie/livre">
<xsl:sort select="titre" order="ascending" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="livre">
<span style="font: 10px verdana"><br />
<xsl:value-of select="titre" />
</span>
</xsl:template>
</xsl:stylesheet>

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.

Listing du document XSL : ex-19d.xsl


<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" mlns:xsl="http://www.w3.org/1999/XSL/Transform">

www.asp-php.net By F.Remise© alias Derf © 6/9


Initiation à XML – Part. 8 – 2003/2004 - www.cti-formation.com

<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.

Listing du document XSL : ex-19e.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="/">
<xsl:for-each select="librairie/livre[collection='ASP.Net - To the .Point !']">
<xsl:sort select="titre" order="descending" />
<span style="font: 10px verdana" />
<xsl:value-of select="titre" /><br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

J'aurais également pu utiliser un élément <xsl:if> pour arriver au même résultat.

Listing du document XSL : ex-19f.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="/">
<xsl:for-each select="librairie/livre">
<xsl:sort select="titre" order="descending" />
<xsl:if test="collection='ASP.Net - To the .Point !'">
<span style="font: 10px verdana" />
<xsl:value-of select="titre" /><br />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

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.

Listing du document XSL : ex-19g.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="/">
<xsl:for-each select="librairie/livre">
<xsl:sort select="titre" order="descending" />
<xsl:if test="titre[not(@couverture)]">
<span style="font: 10px verdana" />
<xsl:value-of select="titre" /><br />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

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 :,

www.asp-php.net By F.Remise© alias Derf © 7/9


Initiation à XML – Part. 8 – 2003/2004 - www.cti-formation.com

à l'aide de l'élément <xsl:text>, d'afficher le nom de l'auteur, et d'extraire l'attribut ISBN de


l'élément titre et tout cela uniquement pour les livres de R. Clark.

Listing du document XSL : ex-19h.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="/">
<xsl:for-each select="librairie/livre">
<xsl:sort select="titre" order="ascending" />
<xsl:if test="auteur='Richard CLARK'">
<span style="font: bold 10px verdana">
<xsl:text>Titre : </xsl:text>
<xsl:value-of select="titre" /><br />
</span>
<span style="font: 10px verdana">
<xsl:text>Auteur : </xsl:text>
<xsl:value-of select="auteur" /><br />
</span>
<span style="font: 10px verdana;color: red">
<xsl:text>ISBN : </xsl:text>
<xsl:value-of select="titre/@ISBN" /><br /><br />
</span>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

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é.

Listing du document XSL : ex-19i.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="/">
<xsl:for-each select="librairie/livre">
<xsl:sort select="titre" order="ascending" />
<xsl:if test="auteur!='Grégory RENARD' and auteur!='Frédéric REMISE'">
<span style="font: bold 10px verdana">
<xsl:text>Titre : </xsl:text>
<xsl:value-of select="titre" /><br />
</span>
<span style="font: 10px verdana;color: red">
<xsl:text>ISBN : </xsl:text>
<xsl:value-of select="titre/@ISBN" /><br />
</span>
<span style="font: 10px verdana">
<xsl:text>Auteur(s) : </xsl:text>
</span>
<xsl:for-each select=".//auteur">
<span style="font: 10px verdana">
<xsl:value-of select="." />
<xsl:if test="not(position()=last())">
<xsl:text> - </xsl:text>
</xsl:if>
</span>
<xsl:if test="@url">
<br />

www.asp-php.net By F.Remise© alias Derf © 8/9


Initiation à XML – Part. 8 – 2003/2004 - www.cti-formation.com

<a style="font: 10px verdana">


<xsl:attribute name="href">
http://
<xsl:value-of select="@url" />
</xsl:attribute>
Le site de l'auteur
</a>
</xsl:if>
</xsl:for-each>
<br />
<span style="font: italic 10px verdana;">
<xsl:text>Editeur : </xsl:text>
<xsl:value-of select="editeur" />
</span>
<br /><br />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Fin de la huitième étape.

www.asp-php.net By F.Remise© alias Derf © 9/9

Vous aimerez peut-être aussi