Le service de líétat civil díune grande ville désire réaliser un document permettant de suivre un individu de sa naissance à sa mort.
A partir de ce document, des recherches peuvent être
réalisées. De plus, des transformations en HTML doivent être possible afin de
proposer la visualisation de ces fiches dans líintranet de la mairie.
Ce système doit pouvoir síétendre aux autres villes de
France, voir plus.
IX.2 Analyse
La première étape est de déterminer quels sont les éléments
qui caractérisent la vie civile díun individu et líimbrication de ces éléments
les uns dans les autres et les uns par rapport aux autres.
En vrac de quoi à priori a-t-on besoin ?
ß
naissance
(parents, date, lieu)
ß
Nom
ß
Prénom(s)
ß
Date
du décès
ß
Sexe
ß
Enfant(s)
ß
Adresse
ß
Numéro
de sécurité social
ß
Etat
civil (marié, veuf, célibataire, pacsé)
Un individu
possède un seul nom cíest son nom patronymique. Si cíest une femme mariée, elle
possède un nom marital.
Par contre, il peut posséder plusieurs prénoms, líun est
principal, les autres sont secondaires.
Un individu, síil est toujours vivant, ne possède pas de
date de décès ou alors celle-ci est vide. Dans ce cas, líadresse la aussi níest
pas à indiquer ou alors elle est vide.
Un individu possède ou non un ou des enfants.
Líindividu possède un père et une mère, il est nécessaire
díen connaître les noms et prénoms principaux ainsi que la date de naissance.
On peut prendre le numéro de sécurité sociale comme
identifiant unique. Il sera insérer comme attribut de líélément individu.
On peut découper les informations díun individu en
quatre zones :
ÿ
Son
identité (sexe, nom patronymique, nom marital, prénoms, date de naissance, date
de décès)
ÿ
Ses
parents (nom du père, prénom principal du père, date de naissance du père, nom
de la mère, prénom principal de la mère, date de naissance de la mère)
ÿ
Sa
situation familiale (état civil, enfants)
ÿ
Son
adresse
Il est nécessaire, comme je líai signalé précédemment, de
réaliser un schéma de líarborescence de ce document xml.
La discussion sur le numéro de sécurité social a déjà eu lieu dans le point précédent.
IX.4 Réalisation
a. Le document
XML
Cet exemple est plus
complet et plus complexe que les précédents. Pour cette raison, pour une
meilleure lisibilité ainsi que pour montrer une autre méthode, la DTD níest pas
directement incluse dans le fichier XML mais est externe.
Nous allons créer un
document XML contenant 2 individus.
ÿ
La partie entête et DTD
q
Le code source
1 2 3 4 |
<?xml
version="1.0" encoding="ISO8859-1"
standalone="no"?> <!DOCTYPE
ens_individu PUBLIC "Jacquenod/etatcivil/DTD" "http://www.jacquenod.fr/XML/individu.dtd"> |
q
Explications
Nƒ |
Explications |
1 |
Entête du document xml
indiquant le type de codage utilisé (encoding="ISO8859-1") ainsi que la déclaration díune DTD externe (standalone="no") |
2-3 |
Déclaration de la DTD
externe (<!DOCTYPE) avec
líindication de líélément racine de ce document xml (ens_individu). Cette DTD est déclarée en
PUBLIC. On suppose quíelle est
mise à disposition díautres utilisateurs sur internet. Il est donc nécessaire
díy ajouter un texte explicatif Jacquenod/etatcivil/DTD qui rend líensemble unique. La DTD est utilisable à
líadresse web http://www.jacquenod.fr/XML/individu.dtd. Líintérêt de donner ce type díadresse est aussi de
pouvoir utiliser le validateur du W3C en ligne. La DTD est ainsi consultable
et le validateur peut fonctionner car il a besoin de pouvoir ´ télécharger ª
la DTD. |
ÿ
Description díun
individu
q
Le code source
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 |
<ens_individu
ville="Nantes"> <individu
numero_secu="1640444100345"> <identite
sexe="M"> <nom_patronymique>Jonnav</nom_patronymique> <prenoms> <prenom_principal>Laurent</prenom_principal> <prenom_secondaire>François</prenom_secondaire> <prenom_secondaire>Martin</prenom_secondaire> </prenoms> <date_naissance>19/04/1964</date_naissance> </identite> <parents> <pere> <nom_patronymique_pere>Jonnav</nom_patronymique_pere> <prenom_principal_pere>Philippe</prenom_principal_pere> <date_naissance_pere>31/02/1943</date_naissance_pere> </pere> <mere> <nom_jeune_fille_mere>Turbault</nom_jeune_fille_mere> <prenom_principal_mere>Annie</prenom_principal_mere> <date_naissance_mere>10/06/1944</date_naissance_mere> </mere> </parents> <situation_familiale
etatcivil="marie"> <enfants> <fils>Jonnav
André</fils> <fils>Jonnav
Charles</fils> <fille>Jonnav
France</fille> </enfants> </situation_familiale> <adresse>Saint
Brevin</adresse> </individu> |
q
Explications
Nƒ |
Explications |
5 |
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 76). Cet élément racine
possède un attribut ville qui
permet de définir la ville díapplication de ce document (ici Nantes). |
6 |
Insertion díun élément
individu. Cet élément possède un attribut numero_secu. Cet attribut a la valeur 1640444100345. Cet élément níest pas
vide, il contient díautres éléments. Il se termine ligne 39. |
8-16 |
Insertion
de líélément identite est de ses sous-éléments. |
8 |
Description
de líélément identité. Cet élément est composé díautres éléments comme líindique la DTD
(voir DTD). Cet élément
possède un attribut sexe qui peut prendre les valeurs M ou F (Voir DTD) |
9 |
Description de líélément
texte nom_patronymique. |
10-14 |
Insertion des prénoms de
líindividu via líélément prenoms.
|
11 |
Líindividu possède un
prénom principal décrit par líélément prenom_principal. |
12-13 |
Líindividu possède deux
prénoms secondaires décrit par líélément prenom_secondaire. |
14 |
Fin de description de
líélément prenoms. |
15 |
Insertion de líélément
texte date_naissance. |
16 |
Fin de la description de
líidentité de líindividu |
18-29 |
Insertion de líélément parents qui contient les informations du père et de la mère
de líindividu. |
19-23 |
Informations en rapport
avec le père insérées via les éléments suivants : nom_patronymique_pere,
prenom_principal_pere et date_naissance_pere. |
24-28 |
Informations en rapport
avec la mère insérées via les éléments suivants : nom_patronymique_mere,
prenom_principal_mere et date_naissance_mere. |
29 |
Fin de description de
líélément parents. |
31-37 |
Insertion de líélément situation_familiale qui contient les informations sur les enfants de
líindividu insérées via les éléments fils et/ou fille. Líélément situation_familiale contient en plus un attribut etatcivil qui permet de déterminer si líindividu est marié,
célibataire, veuf ou pacsé (Voir DTD). |
32-36 |
Description des enfants.
Ici líindividu possède deux fils et une fille. |
37 |
Fin de description de la
situation familiale de líindividu via la fermeture de líélément situation_familiale. |
38 |
Insertion de líélément adresse
qui contient le lieu díhabitation
de líindividu. |
39 |
Fin de description de cet
individu. |
A partir de la ligne 42 est
décrit le deuxième individu.
Cette description se
termine ligne 74 par la fermeture de líélément individu.
Le document XML se termine
par la fermeture de líélément racine ens_individu ligne 76.
ÿ
Le document XML complet
Ce document décrit 2
individus.
Cela permet de tester et
díeffectuer le tri.
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
<?xml
version="1.0" encoding="ISO8859-1"
standalone="no"?> <!DOCTYPE
ens_individu PUBLIC "Jacquenod/etatcivil/DTD" "http://www.jacquenod.fr/XML/individu.dtd"> <ens_individu
ville="Nantes"> <individu
numero_secu="1640444100345"> <identite
sexe="M"> <nom_patronymique>Jonnav</nom_patronymique> <prenoms> <prenom_principal>Laurent</prenom_principal> <prenom_secondaire>François</prenom_secondaire> <prenom_secondaire>Martin</prenom_secondaire> </prenoms> <date_naissance>19/04/1964</date_naissance> </identite> <parents> <pere> <nom_patronymique_pere>Jonnav</nom_patronymique_pere> <prenom_principal_pere>Philippe</prenom_principal_pere> <date_naissance_pere>31/02/1943</date_naissance_pere> </pere> <mere> <nom_jeune_fille_mere>Turbault</nom_jeune_fille_mere> <prenom_principal_mere>Annie</prenom_principal_mere> <date_naissance_mere>10/06/1944</date_naissance_mere> </mere> </parents> <situation_familiale
etatcivil="marie"> <enfants> <fils>Jonnav
André</fils> <fils>Jonnav
Charles</fils> <fille>Jonnav
France</fille> </enfants> </situation_familiale> <adresse>Saint
Brevin</adresse> </individu> <!--
Deuxieme individu --> <individu
numero_secu="2341144100345"> <identite
sexe="F"> <nom_patronymique>Darte</nom_patronymique> <nom_marital>Paruton</nom_marital> <prenoms> <prenom_principal>Aline</prenom_principal> <prenom_secondaire>Gisele</prenom_secondaire> </prenoms> <date_naissance>23/11/1934</date_naissance> <date_deces>01/04/1989</date_deces> </identite> <parents> <pere> <nom_patronymique_pere>Darte</nom_patronymique_pere> <prenom_principal_pere>Jean</prenom_principal_pere> <date_naissance_pere>09/02/1839</date_naissance_pere> </pere> <mere> <nom_jeune_fille_mere>Fraise</nom_jeune_fille_mere> <prenom_principal_mere>Anemone</prenom_principal_mere> <date_naissance_mere>04/03/1845</date_naissance_mere> </mere> </parents> <situation_familiale
etatcivil="veuf"> <enfants> <fille>Darte
Fanny</fille> </enfants> </situation_familiale> <adresse></adresse> </individu> </ens_individu> |
b. La DTD (Definition Type of Document)
La DTD est la grammaire du
document XML auquel elle est attachée. Elle indique dans quel ordre, de quel
contenu sont constitués les éléments et attributs décrits dans le document XML.
Pour mieux la comprendre, reportez vous au DIT décrit section IX.3.
ÿ
Le code source de la DTD
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 |
<!ELEMENT
ens_individu (individu*)> <!ATTLIST
ens_individu ville CDATA #REQUIRED> <!ELEMENT
individu (identite,parents,situation_familiale,adresse)> <!ATTLIST
individu numero_secu CDATA #REQUIRED> <!ELEMENT
identite
(nom_patronymique,nom_marital?,prenoms,date_naissance,date_deces?)> <!ATTLIST
identite sexe (M|F) #REQUIRED> <!ELEMENT
nom_patronymique (#PCDATA)> <!ELEMENT
nom_marital (#PCDATA)> <!ELEMENT
prenoms (prenom_principal,prenom_secondaire*)> <!ELEMENT
prenom_principal (#PCDATA)> <!ELEMENT
prenom_secondaire (#PCDATA)> <!ELEMENT
date_naissance (#PCDATA)> <!ELEMENT
date_deces (#PCDATA)> <!ELEMENT
parents (pere,mere)> <!ELEMENT
pere (nom_patronymique_pere,prenom_principal_pere,date_naissance_pere)> <!ELEMENT
nom_patronymique_pere (#PCDATA)> <!ELEMENT
prenom_principal_pere (#PCDATA)> <!ELEMENT
date_naissance_pere (#PCDATA)> <!ELEMENT
mere (nom_jeune_fille_mere,prenom_principal_mere,date_naissance_mere)> <!ELEMENT
nom_jeune_fille_mere (#PCDATA)> <!ELEMENT
prenom_principal_mere (#PCDATA)> <!ELEMENT
date_naissance_mere (#PCDATA)> <!ELEMENT
situation_familiale (enfants*)> <!ATTLIST
situation_familiale etatcivil (marie|celibataire|pacse|veuf) #REQUIRED> <!ELEMENT
enfants (fils*,fille*)> <!ELEMENT
fils (#PCDATA)> <!ELEMENT
fille (#PCDATA)> <!ELEMENT
adresse (#PCDATA)> |
q
Explications
Nƒ |
Explications |
1 |
Le premier élément a être
décrit est évidemment la racine du document XML. Cet élément est ens_individu. Cet élément peut contenir de 0 à n éléments individu (*). |
2 |
Líélément racine ens_individu possède aussi un attribut ville qui représente le nom de la ville auquel le
document síapplique. Cet attribut est obligatoire (#REQUIRED). |
3 |
Líélément individu sous élément de líélément racine ens_individu possède lui-même un certain nombre díélément. Ces
éléments doivent apparaître dans líordre suivant : identite, parents,
situation_familiale et enfin adresse. Ces sous-éléments sont obligatoires. |
4 |
Cet élément individu
possède un attribut obligatoire (#REQUIRED) : numero_secu. |
5-6 |
Parmi les sous-éléments
de líélément individu il y a identite. Son utilisation est définie à cette ligne. Il
possède à son tour des sous-éléments qui doivent apparaître dans líordre
suivant : nom_patronymique, nom_marital?, prenoms, date_naissance et enfin date_deces?. Les éléments nom_marital et date_deces sont facultatifs (?). |
7 |
Líélément identite possède un attribut obligatoire (#REQUIRED) sexe
qui peut prendre les valeurs M ou F (M|F). Cet attribut est obligatoire (#REQUIRED). |
8 |
Líélément nom_patronymique sous-élément de líélément identite ne contient que du texte (#PCDATA). |
9 |
Líélément nom_marital sous-élément de líélément identite ne contient que du texte (#PCDATA). Rappelons que cet élément est facultatif. |
10 |
Líélément prenoms, sous-élément de líélément identite, est constitué de deux éléments prenom_principal et prenom_secondaire*. Ces deux éléments doivent apparaître dans cet
ordre. Le premier (prenom_principal)
est obligatoire et ne peut
apparaître quíune fois. Le second (prenom_secondaire*) peut être présent de 0 à n fois (*). |
11-14 |
Définition des éléments prenom_principal, prenom_secondaire*, date_naissance et date_deces. Ces
quatres éléments sont des éléments qui ne contiennent que du texte (#PCDATA). Rappelons que date_deces?, est facultatif et que prenom_secondaire* peut être présent de 0 à n fois dans la définition
díun individu. |
15 |
Définition de líélément parents qui contient les informations concernant les
parents de líindividu. Cet élément contient les éléments pere et mere.
Ces deux éléments doivent être présent de manière obligatoire et dans cet
ordre. |
16-20 |
Définition de líélément pere qui contient trois éléments qui sont déclarés en
ligne 18, 19 et 20 et qui contiennent uniquement du texte. Ces 3 éléments
doivent être obligatoirement présent dans cet ordre. |
21-25 |
Définition de líélément mere qui contient trois éléments qui sont déclarés en
ligne 23, 24 et 25 et qui contiennent uniquement du texte. Ces 3 éléments
doivent être obligatoirement présent dans cet ordre. |
26 |
Définition de líélément situation_familiale qui contient 1 élément (enfants*). Cet dernier peut être présent de 0 à n
fois. Líélément contient aussi
un attribut etatcivil déclaré
ligne 27-28. |
27-28 |
Líattribut etatcivil possède obligatoirement un contenu qui doit être
líun de ceux présents dans la liste définie ligne 27 (marie|celibataire|pacse|veuf). Cet attribut doit obligatoirement être présent (#REQUIRED). |
29-31 |
Définition de líélément enfants obligatoirement présent. Cet élément peut contenir
de 0 à n éléments textes fils
et/ou de 0 à n éléments filles.
Ces deux éléments textes optionnels sont définis lignes 30 et 31. |
32 |
Définition du dernier
élément adresse. Cet élément ne
contient que du texte. Il se trouve au niveau 1 du DIT. |
c. La Validation
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.
La validation est faite en
utilisant la première via le Web. Cette partie va être détaillée en utilisant
des copies écran.
Remarque
Lorsque vous transformez
votre document via Xalan, par exemple, la phase 1 est automatiquement réalisée.
Une analyse du fichier XML est faite et si il y a des erreurs celles-ci seront
indiquées.
ÿ
Phase 1
Chargement de líURL et
indication de líadresse du fichier XML. Ce fichier ainsi que la DTD doit être
accessible via internet pour que la validation puisse se faire.
ÿ
Phase 2
Si la page XML et la DTD ne
contiennent pas díerreur de syntaxe, et si le fichier XML respecte cette DTD,
vous obtenez la page suivante.
ÿ
Vous pouvez aussi
obtenir plus díinformations en cliquant sur ces liens ou en les activant en
phase1.
Vous devez cliquer sur les
boutons pour effectuer vos choix. Vous pouvez aussi forcer le codage et le
Doctype (html1.0, XHTML1.0 Ö).
Si je choisis les options
suivantes, jíobtiens des résultats en plus à líécran comme líarborescence (voir
ci-après).
ÿ
La partie entête
q
Le code source
1 2 3 4 5 6 |
<?xml
version="1.0" encoding="ISO-8859-1"?> <!-- Entete pour la
transformation avec Xalan --> <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 32 |
<!-- Traitement du
noeud ens_individu --> <xsl:template
match="ens_individu"> <!-- Mise en forme de
l'entete avec inclusion du nom de la ville --> <HTML><HEAD> <TITLE>Etat civil de
la ville de <xsl:value-of select="@ville"/></TITLE> </HEAD> <BODY> <CENTER> <!-- Mise en forme de
l'entete avec inclusion le corps du document HTML --> <!-- avec inclusion du
nom de la ville --> <TABLE><TR><TD
ALIGN="CENTER"> <FONT
COLOR="green" SIZE="5"> <U><B>Etat
civil de la ville de la ville de <xsl:value-of
select="@ville"/> </B></U></FONT> </TD> </TR> </TABLE> <!-- Tri des fiches par
ordre alphabetique sur le nom_patronymique --> <xsl:apply-templates
select="individu"> <xsl:sort
select="identite/nom_patronymique"/> </xsl:apply-templates> </CENTER> </BODY> </HTML> </xsl:template> |
q
Explications
Nƒ |
Explications |
8 |
Cette règle permet de
sélectionner un núud, en líoccurrence la racine (ens_individu) 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 31. |
10-13 |
Insertion des balises de
structure habituelle díune page HTML (<HTML>, <HEAD>,
<TITLE> et <BODY>). |
11 |
Lors de líinsertion de la
balise <TITLE>, le texte composant le titre de la page contient le nom
de la ville auquel le fichier XML est associé. Pour se faire, la règle <xsl:value-of
select="@ville"/> est
utilisée. Elle permet de récupérer líattribut ville du núud courant. Ce núud est la racine à ce moment
de la transformation à savoir : ens_individu. |
17-23 |
Insertion dans la page
HTML, résultat de la transformation, díun tableau en début de document, qui
contient la même information que celle insérée dans le titre (voir Ligne 11).
Ce titre ne doit apparaître quíune seule fois dans tout le document HTML díoù
son insertion à ce moment de la transformation. |
19 |
Insertion du nom de la
ville grâce à líutilisation de la même règle quíen ligne 11. |
25-27 |
Ces trois lignes vont
permettre de sélectionner tous les núuds individu contenus dans ce fichier XML et de leurs appliquer
les règles de transformation suivantes (ligne 33). Le traitement se fait en
triant les ´ fiches ª. |
25 |
Cette règle permet de
sélectionner les núuds individu
et de leurs appliquer les règles suivantes avant de terminer líapplication de
la règle en cours. |
26 |
Avant díappliquer les
autres règles, un tri est effectué pour une présentation du document HTML par
ordre alphabétique des noms patronymiques. |
27 |
Une fois toutes les
autres règles du document XSL appliquées à tous les núuds individu, la fin de cette règle est appliquée. |
28-30 |
Insertion des balises de
fin du document HTML. Ces balises sont insérées une fois que tous les
éléments de toutes les autres règles sont eux mêmes insérés. |
31 |
Fin de la règle de
transformation débutée ligne 8. |
ÿ
La deuxième phase de
transformation
Cette
deuxième règle commence ligne 33 et se termine ligne 166.
Pour
une question de visibilité, elle est décomposée en sous partie correspondant à
chaque niveau 2 du DIT à savoir les fils de líélément individu (identite, parents, situation_familiale et adresse).
v
Début et fin de la règle
q
Code source
33 34 35 36 Ö 166 |
<xsl:template
match="individu"> <TABLE> <TR> <TD
ALIGN="CENTER" COLSPAN="2"> Ö </xsl:template> |
q
Explications
Nƒ |
Explications |
33 |
Début de la règle de
transformation. Cette règle síapplique à líélément sélectionné à savoir individu. |
34-36 |
Insertion des première
balises HTML qui permettent de définir le tableau qui contient les infos de
líuindividu. |
166 |
Fin de líapplication de
cette règle. Un fois passé ce ´ cap ª, la transformation reprend au
niveau de la première règle (Ligne 28). |
v
Transformation de la
partie identité et adresse
q
DIT
Cette partie est la
transformation de la branche correspondant à líélément identite et la branche correspondant à líélément adresse du document XML (Voir la partie du DIT correspondante
ci-dessous).
|
|
q
Code source
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
<TABLE
BORDER="1"> <TR> <TD
ALIGN="CENTER" COLSPAN="2" BGCOLOR="yellow"> <B><xsl:number
value="position()"/>. Identite <FONT
COLOR="green"> <xsl:value-of
select="identite/nom_patronymique"/> <xsl:text>
</xsl:text> <xsl:value-of
select="identite/prenoms/prenom_principal"/> </FONT> </B></TD> </TR> <xsl:for-each
select="identite/nom_patronymique"> <TR> <TD
ALIGN="left">Nom Patronymique</TD> <TD
ALIGN="left"><xsl:value-of
select="."/></TD> </TR><TR> <TD
ALIGN="left">Prenoms Principal</TD> <TD
ALIGN="left"><xsl:value-of
select="../prenoms/prenom_principal"/></TD> </TR><TR> <TD
ALIGN="left">Prenoms secondaires</TD> <TD
ALIGN="left"> <xsl:for-each
select="../prenoms/prenom_secondaire"> <xsl:value-of
select="."/> <xsl:if
test="position()!=last()"><xsl:text>
</xsl:text></xsl:if> </xsl:for-each> </TD> </TR> </xsl:for-each> <xsl:if
test="identite/nom_marital"> <TR><TD
ALIGN="left">Nom marital</TD> <TD
ALIGN="left"><xsl:value-of
select="identite/nom_marital"/></TD> </TR> </xsl:if> <TR> <TD
ALIGN="left">Date de naissance </TD> <TD
ALIGN="left"><xsl:value-of
select="identite/date_naissance"/></TD> </TR> <xsl:if test="identite/date_deces"> <TR><TD
ALIGN="left">Date du deces</TD> <TD
ALIGN="left"><xsl:value-of
select="identite/date_deces"/></TD> </TR> </xsl:if> <TR> <xsl:choose> <xsl:when
test="identite/@sexe='F'"> <TD
ALIGN="left">Sexe</TD> <TD
ALIGN="left">Féminin</TD> </xsl:when> <xsl:otherwise> <TD
ALIGN="left">Sexe</TD> <TD
ALIGN="left">Masculin</TD> </xsl:otherwise> </xsl:choose> </TR><TR> <TD
ALIGN="left">Adresse</TD> <TD
ALIGN="left"><xsl:value-of
select="adresse"/></TD> </TR> </TABLE> </TD> <!-- Fin partie identite
--> |
q
Explications
Rappel
La position dans
líarborescence est toujours au niveau de líélément individu.
Nƒ |
Explications |
37-94 |
Insertion du tableau qui
contient les informations en rapport avec la branche identité et adresse.
Ce tableau est lui-même inséré dans les cellules du tableau définit dans la
règle 1. |
38-47 |
Insertion de la première
ligne sur fond jaune dans laquelle sont insérées les informations
suivantes : numéro díordre, nom patronymique et prénom principal. |
40 |
Le numéro díordre est la
position de la fiche de líindividu suite au tri sur le nom patronymique. A
chaque traitement díun nouveau núud, la fonction position() renvoie ce numéro
díordre. |
42 |
Récupération du nom
patronymique de líindividu. |
43 |
Ajout díun espace entre
le premier contenu récupéré (nom patronymique) et le second (prénom
principal). |
44 |
Récupération du prénom
principal de líindividu. |
48-64 |
On va récupérer toutes
les informations correspondant à líidentité de líindividu. Toutes les
recherches pour toutes les règles incluses dans ces lignes vont se baser sur
la position du núud nom_patronymique. |
48 |
La première boucle níest
pas forcément utile. En effet, líutilisateur ne peut avoir quíun nom
patronymique. |
49-52 |
Insertion du nom
patronymique. La ligne 51 permet de récupérer cette valeur. Cet élément est
un sous élément díindividu. Il
est important à ce moment de bien voir où nous sommes situés dans
líarborescence, cela va conditionner les autres recherches. |
53-55 |
Insertion du prénom
principal. La ligne 54 permet de
récupérer cette valeur. Pour atteindre cet élément, étant donné le
positionnement actuel dans líarbre (Voir ci-dessus). Il est nécessaire de
remonter díun cran pour pouvoir ensuite redescendre vers líélément prenoms
puis prenom_secondaire. |
56-63 |
Insertion des prénoms
secondaires de líindividu. |
58-61 |
Líindividu peut posséder
plusieurs prénoms secondaires, díoù la nécessité de la boucle pour tous les
récupérer. La boucle prend comme base de recherche et comme positionnement
dans líarbre, le núud prenom_secondaire. |
59 |
Nous sommes au niveau du
núud prenom_secondaire. La
récupération de son contenu ne nécessite donc pas de déplacement dans
líarbre. |
60 |
Chaque prénom est séparé
par un espace sauf si, le prénom est le dernier de líindividu. Pour se faire
il est nécessaire de tester si líélément prenom_secondaire traité est ou non
le dernier. La fonction position() renvoie le numéro díordre de líélément en
cours de traitement. La fonction last() renvoie elle le numéro díorde du
dernier élément en cours de traitement. Il suffit donc de tester si ce qui
est renvoyé par ces deux fonctions est identiques ou non. |
61 |
Fin de la boucle
récupérant et traitant tous les prénoms secondaires de líindividu. |
64 |
Fin de la boucle traitant
les núuds nom_patronymique. |
65-69 |
On ajoute le nom marital
de líindividu si ce núud existe. A ce moment de la
transformation, nous sommes au niveau du núud individu (Nous sommes à nouveau dépendant de la règle ligne
33). |
70-73 |
Insertion des
informations en rapport avec líélément date_naissance. La ligne 72 permet díinsérer la valeur associée à
líélément date_naissance.
Rappelons que nous sommes au niveau du núud individu. Il est donc nécessaire de se déplacer dans
líarborescence pour se positionner au niveau du bon núud. Pour cela il faut
descendre, comme le montre la partie du DIT correspondant (voir ci-dessus),
au niveau du núud identite puis date_naissance. |
74-78 |
Insertion des
informations en rapport avec líélément date_deces. La particularité de cet élément est quíil peut
être présent ou non. Il est donc nécessaire de tester sa présence pour
líindividu en cours de traitement (individu courant). Le bloc de test <xsl:if
test est donc utilisé. Si líélément
(núud) est présent celui-ci est inséré dans une nouvelle ligne du tableau
sinon, on passe aux contenus suivants du traitement. |
79-90 |
Le document final en HTML
indique si líindividu est de sexe Féminin ou Masculin. Mais dans le document XML source, cette information est associée à
un attribut de líélément identite
qui est sexe et ceci sous la
forme F ou M. Il faut donc transformer cette notation. Pour se
faire la règle <xsl:choose>
permet de tester la valeur contenue dans líattribut sexe de líélément identite et ainsi de créer la ligne correspondante avec le
bon texte. Le test portant sur la valeur F est effectuée ligne 81, le deuxième test est en
fait líéquivalent díun default (ligne
85). En effet si le sexe níest pas F il ne peut être que M (voir DTD). |
90-93 |
Insertion de
líinformation correspondant à líélément adresse. Cet élément est un fils direct de líélément individu. |
94 |
Fermeture de la balise TABLE ouverte ligne 37. |
95 |
Fermeture de la balise TD ouverte ligne 36. |
v
Transformation de la
partie parents
q
DIT
Cette partie est la
transformation de la branche correspondant à líélément parents du document XML (Voir la partie du DIT correspondante
ci-dessous).
q
Code source
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
<!-- Debut partie
Parents --> </TR><TR> <TD> <TABLE BORDER="1"> <TR><TD
ALIGN="CENTER" COLSPAN="2" BGCOLOR="yellow"> <B>Parents</B></TD></TR> <TR><TD
ALIGN="left"><U>Nom</U> Prenom du pere</TD> <TD
ALIGN="left"> <xsl:value-of
select="parents/pere/nom_patronymique_pere"/> <xsl:text>
</xsl:text> <xsl:value-of select="parents/pere/prenom_principal_pere"/></TD>
</TR><TR> <TD
ALIGN="left">Date de naissance du pere</TD> <TD
ALIGN="left"> <xsl:value-of
select="parents/pere/date_naissance_pere"/></TD> </TR><TR> <TD
ALIGN="left"><U>Nom</U> Prenom de la mere</TD> <TD ALIGN="left"> <xsl:value-of
select="parents/mere/nom_jeune_fille_mere"/> <xsl:text>
</xsl:text> <xsl:value-of
select="parents/mere/prenom_principal_mere"/></TD> </TR><TR> <TD
ALIGN="left">Date de naissance de la mere</TD> <TD
ALIGN="left"> <xsl:value-of select="parents/mere/date_naissance_mere"/></TD>
</TR> </TABLE> </TD> <!-- Fin partie Parents
--> |
q
Explications
Rappel
La position dans
líarborescence est toujours au niveau de líélément individu.
Nƒ |
Explications |
100-125 |
Insertion de la cellule
qui contient le tableau comportant les informations en rapport avec líélément
parent. |
101 |
Ouverture du tableau. |
104-113 |
Insertion des
informations en rapport avec le père de líindividu courant. Ces informations
sont situées dans les éléments nom_patronymique_pere, prenom_principal_pere et date_naissance_pere. |
107 |
Ajout díun espace entre
le nom et le prénom. Cet espace est inséré grâce à la règle <xsl:text>. |
113-123 |
Insertion des
informations en rapport avec la mère de líindividu courant. Ces informations
sont situées dans les éléments nom_patronymique_mere, prenom_principal_mere et date_naissance_mere. |
117 |
Ajout díun espace entre
le nom et le prénom. Cet espace est inséré grâce à la règle <xsl:text>. |
124 |
Fermeture de la balise TABLE insérée ligne 101. |
125 |
Fermeture de la balise TD
insérée ligne 100. |
v
Transformation de la
partie situation familiale
Cette transformation
correspond à líélément situation_familiale.
q
DIT
Cette partie est la
transformation de la branche correspondant à líélément Ö. du document XML (Voir
la partie du DIT correspondante ci-dessous).
q
Code source
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
<!-- Debut partie
Situation Familiale --> <TD> <TABLE
BORDER="1"> <TR> <TD
ALIGN="CENTER" COLSPAN="2" BGCOLOR="yellow"> <B>Etat
Civil</B></TD> </TR><TR> <TD
ALIGN="left">Situation familiale</TD> <TD
ALIGN="left"> <xsl:value-of
select="situation_familiale/@etatcivil"/></TD> </TR> <xsl:for-each
select="situation_familiale/enfants/fils"> <TR> <TD
ALIGN="left">fils</TD> <TD
ALIGN="left"> <xsl:value-of
select="."/> <xsl:if
test="position()!=last()"> <xsl:text>
</xsl:text> </xsl:if> </TD> </TR> </xsl:for-each> <xsl:for-each
select="situation_familiale/enfants/fille"> <TR> <TD
ALIGN="left">fille</TD> <TD
ALIGN="left"> <xsl:value-of
select="."/> <xsl:if
test="position()!=last()"> <xsl:text>
</xsl:text> </xsl:if> </TD> </TR> </xsl:for-each> </TABLE> </TD> </TR> </TABLE> <HR></HR> <!-- Fin partie Situation
Familiale --> |
q
Explications
Rappel
La position dans
líarborescence est toujours au niveau de líélément individu.
Nƒ |
Explications |
128-161 |
Insertion des
informations en rapport avec la situation familiale de líindividu courant. |
133-137 |
Insertion de la valeur
correspondant à líattribut etatcivil de líindividu. Cet attribut fait partie de líélément situation_familiale. |
138-148 |
Insertion des
informations portant sur les fils de líindividu courant. Líélément
correspondant est fils. Cet
élément peut être présent ou non. Afin díinsérer tous les contenus, une
boucle est utilisée. Cette boucle permet de récupérer tous les núuds indiqués
dans le select du for-each pour líindividu courant. Les informations sont
rangées dans une cellule du tableau. Un espace (ligne 144) est ajouté en fin
de nom si líélément fils en cours de traitement (selection ligne 142) níest
pas le dernier (test ligne 143 à 145). Ce dernier point níest pas très utile
sauf si vous décidez de mettre toutes les informations les unes derrière les
autres sur la même ligne, cela permet de les séparer (autre choix de
présentation). |
149-159 |
La même démarche que pour
le traitement des éléments fils
est faite pour le traitement des éléments fille. |
160 |
Fermeture de la balise TABLE
ouverte ligne 129. |
161 |
Fermeture de la balise TD
ouverte ligne 128. |
162 |
Fermeture de la balise TR
ouverte ligne 99. |
163 |
Fermeture de la balise TABLE
ouverte ligne 34. |
164 |
Insertion díune ligne
séparatrice entre les tableaux descriptifs de chaque individu. |
166 |
Fin de la deuxième règle
de présentation. |
ÿ
Fin de la transformation
q
Le code source
167 |
</xsl:stylesheet> |
q
Explications
Nƒ |
Explications |
167 |
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
<?xml
version="1.0" encoding="ISO-8859-1"?> <!-- Entete pour la
transformation avec Xalan --> <xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"> <xsl:output
method="html" indent="yes"/> <!-- Traitement du
noeud ens_individu --> <xsl:template
match="ens_individu"> <!-- Mise en forme de
l'entete avec inclusion du nom de la ville --> <HTML><HEAD> <TITLE>Etat civil de
la ville de <xsl:value-of select="@ville"/></TITLE> </HEAD> <BODY> <CENTER> <!-- Mise en forme de
l'entete avec inclusion le corps du document HTML --> <!-- avec inclusion du
nom de la ville --> <TABLE><TR><TD
ALIGN="CENTER"> <FONT
COLOR="green" SIZE="5"> <U><B>Etat
civil de la ville de la ville de <xsl:value-of select="@ville"/> </B></U></FONT> </TD> </TR> </TABLE> <!-- Tri des fiches par
ordre alphabetique sur le nom_patronymique --> <xsl:apply-templates
select="individu"> <xsl:sort
select="identite/nom_patronymique"/> </xsl:apply-templates> </CENTER> </BODY> </HTML> </xsl:template> <xsl:template
match="individu"> <TABLE> <TR><TD
ALIGN="CENTER" COLSPAN="2"> <TABLE
BORDER="1"> <!-- Debut partie
identite --> <TR> <TD
ALIGN="CENTER" COLSPAN="2" BGCOLOR="yellow"> <B><xsl:number
value="position()"/>. Identite <FONT
COLOR="green"> <xsl:value-of
select="identite/nom_patronymique"/> <xsl:text>
</xsl:text> <xsl:value-of
select="identite/prenoms/prenom_principal"/> </FONT> </B></TD> </TR> <xsl:for-each
select="identite/nom_patronymique"> <TR> <TD
ALIGN="left">Nom Patronymique</TD> <TD
ALIGN="left"><xsl:value-of
select="."/></TD> </TR><TR> <TD
ALIGN="left">Prenoms Principal</TD> <TD
ALIGN="left"><xsl:value-of
select="../prenoms/prenom_principal"/></TD> </TR><TR> <TD
ALIGN="left">Prenoms secondaires</TD> <TD
ALIGN="left"> <xsl:for-each select="../prenoms/prenom_secondaire"> <xsl:value-of
select="."/> <xsl:if
test="position()!=last()"><xsl:text>
</xsl:text></xsl:if> </xsl:for-each> </TD> </TR> </xsl:for-each> <xsl:if
test="identite/nom_marital"> <TR><TD
ALIGN="left">Nom marital</TD> <TD ALIGN="left"><xsl:value-of
select="identite/nom_marital"/></TD> </TR> </xsl:if> <TR> <TD
ALIGN="left">Date de naissance </TD> <TD
ALIGN="left"><xsl:value-of
select="identite/date_naissance"/></TD> </TR> <xsl:if
test="identite/date_deces"> <TR><TD
ALIGN="left">Date du deces</TD> <TD
ALIGN="left"><xsl:value-of
select="identite/date_deces"/></TD> </TR> </xsl:if> <TR> <xsl:choose> <xsl:when
test="identite/@sexe='F'"> <TD
ALIGN="left">Sexe</TD> <TD
ALIGN="left">Féminin</TD> </xsl:when> <xsl:otherwise> <TD ALIGN="left">Sexe</TD> <TD
ALIGN="left">Masculin</TD> </xsl:otherwise> </xsl:choose> </TR><TR> <TD
ALIGN="left">Adresse</TD> <TD
ALIGN="left"><xsl:value-of
select="adresse"/></TD> </TR> </TABLE> </TD> <!-- Fin partie
identite --> <!-- Debut partie
Parents --> </TR><TR> <TD> <TABLE
BORDER="1"> <TR><TD
ALIGN="CENTER" COLSPAN="2" BGCOLOR="yellow"> <B>Parents</B></TD></TR> <TR><TD
ALIGN="left"><U>Nom</U> Prenom du pere</TD> <TD
ALIGN="left"> <xsl:value-of
select="parents/pere/nom_patronymique_pere"/> <xsl:text> </xsl:text> <xsl:value-of
select="parents/pere/prenom_principal_pere"/></TD> </TR><TR> <TD
ALIGN="left">Date de naissance du pere</TD> <TD
ALIGN="left"> <xsl:value-of
select="parents/pere/date_naissance_pere"/></TD> </TR><TR> <TD
ALIGN="left"><U>Nom</U> Prenom de la mere</TD> <TD
ALIGN="left"> <xsl:value-of
select="parents/mere/nom_jeune_fille_mere"/> <xsl:text>
</xsl:text> <xsl:value-of
select="parents/mere/prenom_principal_mere"/></TD> </TR><TR> <TD
ALIGN="left">Date de naissance de la mere</TD> <TD ALIGN="left"> <xsl:value-of
select="parents/mere/date_naissance_mere"/></TD> </TR> </TABLE> </TD> <!-- Fin partie Parents
--> <!-- Debut partie
Situation Familiale --> <TD> <TABLE
BORDER="1"> <TR> <TD
ALIGN="CENTER" COLSPAN="2" BGCOLOR="yellow"> <B>Etat Civil</B></TD> </TR><TR> <TD
ALIGN="left">Situation familiale</TD> <TD
ALIGN="left"> <xsl:value-of
select="situation_familiale/@etatcivil"/></TD> </TR> <xsl:for-each
select="situation_familiale/enfants/fils"> <TR> <TD
ALIGN="left">fils</TD> <TD
ALIGN="left"> <xsl:value-of
select="."/> <xsl:if
test="position()!=last()"> <xsl:text>
</xsl:text> </xsl:if> </TD> </TR> </xsl:for-each> <xsl:for-each
select="situation_familiale/enfants/fille"> <TR> <TD
ALIGN="left">fille</TD> <TD
ALIGN="left"> <xsl:value-of
select="."/> <xsl:if
test="position()!=last()"> <xsl:text>
</xsl:text> </xsl:if> </TD> </TR> </xsl:for-each> </TABLE> </TD> </TR> </TABLE> <HR></HR> <!-- Fin partie
Situation Familiale --> </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>Etat
civil de la ville de Nantes</title> </head> <body> <center> <table> <tr> <td
ALIGN="CENTER"><font COLOR="green"
SIZE="5"><u><b>Etat civil de la ville de la ville de
Nantes</b></u></font></td> </tr> </table> <table> <tr> <td ALIGN="CENTER"
COLSPAN="2"> <table
BORDER="1"> <tr> <td
ALIGN="CENTER" COLSPAN="2"
BGCOLOR="yellow"><b>1. Identite <font
COLOR="green">Darte Aline</font></b></td> </tr> <tr> <td
ALIGN="left">Nom Patronymique</td><td
ALIGN="left">Darte</td> </tr> <tr> <td ALIGN="left">Prenoms
Principal</td><td ALIGN="left">Aline</td> </tr> <tr> <td
ALIGN="left">Prenoms secondaires</td><td
ALIGN="left">Gisele</td> </tr> <tr> <td
ALIGN="left">Nom marital</td><td
ALIGN="left">Paruton</td> </tr> <tr> <td
ALIGN="left">Date de naissance </td><td
ALIGN="left">23/11/1934</td> </tr> <tr> <td
ALIGN="left">Date du deces</td><td
ALIGN="left">01/04/1989</td> </tr> <tr> <td
ALIGN="left">Sexe</td><td
ALIGN="left">Féminin</td> </tr> <tr> <td
ALIGN="left">Adresse</td><td
ALIGN="left"></td> </tr> </table> </td> </tr> <tr> <td> <table
BORDER="1"> <tr> <td
ALIGN="CENTER" COLSPAN="2"
BGCOLOR="yellow"><b>Parents</b></td> </tr> <tr> <td
ALIGN="left"><u>Nom</u> Prenom du
pere</td><td ALIGN="left">Darte Jean</td> </tr> <tr> <td
ALIGN="left">Date de naissance du pere</td><td
ALIGN="left">09/02/1839</td> </tr> <tr> <td
ALIGN="left"><u>Nom</u> Prenom de la
mere</td><td ALIGN="left">Fraise Anemone</td> </tr> <tr> <td
ALIGN="left">Date de naissance de la mere</td><td
ALIGN="left">04/03/1845</td> </tr> </table> </td><td> <table
BORDER="1"> <tr> <td
ALIGN="CENTER" COLSPAN="2"
BGCOLOR="yellow"><b>Etat Civil</b></td> </tr> <tr> <td
ALIGN="left">Situation familiale</td><td
ALIGN="left">veuf</td> </tr> <tr> <td
ALIGN="left">fille</td><td
ALIGN="left">Darte Fanny</td> </tr> </table> </td> </tr> </table> <hr> <table> <tr> <td
ALIGN="CENTER" COLSPAN="2"> <table
BORDER="1"> <tr> <td
ALIGN="CENTER" COLSPAN="2"
BGCOLOR="yellow"><b>2. Identite <font
COLOR="green">Jonnav Laurent</font></b></td> </tr> <tr> <td ALIGN="left">Nom
Patronymique</td><td ALIGN="left">Jonnav</td> </tr> <tr> <td
ALIGN="left">Prenoms Principal</td><td
ALIGN="left">Laurent</td> </tr> <tr> <td
ALIGN="left">Prenoms secondaires</td><td
ALIGN="left">François Martin</td> </tr> <tr> <td ALIGN="left">Date
de naissance </td><td
ALIGN="left">19/04/1964</td> </tr> <tr> <td
ALIGN="left">Sexe</td><td
ALIGN="left">Masculin</td> </tr> <tr> <td
ALIGN="left">Adresse</td><td
ALIGN="left">Saint Brevin</td> </tr> </table> </td> </tr> <tr> <td> <table BORDER="1"> <tr> <td
ALIGN="CENTER" COLSPAN="2"
BGCOLOR="yellow"><b>Parents</b></td> </tr> <tr> <td
ALIGN="left"><u>Nom</u> Prenom du
pere</td><td ALIGN="left">Jonnav Philippe</td> </tr> <tr> <td
ALIGN="left">Date de naissance du pere</td><td
ALIGN="left">31/02/1943</td> </tr> <tr> <td
ALIGN="left"><u>Nom</u> Prenom de la
mere</td><td ALIGN="left">Turbault Annie</td> </tr> <tr> <td
ALIGN="left">Date de naissance de la mere</td><td
ALIGN="left">10/06/1944</td> </tr> </table> </td><td> <table
BORDER="1"> <tr> <td
ALIGN="CENTER" COLSPAN="2"
BGCOLOR="yellow"><b>Etat Civil</b></td> </tr> <tr> <td
ALIGN="left">Situation familiale</td><td
ALIGN="left">marie</td> </tr> <tr> <td
ALIGN="left">fils</td><td
ALIGN="left">Jonnav André </td> </tr> <tr> <td
ALIGN="left">fils</td><td
ALIGN="left">Jonnav Charles</td> </tr> <tr> <td
ALIGN="left">fille</td><td
ALIGN="left">Jonnav France</td> </tr> </table> </td> </tr> </table> <hr> </center> </body> </html> |
d. Le visuel