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:
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
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>
Je dois donc regrouper à chaque fois 3 attributs nommés "@externaldataitem", "@externaldatatype" et "externaldatadesc" sous un nouveau noeud qui sera nommé "attribut".
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>
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 :
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.
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>
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.
Partager