From: Ricaud Matthieu (matthieu.ricaud@cned.fr)
Date: 06/07/2004 - 13:27
Ok, ça me parait clair à présent.
C'est vrai que je travail directement avec le navigateur, ce qui n'est pas
toujours évident pour "débuguer"...
Quoique je viens de me rendre compte qu'en fait je pouvais facilement voir
le résultat de la transformation en faisant afficher la source (la
transformation en HTML étant effectuée par une page ASP) et en effet les
noeud copié apparaissent bien dans la source mais pas visuellement.
En revanche je ne récupère que l'id de l'élément précédent et nons TOUS les
éléments précédents...
Je rappel juste le problème :
XML :
<racine>
<elmt id="3"/>
<elmt id="1"/>
<elmt id="4"/>
<elmt id="1"/>
</racine>
XSL, template "racine" :
<xsl:for-each select="elmt">
element <xsl:value-of select="@id"/>(<b><xsl:copy-of
select="preceding-sibling::elmt/@id"/></b>)<br/>
</xsl:for-each>
Ce qui génère (affichage de la source du HTML généré):
element 3 (<b></b>)
element 1 (<b id="3"></b>)
element 4 (<b id="1"></b>)
element 1 (<b id="4"></b>)
Il ne prend que l'élément précédent au lieu de TOUS mais je viens de
comprendre que c'est normal car le parser empêche certainement de générer
plusieurs attribut identiques pour le même élément (<b id="4" id="1"
id="3"></b>)
Et en effet quand je fais preceding-sibling::elmt au lieu de
preceding-sibling::elmt/@id
cela génère :
element 3 (<b></b>)
element 1 (<b><elmt id="3"/></b>)
element 4 (<b><elmt id="1"/><elmt id="3"/></b>)
element 1 (<b><elmt id="4"/><elmt id="1"/><elmt id="3"/></b>)
Donc... c'est bon ! (je comprend au fur à mesure que j'écris)
Pour ce qui est de la différence entre "current()" et "."
Si je comprend bien "current()" renvois toujours l'élément courant "matché"
PAR LE TEMPLATE même si on est dans une boucle for-each qui "match" des
sous-élément du template tandis que "." renvois le noeud courant matché (par
n'importe quel élément qui fait changer le noeud contextuel : for-each,
document(), etc. et à fortiori "template")
Merci pour toutes ces infos Eric en espèrant les avoir bien interprétées.
Cordialement,
Matthieu Ricaud.
-----Message d'origine-----
De : xml-tech-bounce@xmlfr.org [mailto:xml-tech-bounce@xmlfr.org]De la
part de Eric van der Vlist
Envoyé : mardi 6 juillet 2004 12:00
À : xml-tech@xmlfr.org
Objet : [xml-tech] Re: Traiter 1 seule fois les noeuds identiques
On Tue, 2004-07-06 at 11:31, Ricaud Matthieu wrote:
> Bonjour,
>
> Merci pour l'explication sur value-of, il s'agissait en effet de
debuguer...
> J'ai essayé avec copy-of mais ça n'affiche rien du tout...?
Cela recopie les noeuds et ne les visualise donc pas systématiquement
dans un navigateur qui ne va pas savoir comment les afficher...
C'est donc mieux adapté à une utilisation ligne de commande que dans un
navigateur.
> J'ai cependant trouvé le problème (sans pour autant me l'expliquer):
>
> Dans l'expression :
> <xsl:for-each select="elmt[not(preceding-sibling::eltm/@id =
> current()/@id)]">
>
> Si je remplace "current()" par "." alors ça fonctionne !
>
> C'est comme si mon parser ne reconnaissait pas la fonction current(),
> bizarre ?
Non, "." et "current()" ne sont pas (toujours) équivalents.
"current()" est le noeud contexte dans votre template XSLT alors que "."
est le noeud courant dans l'évaluation de l'expression XPath et bouge en
fonction de l'endroit où vous êtes dans cette expression.
Le fonctionnement que vous constatez est donc parfaitement normal.
Cordialement,
Eric van der Vlist
--
See you in Portland.
http://conferences.oreillynet.com/os2004/
Upcoming XML schema languages tutorial:
- Portland -half day- (27/07/2004) http://masl.to/?E6ED13728
------------------------------------------------------------------------
Eric van der Vlist http://xmlfr.org http://dyomedea.com
(ISO) RELAX NG ISBN:0-596-00421-4 http://oreilly.com/catalog/relax
(W3C) XML Schema ISBN:0-596-00252-1 http://oreilly.com/catalog/xmlschema
------------------------------------------------------------------------
--
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)
--
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 30/07/2004 - 13:32 UTC
webmaster@xmlfr.org
|