From: Cyril Jandia (cjandia@logfi.fr)
Date: 04/07/2002 - 08:14
> De : noel.jean-baptiste@courrier.uqam.ca
> À : xml-tech@xmlfr.org
> Objet : [xml-tech] Expression Xpath
>
> Bonjour,
>
> Soit le fichier xml suivant :
> [...]Extrait du fichier xsl:
> [...]Quelle pourrait être l'expression
> [...]qui me permettrait d'obtenir le résultat suivant:
Bonjour,
C'est [un classique] pour l'usage de l'axe "ancestor-or-self" (cf. [axes
XPath]);
voici une transformation complète pour répondre à la question :
<?xml version="1.0" ?>
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text" />
<xsl:template match="/*">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="*">
<xsl:for-each select="ancestor-or-self::*[name()!='etudiant']">
<xsl:choose>
<xsl:when test="name(..)!='etudiant'">
<xsl:value-of select="concat('/',name())" />
</xsl:when>
<xsl:otherwise><xsl:value-of select="name()" /></xsl:otherwise>
</xsl:choose>
</xsl:for-each><xsl:text>
</xsl:text>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="text()" />
</xsl:transform>
Notes :
* les parties décisives de la solution sont bien :
a) le <xsl:for-each...> utilisant l'axe "ancestor-or-self"
b) l'appel ("récursif") de ce même <xsl:template match="*">... via le 2nd
<xsl:apply-templates />;
* ainsi, ne vous laissez pas distraire par le prédicat "[name()!='etudiant']" ni
par le <xsl:choose...> ci-dessus: ils sont seulement là pour éviter de sortir
des chaînes qui commenceraient sinon par "/etudiant...", ce que vous ne voulez
pas, apparemment;
* le dernier <xsl:template match="text()" /> permet d'ignorer les noeuds texte
de votre document XML source.
> codePermanent
> sexe
> infoComplementaires/regime
> infoComplementaires/fax
>
> Merci,
> Djibi
[un classique]
http://www.dpawson.co.uk/xsl/sect2/N6052.html#d176e57
[axes XPath]
http://xmlfr.org/w3c/TR/xpath#axes
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
|