VIII.1 Problématique

 

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.3 Le DIT

 

On prend comme point départ quíaucun pays au monde ne possède le même système de numérotations. Il semble donc évident que le numéro de carte est líélément discriminent, personne n'aura le même. On peut le gérer comme un attribut de líélément carte.

 

Le DIT (Document Information Tree) est représenté ci-dessous.

 

AppleMark

 

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

 

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

 

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.

 

 

b. Le document XSL

 

ÿ    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

 

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

 

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 &gt; 1">

<LI>Prenoms</LI>

</xsl:if>

<xsl:if test="$nombre &lt; 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

 

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 &gt; et &lt;.

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

 

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 &gt; 1">

<LI>Prenoms</LI>

</xsl:if>

<xsl:if test="$nombre &lt; 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.

 

Xalan ño identite.html identite.xml identite.xsl

 

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