Bonjour,
Je dois construire une hererchie imbriquée, à partir d'une structure a seulement deux niveaux pere - fils.

Une des difficultés que je rencontre est d'identifier le premier niveau car il n'y a pas de balise ou d'attribut particulier pour l'identifier.
Voici la structre, en exemple:

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
 
<events>
	<event>
		<father>A11111</father>
		<sons>
			<son>B22222</son>
			<son>B33333</son>
			<son>B44444</son>
		</sons>
	</event>
 
	<event>
		<father>B22222</father>
		<sons>
			<son>C22222</son>
			<son>C33333</son>
			<son>C44444</son>
		</sons>
	</event>
 
	<event>
		<father>B33333</father>
		<sons>
			<son>D22222</son>
			<son>D33333</son>
			<son>D44444</son>
		</sons>
	</event>
</events>
Et le résultat que je cherche à obtenir:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<container id="A11111">
	<container id="B22222">
		<item>C22222</item>
		<item>C33333</item>
		<item>C44444</item>
	</container>
	<container id="B33333">
		<item>D22222</item>
		<item>D33333</item>
		<item>D44444</item>
	</container>
	<item>B44444</item>
</container>
Sachant que les balises events ne sont pas forcément ordonnées dans l'ordre de la hierarchie, evidemment...
je comprend bien qu'il faut faire une structure recursive, mais je ne sais pas comment identifier

je suis parti sur un apply 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
 
<xsl:template match="events">
    <xsl:apply-templates select="event"/>
<xsl:template/>
 
<xsl:template match="event">
		<container>
			<xsl:value-of select="father"/> <!-- Comment identifier que c'est la structure de plus haut niveau ? -->
		</container>
		<xsl:for-each select="sons/son">
			<!-- identifier si le fils a des fils, si non -->
			<item><xsl:value-of select="."/></item>
			<!-- si oui, recursivité sur l'element -->
			<xsl:apply-templates select="."/>
		</xsl:for-each>
</xsl:template>
mais la je suis bloqué...