Bonjour,

J'aimerais restructurer le XML suivant:

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
<Root>
	<Key Country="FR" City="NCE" Type="S">
		<Value>12.52</Value>
		<Description>AAA</Description>
	</Key>
	<Key Country="FR" City="NCE" Type="B">
		<Value>72</Value>
		<Description>BBB</Description>
	</Key>
	<Key Country="FR" City="PAR" Type="B">
		<Value>8</Value>
		<Description>CCC</Description>
	</Key>
	<Key Country="US" City="NYK" Type="B">
		<Value>72</Value>
		<Description>DDD</Description>
	</Key>
</Root>
afin d'obtenir 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
26
27
28
<Root>
	<Country Code="FR">
		<City Code="NCE">
			<Type Code="S">
				<Value>12.52</Value>
				<Description>AAA</Description>
			</Type>
			<Type Code="B">
				<Value>72</Value>
				<Description>BBB</Description>
			</Type>
		</City>
		<City Code="PAR">
			<Type Code="B">
				<Value>8</Value>
				<Description>CCC</Description>
			</Type>
		</City>
	</Country>
	<Country Code="US">
		<City Code="NYK">
			<Type Code="B">
				<Value>72</Value>
				<Description>DDD</Description>
			</Type>
		</City>
	</Country>
</Root>
Donc, comme l'exemple le montre, le but est d'éclater le noeud Key en plusieurs noeuds, chacun avec un champ de la Key, et de factoriser les noeuds créés (même Country, puis même City). On part du principe qu'il n'y a pas de doublons (i.e. 2 Keys avec les mêmes Country, City, Type).

J'ai essayé de m'inspirer des exemples sur le forum mais je ne vois pas comment les adapter à mon cas. Rien qu'en essayant de merger le Country, le code suivant n'est pas adapté (je ne garde que la première donnée pour FR).

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:key name="countryKey" match="Key" use="@Country" />
 
	<xsl:template match="/Root">
		<Root>
			<xsl:for-each select="//Key[generate-id(.)=generate-id(key('countryKey', @Country)[1])]">
				<Country>
					<xsl:attribute name="CountryCode"><xsl:value-of select="@Country" /></xsl:attribute>
					<xsl:apply-templates select="node()" />
				</Country>
			</xsl:for-each>
		</Root>
	</xsl:template>
 
	<xsl:template match="node() | @*">
		<xsl:copy>
			<xsl:apply-templates select="@* | node()" />
		</xsl:copy>
	</xsl:template>
Je n'ai pas trouvé de problème semblable sur le forum.
Avez-vous une piste à me donner? Merci!