Bonjour,

J'ai un fichier XML de ce type.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
<node>
<var @name="toto" /> 
<var @name="tata">  <var @name="toto" />  </var>
<var @name="tata">  <var @name="toto" >  <var @name="titi" />  </var> </var>
<var @name="tata">  <var @name="toto" />  </var>
<var @name="tata">  <var @name="toto" >  <var @name="titi" />  </var> </var>
<var @name="toto" /> 
<var @name="tata">  <var @name="toto" />  </var>
<var @name="tata">  <var @name="toto" >  <var @name="tutu" />  </var> </var>
<var @name="tata">  <var @name="tyty" >  <var @name="tutu" />  </var> </var>
<var @name="tata">  <var @name="toto" >  <var @name="tutu" />  </var> </var>
<var @name="toto">  <var @name="toto" >  <var @name="tutu" />  </var> </var>
</node>
Et j'aimerais généré le fichier text suivant, tel que chaque élément unique n'apparaisse qu'une fois:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
Mes éléments:
- toto
- tata-toto
- tata-toto-titi
- tata-toto-tutu
- tata-tyty-tutu
- toto-toto-tutu
Je précise qu'il peut y avoir n <var> en cascade (et pas seulement 3 comme dans l'exemple).

J'utilise actuellement generate-id() en bouclant for each node/var:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
<xsl:variable name="allVar" select="./node/var" />
<xsl:for-each select="./node/var]">
    <xsl:variable name="name" select="@name" />
      <xsl:if test="generate-id() = generate-id($allVar[@name = $name][1])">  
      </xsl:if>
</xsl:for-each>
Mais cela ne convient pas car les descendants ne sont pas pris en compte.

Comment feriez-vous cela ?

Merci par avance.