Voici en gros ce que j'ai côté XML :
et le XML que je doit obtenir :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <Personnes> <Personne Type="Adulte" Nombre="2"/> <Personne Type="Enfant" Nombre="5"/> </Personnes>
En XSL, j'ai une fonction, enfin template :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <Personne id="1" Type="ADULTE"/> <Personne id="2" Type="ADULTE"/> <Personne id="3" Type="ENFANT"/> <Personne id="4" Type="ENFANT"/> <Personne id="5" Type="ENFANT"/> <Personne id="6" Type="ENFANT"/> <Personne id="7" Type="ENFANT"/>
Et voilà l'endroit où je traite cela :
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33 <xsl:template name="for.loop.persons"> <xsl:param name="start"/> <xsl:param name="total"/> <xsl:param name="Type"/> <xsl:if test="$start <= $total"> <Personne> <xsl:attribute name="id"> <xsl:value-of select="$start"/> </xsl:attribute> <xsl:attribute name="Type"> <xsl:value-of select="$Type"/> </xsl:attribute> </Personne> </xsl:if> <xsl:if test="$start <= $total"> <xsl:call-template name="for.loop.persons"> <xsl:with-param name="start"> <!-- Increment index--> <xsl:value-of select="$start + 1"/> </xsl:with-param> <xsl:with-param name="total"> <xsl:value-of select="$total"/> </xsl:with-param> <xsl:with-param name="Type"> <xsl:value-of select="$Type"/> </xsl:with-param> </xsl:call-template> </xsl:if> </xsl:template>
Le problème est que j'obtiens :
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 <xsl:template match="Voyage/Personnes"> <xsl:for-each select="Personne"> <xsl:call-template name="for.loop.persons"> <xsl:with-param name="start"> 1 </xsl:with-param> <xsl:with-param name="total"> <xsl:value-of select="@Nombre"/> </xsl:with-param> <xsl:with-param name="Type"> <xsl:for-each select="@Type"> <xsl:value-of select="translate(.,$LowerLetters,$UpperLetters)"/> </xsl:for-each> </xsl:with-param> </xsl:call-template> </xsl:for-each> </xsl:template>
Je sais que c'est parceque je donne 1 en paramètre d'entrée de start, je sais que ça vient d'un mauvais passage de paramètres, mais j'ai essayé avec position(), en faisant des opérations du style position() + (position()-1) qui ne marche pas toujours....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <Personne id="1" Type="ADULTE"/> <Personne id="2" Type="ADULTE"/> <Personne id="1" Type="ENFANT"/> <Personne id="2" Type="ENFANT"/> <Personne id="3" Type="ENFANT"/> <Personne id="4" Type="ENFANT"/> <Personne id="5" Type="ENFANT"/>
Bref, là je sature
Partager