Un collectionneur díimages de trains désire créer un petit
document XML pour afficher par ordre alphabétique les photos de ces trains
ainsi quíune légende. Ce document est finalement proposé sous format HTML sur
le web.
Pour corser un peu líexercice la présentation doit se faire
en ajoutant un numéro díordre à la légende et en couplant les images par
lignes. Lorsque líinternaute clique sur líimage, celle ñci síaffiche dans sa
taille díorigine dans une autre fenêtre.
VII.2 Analyse
Le document XML doit proposer pour chaque train :
ÿ
Son
nom
ÿ
Sa
photo
On suppose que les images sont au même niveau que le
document html final.
ÿ
photo
VII.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 4 références de trains.
ÿ
La partie entête et DTD
q
Le code source
1 2 3 4 5 6 7 8 |
<?xml
version="1.0" encoding="ISO8859-1"
standalone="yes"?> <!DOCTYPE TRAINS [ <!ELEMENT TRAINS (train+)> <!ELEMENT train EMPTY> <!ATTLIST train photo CDATA
#REQUIRED nom CDATA #REQUIRED> ]> |
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 (TRAINS). Cette DTD interne se termine à la ligne 8 (]>). |
3 |
Déclaration de líélément TRAINS
racine du document. Cet élément contient de 1
à n éléments train (train+). On retrouve cet élément
dans la déclaration de la DTD ligne 2. |
4 |
Déclaration de líélément
de niveau 2 train. Chaque
élément train ne contient pas
díélément. Il est vide (EMPTY). Par contre à líélément sont associés deux
attributs déclarés aux lignes 5,6 et 7. |
5 |
Déclaration indiquant que
líélément train possède un ou plusieurs attributs. |
6 |
Déclaration de líattribut
photo qui doit toujours être
présent (#REQUIRED) comme composant de líélément train. |
7 |
Déclaration de líattribut
nom qui doit toujours être
présent (#REQUIRED) comme composant de líélément train. |
8 |
Fin de la déclaration de
la DTD (]>). |
ÿ
Description díun train
q
Le code source
9 10 11 Ö 15 |
<TRAINS> <train
photo="4019b.jpg" nom="BigBoy 4019"/> Ö </TRAINS> |
q
Explications
Nƒ |
Explications |
10 |
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 15). |
11 |
Insertion díun élément
train. Cet élément possède deux attributs : ÿ
photo qui possède la
valeur 4019b.jpg ÿ
nom qui possède la
valeur BigBoy 4019 Líélément est vide comme
líindique la DTD díoù sa fermeture à la fin de la ligne (/>). |
15 |
Fin du document XML avec
la fermeture de líélément racine (</TRAINS>). |
ÿ
Le document XML complet
Ce document décrit 4
trains.
Cela permet de tester et
díeffectuer le tri sur le nom indiqué lors de la problématique.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml
version="1.0" encoding="ISO8859-1"
standalone="yes"?> <!DOCTYPE
TRAINS [ <!ELEMENT
TRAINS (train+)> <!ELEMENT
train EMPTY> <!ATTLIST
train photo CDATA #REQUIRED nom CDATA #REQUIRED> ]> <TRAINS> <train
photo="4019b.jpg" nom="BigBoy 4019"/> <train
photo="4004.jpg" nom="BigBoy 4004"/> <train
photo="eurostargner.jpg" nom="TGV eurostar"/> <train
photo="tgv_se_2.jpg" nom="TGV sud-est"/> </TRAINS> |
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 20 21 22 23 24 25 26 27 28 29 30 31 |
<xsl:template
match="TRAINS"> <HTML><HEAD></HEAD><BODY> <CENTER> <TABLE> <TR> <TD
ALIGN="CENTER"> <FONT
SIZE="5"><U>La page des Trains</U></FONT> <BR/> Cliquez
sur les images pour les agrandir <BR/> </TD> </TR> <TR> <TD
ALIGN="CENTER"> <xsl:apply-templates
select="train"> <xsl:sort
select="@nom"/> </xsl:apply-templates> </TD> </TR> </TABLE> </CENTER> </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-20 |
Génération du code HTML
caractéristique díun page HTML. Le résultat provenant des trains étant inséré
dans un tableau, la balise TABLE ne doit être dans ce cas présent quíune fois
díoù son apparition à ce niveau. |
21 |
Avant de faire
líaffichage et la récupération des contenus des trains il est nécessaire
díeffectuer un tri. Ce tri doit se placer avant líextraction des contenus
díun train sinon il ne peut être fait. En effet une fois descendu dans
líarborescence caractérisant un train ce train est déjà sélectionné. Le
premier sélectionné par défaut est le premier trouvé 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 train 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
en ensuite le passage aux autres règles. |
22 |
Cette règle permet le
tri. Nous sommes au niveau des noeuds train dans líarborescence. Le tri doit
se faire sur le nom. Cet élément est un fils direct de líélément train (núud
courant à ce moment de la transformation). Il suffit donc de sélectionner
pour le tri líélément nom. |
23 |
Cette ligne va de pair
avec la ligne 21. Elle est très importante et il faut bien voir sa portée.
Elle dit simplement de passer aux autres règles de transformation si il en
existe. A ce moment de la transformation, on passe non pas à líinsertion du
code de la ligne 24 mais à líapplication de la règle située ligne 32. Le code des lignes24 à 29
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. |
30 |
Fin de la règle de
transformation débutée ligne 7. |
ÿ
La deuxième phase de
transformation
q
Le code source
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<xsl:template
match="TRAINS/train"> <FONT
COLOR="green"><xsl:number value="position()"/> :
</FONT> <xsl:value-of
select="@nom"/> <A
TARGET="autre"> <xsl:attribute
name="HREF"> <xsl:value-of
select="@photo"/></xsl:attribute> <IMG
width="200" ALIGN="MIDDLE"> <xsl:attribute
name="SRC"> <xsl:value-of
select="@photo"/></xsl:attribute> </IMG> </A> <xsl:if
test="position() mod 2 = 0"> <BR/> <BR/> </xsl:if> </xsl:template> |
q
Explications
Nƒ |
Explications |
32 |
Cette nouvelle règle va
síappliquer sur les núuds fils du núud TRAINS à savoir train. 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 balise TABLE. Cette règle se termine
ligne 48. Important : cette
règle va être utilisé autant de fois quíil y a díélément train. Tous les
codes qui suivent vont être crées pour chaque élément train rencontré. Dans
notre exemple, nous en avons 4. |
33-35 |
Création dans la cellule
du tableau des éléments légende en texte vert avec le numéro díordre. |
33 |
On insère le numéro
díordre en calculant la position
du núud train en cours et ceci après le tri de la règle 1. |
35 |
On ajoute à la légende le
contenu de líattribut nom associé à líélément train. |
36-43 |
Insertion de líimage et
du lien hypertexte qui permet en cliquant sur líimage de taille définie (200
pixels) díouvrir une autre fenêtre contenant líimage taille réelle. Il níest
pas possible de créer directement une balise HTML avec ses options du fait de
la présence de caractères XML tels < et >. On peut être tenté
díutiliser la syntaxe suivante : <A
HREF="<xsl:value-of select=\"@photo\"/>">lien</A> Hélas vous aurez une
erreur indiquant que le premier < doit être fermé avant díen ouvrir un
deuxième. Il faut donc utiliser la
règle xsl:attribute. |
36 |
Insertion du lien
hypertexte incluant líoption TARGET pour líaffichage dans une autre fenêtre
du lien indiqué dans la partie HREF. |
37 |
Utilisation e la règle
xsl:attribute pour insérer lors e la transformation à la balise A (Ancre)
líoption HREF qui va contenir líadresse de líimage taille réelle. Cette image
se situe au même niveau que le futur fichier HTML. |
38 |
Le nom de líimage est
contenu dans líattribut photo. Il est récupéré via la règle xsl:value-of Ö |
39 |
Insertion à líintérieur
du lien hypertexte de líimage avec une taille fixe de 200 pixels (option
width de la balise IMG). Líoption ALIGN est aussi
ajoutée afin que la légende soit alignée par rapport à líimage. Là aussi, líinclusion de
líoption SRC doit être faite grâce à la règle xsl:attribute. |
40 |
Insertion de líoption
SRC. |
41 |
Ajout de la valeur à
líoption SRC. Cette valeur est associée à líattribut photo de líélément
courant train. |
42 |
Fermeture de la balise
IMG. |
43 |
Fermeture de la balise A. |
44-47 |
Les images doivent
apparaître par deux sur une ligne ; Il est donc nécessaire toutes les
deux images de passer à la ligne dans la cellule du tableau, |
44 |
La fonction position()
rencontrée ligne 33 permet de compter et de numéroter les images affichées.
Il suffit donc de faire un test pour savoir si ce chiffre est un multiple de
2. si cíest le cas, il faut passer à la ligne. Si le reste de la
division par 2 est 0 le chiffre est bien un multiple de 2 díoù líinsertion du
bloc de test. |
45-46 |
Insertion de deux balises
BR permettant un saut de ligne. Cette balise est vide. Lors de la
transformation, du fait de la méthode demandée (ligne 5), <BR/> est
transformé en <BR></BR>. |
47 |
Fin du bloc de test. |
48 |
Fin de la règle 2. |
ÿ
Fin de la transformation
q
Le code source
50 51 |
</xsl:stylesheet> |
q
Explications
Nƒ |
Explications |
51 |
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 45 46 47 48 49 50 51 |
<?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="TRAINS"> <HTML><HEAD></HEAD><BODY> <CENTER> <TABLE> <TR> <TD
ALIGN="CENTER"> <FONT
SIZE="5"><U>La page des Trains</U></FONT> <BR/> Cliquez
sur les images pour les agrandir <BR/> </TD> </TR> <TR> <TD
ALIGN="CENTER"> <xsl:apply-templates
select="train"> <xsl:sort
select="@nom"/> </xsl:apply-templates> </TD> </TR> </TABLE> </CENTER> </BODY> </HTML> </xsl:template> <xsl:template
match="TRAINS/train"> <FONT
COLOR="green"><xsl:number value="position()"/> :
</FONT> <xsl:value-of
select="@nom"/> <A
TARGET="autre"> <xsl:attribute
name="HREF"> <xsl:value-of
select="@photo"/></xsl:attribute> <IMG
width="200" ALIGN="MIDDLE"> <xsl:attribute
name="SRC"> <xsl:value-of
select="@photo"/></xsl:attribute> </IMG> </A> <xsl:if
test="position() mod 2 = 0"> <BR/> <BR/> </xsl:if> </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"> </HEAD> <BODY> <CENTER> <TABLE> <TR> <TD
ALIGN="CENTER"><FONT SIZE="5"><U>La page
des Trains</U></FONT> <BR> Cliquez sur les images
pour les agrandir <BR> </TD> </TR> <TR> <TD
ALIGN="CENTER"> <FONT
COLOR="green">1 : </FONT>BigBoy 4004 <A
TARGET="autre" HREF="4004.jpg"> <IMG
width="200" ALIGN="MIDDLE" SRC="4004.jpg"> </A> <FONT
COLOR="green">2 : </FONT>BigBoy 4019 <A TARGET="autre"
HREF="4019b.jpg"> <IMG
width="200" ALIGN="MIDDLE" SRC="4019b.jpg"> </A> <BR> <BR> <FONT
COLOR="green">3 : </FONT>TGV eurostar <A
TARGET="autre" HREF="eurostargner.jpg"> <IMG
width="200" ALIGN="MIDDLE"
SRC="eurostargner.jpg"> </A> <FONT
COLOR="green">4 : </FONT>TGV sud-est <A
TARGET="autre" HREF="tgv_se_2.jpg"> <IMG
width="200" ALIGN="MIDDLE"
SRC="tgv_se_2.jpg"> </A> <BR> <BR> </TD> </TR> </TABLE> </CENTER> </BODY> </HTML> |
d. Le visuel
Si vous cliquez sur líimage 1 :