Hello,

j'ai eu du mal à faire un titre évocateur et pas trop long, désolé...

Voici mon problème : je récupère un flux XML généré par plusieurs requêtes SQL. Je ne peux faire de tri dans ces requêtes parce qu'elles sont imbriquées (je ne vais pas rentrer dans les détails : des ORBER BY sont exclus).
Du coup, je le fais dans mon XSL, après un for-each.

Je pars d'un template DUTYPARTS
Dans ce template, je fais appel à mon for-each pour parcourir des noeuds : DUTYPART/USED_VHJO
Puis je trie selon certains éléments (je n'ai donc plus l'ordre, à l'affichage, que j'ai originellement dans mon flux XML).
Je cherche ensuite à comparer la valeur d'un élément X avec la valeur de l'élément X précédent. Sans for-each, cela a toujours fonctionné à merveille, qu ece soit en utilisant preceding:: ou en assignant à une variable la valeur de position() - 1...bref, ici, je montre une de ces manières, mais croyez-moi, j'en ai essayé tout un tas aussi !! Rien ne fonctionne. Voici mon code actuel, qui présente quelques résultats, mais pas tout à fait ceux attendus :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
<xsl:for-each select="DUTYPART/USED_VHJO">
								<xsl:sort select="TVER_ID"/>
								<xsl:sort select="VHJO_DAYTYPE"/>
								<xsl:sort select="VHJO_DEPTIME"/>
								<xsl:variable name="MyPos">
									<xsl:value-of select="position()"/>
								</xsl:variable>
								<!--
								<xsl:variable name="MyPrecPos">
									<xsl:value-of select="position() - 1"/>
								</xsl:variable>
								-->
								<xsl:variable name="MyCurDesc">
									<xsl:value-of select="VHJO_DAYTYPE"/>
								</xsl:variable>
								<xsl:variable name="MyDesc">
									<xsl:value-of select="(preceding::DUTYPART)[position() = last()]/USED_VHJO/VHJO_DAYTYPE"/>
								</xsl:variable>
Bien sûr, il ne s'agit que d'une partie du code.
En fait, si j'affiche ma position courante et ma position précédente, j'obtiens de curieuses choses; par exemple :

position 1 - Previous value : 15 - Current value : 15
position 2 - Previous value : 15 - Current value : 15
position 3 - Previous value : 15 - Current value : 15
position 4 - Previous value : 16 - Current value : 16
position 5 - Previous value : - Current value : 16

La position 5 était la position 1 dans mon flux xml (et est devenue la position 5 après mes sort), c'est pourquoi la valeur précédente de l'élément était 'null'.
De même pour ma position 1, on a une valeur précédente, parce qu'il n'a pas la position 1 dans mon flux xml.
Idem pour la position 4 : la valeur précédente ne correspond pas avec la valeur courante de la position 3.
Et c'est très gênant...vu que je dois, en gros, me baser sur ces valeurs pour délimiter l'affichage (je change de couleur, en gros, lorsque la valeur précédente ne correspond pas à la valeur courante de la position - 1).

Bref, il semblerait que le for-each se cale sur le flux xml, et que les sort modifie ce flux, mais qu'il y a décalage entre mon affichage, et mes position (). Je ne suis pas très sûr de moi sur ce coup... : ai-je mes position ici en fonction du flux xml originel, ou du flux xml après les sort ? Cela expliquerait les décalages curieux que j'ai.
Mais si c'est le cas...comment se fait il que mesposition soient dans l'ordre (1, 2, 3...), et que un ELEMENT[position() - 1]/CHILD à la position 3 ne me donne pas la même valeur qu'un ELEMENT[position()]/CHILD à la position 2 ?

Voilà...je ne suis pas sûr d'avoir été très clair. C'est en grande partie parce que je ne comprends pas très bien comment le moteur XSL fonctionne, sur ce coup.
Si quelqu'un a une explication, et éventuellement un début de solution à me proposer...ce serait parfait :-)

Merci par avance![/code]