Voici en gros ce que j'ai côté XML :

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>
et le XML que je doit obtenir :

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"/>
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
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 &lt;= $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 &lt;= $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>
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
 
<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>
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
 
<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"/>
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....

Bref, là je sature