From: Cyril Jandia (cjandia@logfi.fr)
Date: 30/10/2002 - 09:31
Bonjour Frédéric,
> -----Message d'origine-----
> De : Frederic.Evesque@equipement.gouv.fr
> Envoyé : mardi 29 octobre 2002 18:02
> À : xml-tech@xmlfr.org
> Objet : [xml-tech] Reconstitution d'arbre
>
> Bonjour,
>
> Je suis confronté à un problème de reconstitution d'arbre, et je me
> demandais s'il était possible de le faire avec XML et une transformation
> XSLT :
>
> Voilà mon fichier source avec une syntaxe XML, un élément "personne" possède
> 0 ou 1 père, et 0 à plusieurs enfants.
> [...]J'aimerais générer le fichier suivant, pour tous les éléments ne
possédant
> pas de père :
Voici une solution possible :
(NB : l'existence de vos deux éléments "pere" et "enfant" créent une redondance
du jeu d'informations quant à l'établissement de la relation père-enfant dans
votre document XML source;
ma solution a donc fait le choix (arbitraire) de s'appuyer seulement sur une
définition de cette relation via l'élément "pere" - c'est pourquoi la
transformation test.xsl ci-dessous ne tient pas compte de ces éléments "enfants"
cités dans un "pere" - je vous laisse en exercice cette autre possibilité ;=)
Source :
-- data.xml
<?xml version="1.0" encoding="iso-8859-1" ?>
<personnes>
<personne nom="Papy">
<pere></pere>
<enfant>Papa</enfant>
</personne>
<personne nom="Papa">
<pere>Papy</pere>
<enfant>Enfant1</enfant>
<enfant>Enfant2</enfant>
</personne>
<personne nom="Enfant1">
<pere>Papa</pere>
</personne>
<personne nom="Enfant2">
<pere>Papa</pere>
</personne>
</personnes>
Transfo. (avec qq commentaires pour aider, mais qui ne remplaceront pas le livre
cité ci-dessous -- un "must" à mon avis) :
-- test.xsl
<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" />
<xsl:template match="personnes">
<!--
Pour démarrer le processus, on commence par ne s'intéresser qu'à
la seule "personne" n'ayant pas de "pere" (notre "Adam" si l'on veut).
-->
<xsl:apply-templates select="personne[string(pere)='']" />
</xsl:template>
<xsl:template match="personne">
<xsl:copy><xsl:for-each select="@*">
<!--
Que la personne ait un "pere" ou nom,
on recopie ses attributs (nom, etc).
-->
<xsl:copy-of select="." />
</xsl:for-each>
<!--
Puis, on lance la descente récursive sur les personne ayant ce "pere";
note : la terminaison de cette récursion est assurée par deux conditions
sur la source :
1) il n'y a pas de cycle enfant-père-enfant-...
2) le document XML source est... fini (toujours vraie normalement! ;=)
-->
<xsl:apply-templates select="//personne[string(pere)=current()/@nom]" />
</xsl:copy>
</xsl:template>
</xsl:transform>
On obtient alors le résultat (attendu) :
-- result.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<personne nom="Papy">
<personne nom="Papa">
<personne nom="Enfant1" />
<personne nom="Enfant2" />
</personne>
</personne>
> [...]N'étant qu'un novice en XSL, si quelqu'un peut me fournir quelques idées.
Des idées de lecture par exemple?
(En voici une en français :
http://xmlfr.org/listes/xml-tech/2002/07/0000.html
;=)
> Merci d'avance,
>
> Frederic
Cordialement,
--CJ
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Archive générée par hypermail 2.1.3 le 28/06/2004 - 11:06 UTC
webmaster@xmlfr.org
|