From: Eric van der Vlist (vdv@dyomedea.com)
Date: 21/09/2000 - 14:59
Bonjour,
Pour ce type de problème, il faut fonctionner "pas à pas" en utilisant
"following-sibling::p[1]" et en testant le niveau.
De plus, je ne vois pas comment éviter une "deuxième passe" après que
l'on ai détecté que l'on a terminé le traitement d'un niveau.
Cette deuxième passe peut être faite en utilisant un "mode" différent.
Il y a peut être plus simple, mais la feuille suivante fonctionne:
----------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<doc>
<xsl:apply-templates select="/doc/p[@n='1'][1]"/>
</doc>
</xsl:template>
<xsl:template match="p" name="p">
<xsl:param name="level" select="'0'"/>
<xsl:choose>
<xsl:when test="@n='Normal'">
<p><xsl:value-of select="."/></p>
<xsl:apply-templates select="following-sibling::p[1]">
<xsl:with-param name="level" select="$level"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="@n > $level">
<xsl:element name="p{@n}">
<p><xsl:value-of select="."/></p>
<xsl:apply-templates select="following-sibling::p[1]">
<xsl:with-param name="level" select="@n"/>
</xsl:apply-templates>
</xsl:element>
<xsl:apply-templates select="following-sibling::p[1]" mode="scan">
<xsl:with-param name="level" select="@n"/>
</xsl:apply-templates>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="p" mode="scan">
<xsl:param name="level" select="'0'"/>
<xsl:choose>
<xsl:when test="@n < $level "/>
<xsl:when test="@n = $level">
<xsl:call-template name="p">
<xsl:with-param name="level" select="$level - 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="following-sibling::p[1]" mode="scan">
<xsl:with-param name="level" select="$level"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
----------------
Eric
JM Destabeaux wrote:
>
> Bonjour à tous,
>
> Qui pourrait proposer un exemple de solution "purement" XSLT
> (sans fonctions d'extension) au problème particulier suivant?
>
> NB - après épluchage de la FAQ Pawson, des archives XSL-List, de
> la bible de M. Kay, j'ai tout essayé (euh, peut-être pas *tout*,
> justement): grouper par xsl:key, tester les following-siblings
> avec generate-id(), faire des call-templates... je me retrouve
> toujours confronté au même problème de la sélection logique des
> éléments pertinents pour un "niveau" donné, et d'eux seuls. Et je
> me rends bien compte que ce doit être la 10 000e question sur ce
> sujet, mais là, je sèche vraiment.
>
> EXEMPLE XML
> --------------
>
> <doc>
> <p n="1">A</p>
> <p n="Normal">B</p>
> <p n="2">C</p>
> <p n="Normal">D</p>
> <p n="3">E</p>
> <p n="Normal">F</p>
> <p n="Normal">G</p>
> <p n="3">H</p>
> <p n="Normal">I</p>
> <p n="2">J</p>
> <p n="Normal">K</p>
> <p n="1">L</p>
> <p n="Normal">M</p>
> <p n="2">N</p>
> <p n="Normal">O</p>
> </doc>
>
> RESULTAT ATTENDU
> --------------------
>
> <doc>
> <p1>
> <p>A</p>
> <p>B</p>
> <p2>
> <p>C</p>
> <p>D</p>
> <p3>
> <p>E</p>
> <p>F</p>
> <p>G</p>
> </p3>
> <p3>
> <p>H</p>
> <p>I</p>
> </p3>
> </p2>
> <p2>
> <p>J</p>
> <p>K</p>
> </p2>
> </p1>
> <p1>
> <p>M</p>
> <p2>
> <p>N</p>
> <p>O</p>
> </p2>
> </p1>
> </doc>
>
> ---------------------
>
> Le nombre de niveaux, le nombre d'éléments de même "niveau"
> en séquence, et le nombre de <p n="0"> sont quelconques.
> Je SAIS qu'on doit y arriver, je suis même avide de "penser
> différemment" ;+) mais je suis incrusté dans le mur.
>
> Merci d'avance pour toute suggestion, surtout d'ordre
> méthodologique !
>
> -Jean-Marc Destabeaux
> hacjmd@worldnet.fr
>
> --
> 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)
--
------------------------------------------------------------------------
Eric van der Vlist Dyomedea http://dyomedea.com
http://xmlfr.org http://4xt.org http://ducotede.com
------------------------------------------------------------------------
--
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:05 UTC
webmaster@xmlfr.org
|