Bonjour à vous,
Je ne viens pas avec un problème vu que j'ai résolu le problème mais j'aimerais expliquer pourquoi la solution fonctionne par rapport à ma première méthode qui ne fonctionnait pas comme je voulais.
Voici le code :
EDIT > le code entre balise
Comme on le voit, je ne peux pas écrire directement ../list[position()] et je dois passer par une variable qui inscrit la position.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <xsl:for-each select="./node()[@style = 'txt']"> <xsl:variable name="position" select="position()" /> <xsl:variable name="unite" select="substring-before(substring-after(@unformattedLabel,'('),')')" /> <fo:block> <fo:inline font-weight="bold"><xsl:value-of select="concat(@unformattedLabel, ' : ')"/></fo:inline> <xsl:value-of select="concat(text(), $unite ,' (P. ', ../list[$position]/child::node()[text() = 'on']/@unformattedLabel, ')')"/> </fo:block> </xsl:for-each> </xsl:template>
Mon explication, après lecture sur le fonctionnement de ce langage est que comme c'est un langage fonctionnel, il fonctionne sans doute avec des "états" de la mémoire et que dans un cas il prend l'état ou la mémoire vaut position() = 1 (si je fais ../list[position()], il prend toujours la première list) et sinon il fait un appel récursif (sans doute fait avec le for-each par derrière) et il a donc n valeur de position pour n élément dans la pile.
Valider vous, sur le fond plus que sur la forme car je n'emploie sans doute pas le bon vocabulaire, l'analyse du problème ?
Bien à vous,
Xavier
Partager