Bonjour,

Après avoir lu la FAQ, exploré via Google les sites qui donnent des exemples, je ne parviens à obtenir ce que je souhaite de mon fichier XSL.

Voici un exemple de fichier XML que j'ai en entrée :

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
 
<?xml version="1.0" encoding="UTF-8"?>
<FICHIER>
  <STM>
  <ENS REFCONTRAT="X">
    <EXE ANNEE="2005">
      <CRE MNDETCRE="15EUR" />
    </EXE>
  </ENS>
  <ENS REFCONTRAT="X">
    <EXE ANNEE="2006">
      <CRE MNDETCRE="15EUR" />
    </EXE>
  </ENS>
  <ENS REFCONTRAT="Y">
    <EXE ANNEE="2006">
      <CRE MNDETCRE="30EUR" />
    </EXE>
  </ENS>
  <STM>
<FICHIER>
Ce que je souhaiterais en sortie :

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
 
<FICHIER>
  <STM>
  <ENS REFCONTRAT="X">
    <EXE ANNEE="2005">
      <CRE MNDETCRE="15EUR" />
    </EXE>
 
    <!-- Je regroupe les balises EXE appartenant au même contrat (ici le contrat X) -->
    <EXE ANNEE="2006">
      <CRE MNDETCRE="15EUR" />
    </EXE>
 
  </ENS>
  <ENS REFCONTRAT="Y">
    <EXE ANNEE="2006">
      <CRE MNDETCRE="30EUR" />
    </EXE>
  </ENS>
  <STM>
<FICHIER>
J'ai essayé avec la feuille de style 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
 
<?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="group-by-ENS" match="ENS" use="@REFCONTRAT"/>  
 
  <xsl:template match="/FICHIER/STM"> 
 
      <xsl:apply-templates select="ENS[generate-id(.)=generate-id(key('group-by-ENS',@REFCONTRAT)[1])]"/>
 
  </xsl:template> 
 
  <xsl:template match="ENS">
		<t>
			<xsl:copy-of select="."/>
			<xsl:apply-templates select="//EXE[parent::ENS/@REFCONTRAT=current()/@REFCONTRAT]"/>
		</t>
	</xsl:template>
 
	<xsl:template match="EXE">
		<xsl:copy-of select="."/>
	</xsl:template>
 
</xsl:stylesheet>
mais j'obtiens ceci :

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
 
<?xml version="1.0" encoding="UTF-8"?>
 
  <t>
  <ENS REFCONTRAT="X">
    <EXE ANNEE="2005">
      <CRE MNDETCRE="15EUR"/>
    </EXE>
  </ENS>
  <EXE ANNEE="2005">
      <CRE MNDETCRE="15EUR"/>
    </EXE>
  <EXE ANNEE="2006">
      <CRE MNDETCRE="15EUR"/>
    </EXE>
</t><t>
  <ENS REFCONTRAT="Y">
    <EXE ANNEE="2006">
      <CRE MNDETCRE="30EUR"/>
    </EXE>
  </ENS>
  <EXE ANNEE="2006">
      <CRE MNDETCRE="30EUR"/>
    </EXE>
</t>
ce qui est presque correct : le seul problème vient de la mauvaise imbrication des balises.

J'ai essayé d'autres méthodes (avec des for-each et autres) mais c'est ce dernier fichier XSL qui se rapproche le plus de ce que je souhaite obtenir.

Quelqu'un aurait-il une idée ? Suis-je sur la bonne voie ?

D'avance, merci.

derek.mf