Bonjour à tous,

Je me permets de poster un message pour avoir un peu d'aide concernant un problème que je dois résoudre.

Je possède un fichier XML que je dois transformer à l'aide d'une feuille XSLT:

Fichier 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
22
23
24
25
26
27
<jel>
	<admin creation="Wed Mar 05 10:45:20 CET 2014" xsdversion="1.0.0" version="1.0.0" />
	<jelclass abstract="true" visibility="public" interface="true"  type="ConsommationService">
	<methods>
		<method visibility="public" name="estimation" returncomment="blabla" fulltype="java.lang.Integer" type="Integer">
			<attribute name="@externaldataitem">
				<description>item1</description>
			</attribute>
			<attribute name="@externaldatatype">
				<description>type1</description>
			</attribute>
			<attribute name="@externaldatadesc">
				<description>desc1</description>
			</attribute>
			<attribute name="@externaldataitem">
				<description>item</description>
			</attribute>
			<attribute name="@externaldatatype">
				<description>desc5</description>
			</attribute>
			<attribute name="@externaldatadesc">
				<description>desc6</description>
			</attribute>
			[...]
		</method>
	</methods>
</jel>
Résultat souhaité:
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
<jel>
	<admin creation="Wed Mar 05 10:45:20 CET 2014" xsdversion="1.0.0" version="1.0.0" />
	<jelclass abstract="true" visibility="public" interface="true"  type="ConsommationService">
	<methods>
		<method visibility="public" name="estimation" returncomment="blabla" fulltype="java.lang.Integer" type="Integer">
			<attribute>
				<item>item1</item>
				<type>type1</item>
				<desc>desc1</item>
			</attribute>
			<attribute>
				<item>item2</item>
				<type>type2</item>
				<desc>desc2</item>
			</attribute>
			[...]
		</method>
	</methods>
</jel>
Je dois donc regrouper à chaque fois 3 attributs nommés "@externaldataitem", "@externaldatatype" et "externaldatadesc" sous un nouveau noeud qui sera nommé "attribut".

On admet que dans le fichier source, le nombre d'attribut est bien multiple de 3 et que normalement ils sont tous dans le même ordre c-a-d "@externaldataitem" puis "@externaldatatype" puis "externaldatadesc".

J'ai pensé à boucler sur chaque attribut et en fonction de sa position modulo 3 créer un nouveau noeud nommé "attribut", du style :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
<xsl:template match="attribute">
	<xsl:if test="(position() = 0) or (position() mod 3) = 0">
		<xsl:element name="attribute">
			<xsl:element name="item">
				<xsl:value-of select="./description"/>
			</xsl:element>
		</xsl:element>
	</xsl:if>
</xsl:template>
Excepté le fait que se ne soit pas le résultat attendu, avec ce test, il est impossible de récupérer @externaldatatype/@externaldatadesc et les placer sous le même nœud parent que @externaldataitem.

Il y a sûrement une solution beaucoup plus élégante avec l'utilisation de following-sibling etc..

Voila est-il possible d'avoir un peu d'aide car je patauge avec ma feuille XSLT ;-).

Merci d'avance.

Cordialement.