Bonjour,
Je dispose dans un fichier d'une suite d'élément de la forme suivante :
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
 
<word value="mot1">
  <racine value="racine1">
    <forme value="forme1"/>
  </racine>
</word>
 
<word value="mot1">
  <racine value="racine2">
    <forme value="forme2"/>
  </racine>
</word>
 
<word value="mot1">
  <racine value="racine2">
    <forme value="forme3"/>
  </racine>
</word>
 
<word value="mot2">
  <racine value="racine2">
   <forme value="forme3"/>
  </racine>
</word>
 
....
et j'aimerais obtenir
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
<word value="mot1">
 <racine value="racine1">
    <forme value="forme1"/>
 </racine>
  <racine value="racine2">
    <forme value="forme2"/>
    <forme value="forme3"/>
  </racine>
</word>
Pour l'instant j'ai réussi à obtenir la liste unique des "<word value="mot">" mais cela ne me fournit que le premier bloc rencontré et non pas la liste des sous éléments (donc la racine et la forme du premier bloc comprenant ce "mot")

Voici mon XSL

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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
 
    <xsl:key name="mot" match="word" use="@value" />
 
    <xsl:template match="/">
    <file>
        <xsl:for-each select="//word[generate-id() = generate-id(key('mot',@value)[1])]">
            <xsl:element name="word">
                <xsl:value-of select="@value"/>
                    <xsl:element name="racine">
                        <xsl:value-of select="racine/@value"/>
                            <xsl:element name="forme">
                                <xsl:value-of select="racine/forme/@value"/>
                            </xsl:element>
                    </xsl:element>
            </xsl:element>
        </xsl:for-each>
    </file>
    </xsl:template>
 
</xsl:stylesheet>
D'avance merci




#EDIT
Je suis tombé par hasard sur un autre sujet , qui m'a montré une meilleur façon de formulé mon problème et un début de solution sur la FAQ

Pour l'instant j'obtient la liste des mot avec ses racine mais la racine forme reste dupliqué par chaque racine.
J'ai du modifié l'architecture de mon XML en entré pour que cela fonctionne mais ce n'est pas un problème.

Il me reste à réitéré cette réunion pour avoir l'architecture la plus parfaite
Nouveau résultat

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<word value="mot1">
 <racine value="racine1">
    <forme value="forme1"/>
 </racine>
  <racine value="racine2">
    <forme value="forme2"/>
  </racine>
 
   <racine value="racine2">
     <forme value="forme3"/>
  </racine>
</word>
Nouveau XSL
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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:key name="regrouper" match="value" use="."/>
    <xsl:template match="/">
        <file>
            <xsl:apply-templates select="file/word/value[generate-id(.)=generate-id(key('regrouper',.)[1])]"/>
        </file>
    </xsl:template>
    <xsl:template match="value">
        <word>
            <xsl:copy-of select="."/>
            <xsl:apply-templates select="//racine[../value=current()]"/>
        </word>
    </xsl:template>
    <xsl:template match="racine">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>