Un groupe díhôtels décide de stocker sa clientèle dans des fichiers informatiques. Ce stockage consiste en la conservation de données en rapport avec la carte díidentité du client.
Les hôtels du même groupe doivent pouvoir síéchanger ces
fichiers, les compléter Ö Le
format doit donc être strict, le faire en langage XML est retenu.
Ce fichier doit être sur líintranet du groupe sous forme
HTML avec un tri par nationalité ainsi que par nom dans chaque nationalité. Ce
deuxième tri est fat de manière décroissante.
VIII.2 Analyse
Une carte díidentité contient un certain nombre
díinformations.
On suppose que la CNIL a donné son accord à ce projet.
Les informations retenues sont :
ÿ
Le
numéro de la carte díidentité
ÿ
Le nom
de líindividu (deuxième niveau de tri)
ÿ
Le ou
les prénoms
ÿ
Le
sexe
ÿ
La
nationalité sur laquelle se base le premier niveau de tri
VIII.4 Réalisation
a. Le document
XML
Pour faire simple, la grammaire
(DTD) est directement insérée dans le document XML.
Nous allons créer un
document XML contenant 3 références díidentités.
ÿ
La partie entête et DTD
q
Le code source
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml
version="1.0" encoding="ISO8859-1" standalone="yes"?> <!DOCTYPE
identites [ <!ELEMENT
identites (carte+)> <!ELEMENT
carte (nom,prenoms,sexe,date_naissance,nationalite)> <!ATTLIST
carte numero CDATA #REQUIRED> <!ELEMENT
prenoms (prenom+)> <!ELEMENT
nom (#PCDATA)> <!ELEMENT
prenom (#PCDATA)> <!ELEMENT
sexe (#PCDATA)> <!ELEMENT
date_naissance (#PCDATA)> <!ELEMENT
nationalite (#PCDATA)> ]> |
q
Explications
Nƒ |
Explications |
1 |
Entête du document xml
indiquant le type de codage utilisé (encoding="ISO8859-1") ainsi que la non présence díune DTD externe (standalone="yes") |
2 |
Déclaration de la DTD
interne (<!DOCTYPE) avec
líindication de líélément racine de ce document xml (identites). Cette DTD interne se termine à la ligne 8 (]>). |
3 |
Déclaration de líélément identites
racine du document. Cet élément contient de 1
à n éléments carte (carte+). On retrouve cet élément
dans la déclaration de la DTD ligne 2. |
4 |
Déclaration de líélément
de niveau 2 carte. Chaque
élément carte contient les
éléments suivants nom, prenoms, sexe,
date_naissance et nationalite. De plus à líélément carte est associé un attribut (numero) déclaré à la ligne 5. |
5 |
Déclaration indiquant que
líélément carte possède un
attribut numero. Cet attribut
doit toujours être présent (#REQUIRED). |
6 |
Déclaration de líélément prenoms lui-même composé de sous éléments prenom (voir le DIT point VIII.3). líélément prenoms est composé de 1 à n sous-élements prenom (prenom+). |
8-11 |
Déclaration des éléments
de niveau 2 composant líélément carte. Ces éléments ne contiennent que du
texte ((#PCDATA). |
12 |
Fin de la déclaration de
la DTD (]>). |
ÿ
Description díune carte
q
Le code source
14 15 16 17 18 19 20 21 22 23 24 25 |
<identites> <carte
numero="00112233"> <nom>Mouse</nom> <prenoms> <prenom>Mickey</prenom> <prenom>Arthur</prenom> </prenoms> <sexe>M</sexe> <date_naissance>09/04/1949</date_naissance> <nationalite>Americaine</nationalite> </carte> |
q
Explications
Nƒ |
Explications |
14 |
Insertion de líélément
racine. Cet élément ne peut être présent quíune seule fois. Il doit être
fermé à la fin du document XML (ligne 46). |
15 |
Insertion díun élément
carte. Cet élément un attribut numero. Cet attribut possède la valeur 00112233. Cet élément níest pas
vide, il contient díautres éléments. Il se termine ligne 24. |
16 |
Description de líélément nom. Cet élément est composé uniquement de texte comme
líindique la DTD. |
17-20 |
Description de
l ëélément prenoms
contenant lui-même des sous-éléments prenom. Cette description se termine ligne 20 par la
fermeture de líélément prenoms.
Dans cette carte, líindividu du nom de Mouse possède deux prénoms Mickey et
Arthur. Cela crée donc un sous-arbre constitué de deux éléments prenom. Ces deux sous-éléments prenom sont des fils de líélément prenoms. |
21 |
Description de líélément
sexe. La valeur pour cet individu est M pour masculin. |
22 |
Description de líélément
date_naissance. La valeur pour cet individu est 09/04/1949. |
23 |
Description de líélément
nationalite. La valeur pour cet individu est Americaine. |
24 |
Fin de la description
díune carte díidentité pour un individu. |
ÿ
Le document XML complet
Ce document décrit 3 carte
díidentités.
Cela permet de tester et
díeffectuer le tri sur a nationalité et sur le nom indiqué lors de la
problématique.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?xml
version="1.0" encoding="ISO8859-1"
standalone="yes"?> <!DOCTYPE
identites [ <!ELEMENT
identites (carte+)> <!ELEMENT
carte (nom,prenoms,sexe,date_naissance,nationalite)> <!ATTLIST
carte numero CDATA #REQUIRED> <!ELEMENT
prenoms (prenom+)> <!ELEMENT
nom (#PCDATA)> <!ELEMENT
prenom (#PCDATA)> <!ELEMENT
sexe (#PCDATA)> <!ELEMENT
date_naissance (#PCDATA)> <!ELEMENT
nationalite (#PCDATA)> ]> <identites> <carte
numero="00112233"> <nom>Mouse</nom> <prenoms> <prenom>Mickey</prenom> <prenom>Arthur</prenom> </prenoms> <sexe>M</sexe> <date_naissance>09/04/1949</date_naissance> <nationalite>Americaine</nationalite> </carte> <carte
numero="408989"> <nom>Simpson</nom> <prenoms> <prenom>March</prenom> </prenoms> <sexe>F</sexe> <date_naissance>20/12/1959</date_naissance> <nationalite>Americaine</nationalite> </carte> <carte
numero="18989"> <nom>Le
gaullois</nom> <prenoms> <prenom>Asterix</prenom> </prenoms> <sexe>M</sexe> <date_naissance>20/01/1953</date_naissance> <nationalite>Francaise</nationalite> </carte> </identites> |
La validité de ce document
xml est testée en utilisant le validateur du W3C.
Vous avez deux
possibilités :
ÿ
Address : ce choix
vous oblige à mettre votre document xml sur internet pour que le validateur
puisse y accéder. Si vous possédez une DTD externe vous devez aussi la mettre
sur internet et modifier líentête de votre document XML en indiquant líadresse
web de cette DTD (Voir exemples suivants).
ÿ
Local File : en
cliquant sur Browse, vous accédez à votre disque local. Il suffit díaller y
chercher votre document XML. Attention, vous ne pouvez avoir de DTD externe
dans ce cas.
Si aucune erreur níest
détectée, vous devez obtenir un message indiquant que votre document est
valide.
ÿ
La partie entête
q
Le code source
1 2 3 4 5 6 |
<?xml
version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"> <xsl:output
method="html" indent="yes"/> |
q
Explications
Nƒ |
Explications |
1 |
Code qui débute le
document XSL. Souvenez vous quíun document XSL níest rien díautre quíun
document XML. Vous retrouvez donc le même début que dans le document XML. |
3-4 |
Déclaration du
´ rôle ª du document, transformation en feuille de style avec
líutilisation díune notation NameSpace (espace de noms) xmlns. |
5 |
Indication du type de
sortie. Il en existe 3 xml, html et text. En fonction du type de sortie
choisie, certains éléments comme les espaces, les balises ne seront pas
exactement gérés de la même façon. Par exemple, en sortie html, un élément
<BR/> sera transformé en <BR></BR> en sortie xml il restera
dans la syntaxe xml <BR/>. |
ÿ
La première phase de
transformation
q
Le code source
7 8 9 10 11 12 13 14 15 16 17 18 19 |
<xsl:template
match="identites"> <HTML><HEAD><TITLE>Cartes
d'identites</TITLE></HEAD> <BODY> <OL
TYPE="1"> <xsl:apply-templates
select="carte"> <xsl:sort
select="nationalite"/> <xsl:sort
select="nom" order="descending"/> </xsl:apply-templates> </OL> </BODY> </HTML> </xsl:template> |
q
Explications
Nƒ |
Explications |
7 |
Cette règle permet de
sélectionner un núud, en líoccurrence la racine et díeffectuer des
transformations. Cette première sélection permet généralement de générer le
code HTML de déclaration de la page HTML. Les éléments qui ne vont pas être
répétés (<BODY> Ö). Cette partie de
transformation se termine par la fermeture de la balise en ligne 30. |
8-10 |
Génération du code HTML
caractéristique díun page HTML. Le résultat provenant des identites étant
inséré dans une liste, la balise OL ne doit être dans ce cas présente quíune
fois díoù son apparition à ce niveau. |
11 |
Avant de faire
líaffichage et la récupération des contenus des identites il est nécessaire
díeffectuer un tri. Ce tri doit se placer avant líextraction des contenus
díune carte sinon il ne peut être fait. En effet une fois descendu dans
líarborescence caractérisant une carte, cette carte est déjà sélectionnée. La
première sélectionnée par défaut est la première trouvée dans le document
XML. Il faut donc bien trier avant la descente. Cette règle ne peut être
incluse que dans une apply-templates. Grâce à cette règle, les núuds carte
sont sélectionnés. Rappelez vous que lorsque une règle est rencontrée, tous
les núuds concernés sont ´ balayés ª. Il va bien y avoir une sélection de tous les núuds, un tri
et ensuite le passage aux autres règles. |
12 |
Cette règle permet le
tri. Nous sommes au niveau des noeuds carte dans líarborescence. Le tri doit
se faire sur a nationalité. Cet élément est un fils direct de líélément carte
(núud courant à ce moment de la transformation). Il suffit donc de
sélectionner pour le tri líélément nationalite. |
13 |
Le tri dans cet exemple
est double, sur la nationalité mais aussi sur le nom dans un deuxième temps. Ce deuxième tri est
effectué grâce à cette règle. Il faut se rappeler quíà
ce niveau, la position dans líarbre est au niveau des núuds carte. La
sélection se fait donc sur les fils que sont nationalite et nom (niveau
select). Le tri doit être décroissant, díoù líutilisation de líoption order
et de la valeur descending associée. |
14 |
Cette ligne va de pair
avec la ligne 11. Elle est très importante et il faut bien voir sa portée.
Elle dit simplement de passer aux autres règles de transformation síil en
existe. A ce moment de la transformation, on passe non pas à líinsertion du
code de la ligne 15 mais à líapplication de la règle située ligne 20. Le code des lignes 15 à
17 ne sera inclus lors de la transformation que si toutes les autres règles
sont terminées. On retrouve donc bien ces codes HTML en fin du document html
créé. Avant cela vont síinsérer díautres codes html créés par les autres
règles. |
18 |
Fin de la règle de
transformation débutée ligne 7. |
ÿ
La deuxième phase de
transformation
q
Le code source
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<xsl:template
match="identites/carte"> <LI>Numero
de la carte <xsl:value-of select="@numero"/></LI> <OL
TYPE="a"> <LI>Nom
: <xsl:value-of select="nom"/></LI> <xsl:variable
name="nombre" select="count(prenoms/prenom)"/> <xsl:if
test="$nombre > 1"> <LI>Prenoms</LI> </xsl:if> <xsl:if
test="$nombre < 2"> <LI>Prenom</LI> </xsl:if> <UL> <xsl:for-each
select="prenoms/prenom"> <LI><xsl:value-of
select="name()"/> : <xsl:value-of
select="."/></LI> </xsl:for-each> </UL> <LI>Sexe
: <xsl:value-of select="sexe"/></LI> <LI>Nationalite
: <xsl:value-of select="nationalite"/></LI> </OL> <HR></HR> </xsl:template> |
q
Explications
Nƒ |
Explications |
20 |
Cette nouvelle règle va
síappliquer sur les núuds fils du núud identites à savoir carte. Cíest ce
quíindique la partie incluse dans le match. Souvenez vous bien que
précédemment la transformation est passée par la règle 1 qui a permis
notamment de créer la première balise OL qui va permettre de réaliser le
prermier niveau de numérotation. Cette règle se termine
ligne 42. Important : cette
règle va être utilisé autant de fois quíil y a díélément carte. Tous les
codes qui suivent vont être crées pour chaque élément carte rencontré. Dans
notre exemple, nous en avons 3. |
21 |
La transformation permet
díinsérer le premier niveau de numérotation, de type numérique, représentant
chaque individu (<LI>). Nous sommes au niveau des núuds carte. Le
numéro est donc récupéré directement dans líarborescence, il níest pas
nécessaire de se déplacer. Cette récupération est faite au moyen de la règle
(<xsl:value-of). |
22 |
Insertion díun
sous-niveau de numérotation concernant les informations de líindividu. Cette
liste sous forme alphabétique minuscule se termine ligne 40. |
23 |
Insertion du nom de
líindividu précédé par la numérotation. |
25 |
Un individu peut posséder
de 1 à n prénoms. La présentation nécessite de connaître ce nombre pour
afficher le texte Prenoms (avec un s) ou Prenom. Pour cela on stocke cette
valeur dans une variable qui permet ensuite de faire un test pour líaffichage
correct. La variable se nomme
nombre et elle contient le ´ comptage ª du nombre de núuds prenom contenu dans líélément prenoms de la carte en cours de traitement. |
27-29 |
Test pour déterminer si
la valeur de la variable nombre est
plus grande que la valeur 1 cela signifie que líindividu en cours de
traitement possède plusieurs prénoms. Le texte précédent ces prénoms sera
Prenoms. Rappel : Les caractères > et
< représentant généralement le supérieur et líinférieur dans les tests
numériques sont des éléments du langage XML, ils sont remplacés par >
et <. |
30-32 |
Cette partie fonctionne
comme le test précédent. Le test síeffectue sur une valeur inférieure à 2 ce
qui indique que líindividu ne possède quíun seul prénom. |
33 |
Une fois le nombre connu,
la liste du ou des prénoms est créée avec líinsertion de la balise UL. Cette
balise se termine en ligne 37, une fois le ou les prénoms récupérés. |
34-36 |
Au moyen díune boucle, on
récupère tous les prénoms de líindividu. Le núud courant est carte, il est
donc nécessaire de descendre dans líarborescence (prenoms/prenom). |
35 |
Récupération du nom de la
balise en cours de traitement (prenom) suivi de deux points (:) et de la
valeur du prénom. Ces éléments sont précédés par líinsertion díune puce
(<LI>). |
36 |
Fin de la boucle
for-each. |
37 |
Fin de la sous-liste à
puce commencée ligne 33. |
38 |
Récupération et insertion
de la valeur de la balise sexe. |
39 |
Récupération et insertion
de la valeur de la balise nationalite. |
40 |
Fin de la liste numérique
débutée ligne 22 concernant un individu. |
41 |
Insertion de la balise
<HR> permettant líinsertion après chaque ´ fiche ª individu
díune ligne séparatrice. |
42 |
</xsl:stylesheet> |
ÿ
Fin de la transformation
q
Le code source
44 |
</xsl:stylesheet> |
q
Explications
Nƒ |
Explications |
44 |
Cette instruction est la
dernière du document XSL et elle clos cette transformation. |
ÿ
Le document XSL complet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?xml
version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"> <xsl:output
method="html" indent="yes"/> <xsl:template
match="identites"> <HTML><HEAD><TITLE>Cartes
d'identites</TITLE></HEAD> <BODY> <OL
TYPE="1"> <xsl:apply-templates
select="carte"> <xsl:sort
select="nationalite"/> <xsl:sort
select="nom" order="descending"/> </xsl:apply-templates> </OL> </BODY> </HTML> </xsl:template> <xsl:template
match="identites/carte"> <LI>Numero
de la carte <xsl:value-of select="@numero"/></LI> <OL
TYPE="a"> <LI>Nom
: <xsl:value-of select="nom"/></LI> <xsl:variable
name="nombre" select="count(prenoms/prenom)"/> <xsl:if
test="$nombre > 1"> <LI>Prenoms</LI> </xsl:if> <xsl:if
test="$nombre < 2"> <LI>Prenom</LI> </xsl:if> <UL> <xsl:for-each
select="prenoms/prenom"> <LI><xsl:value-of
select="name()"/> : <xsl:value-of
select="."/></LI> </xsl:for-each> </UL> <LI>Sexe
: <xsl:value-of select="sexe"/></LI> <LI>Nationalite
: <xsl:value-of select="nationalite"/></LI> </OL> <HR></HR> </xsl:template> </xsl:stylesheet> |
c. Le document
html
La transformation est effectuée en utilisant le logiciel
Xalan.
Le résultat de la transformation donne le fichier html qui
suit.
Le tri est bien effectué par nom.
<HTML> <HEAD> <META
http-equiv="Content-Type" content="text/html;
charset=UTF-8"> <TITLE>Cartes
d'identites</TITLE> </HEAD> <BODY> <OL
TYPE="1"> <LI>Numero de la
carte 408989</LI> <OL
TYPE="a"> <LI>Nom :
Simpson</LI> <LI>Prenom</LI> <UL> <LI>prenom :
March</LI> </UL> <LI>Sexe :
F</LI> <LI>Nationalite :
Americaine</LI> </OL> <HR> <LI>Numero de la
carte 00112233</LI> <OL
TYPE="a"> <LI>Nom :
Mouse</LI> <LI>Prenoms</LI> <UL> <LI>prenom :
Mickey</LI> <LI>prenom :
Arthur</LI> </UL> <LI>Sexe :
M</LI> <LI>Nationalite :
Americaine</LI> </OL> <HR> <LI>Numero de la
carte 18989</LI> <OL
TYPE="a"> <LI>Nom : Le
gaullois</LI> <LI>Prenom</LI> <UL> <LI>prenom :
Asterix</LI> </UL> <LI>Sexe :
M</LI> <LI>Nationalite :
Francaise</LI> </OL> <HR> </OL> </BODY> </HTML> |
d. Le visuel