Bonjour a tous et merci par avance. Je souhaite faire le regroupement d'un fichier xml suivant :
Grosso modo je veux, sous chaque Omnibus regrouper les allocationDetails par rapport au AccountId.
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
30
31
32
33
34
35
36
37
38 <?xml version="1.0" encoding="UTF-8"?> <LzMessage> <LzOmnibus> <LzAllocationDetail> <LzAccountId>Fund1</LzAccountId> <LzQuantity>500</LzQuantity> <LzStrategy>Strat1</LzStrategy> </LzAllocationDetail> <LzAllocationDetail> <LzAccountId>Fund2</LzAccountId> <LzQuantity>600</LzQuantity> <LzStrategy>Strat2</LzStrategy> </LzAllocationDetail> <LzAllocationDetail> <LzAccountId>Fund1</LzAccountId> <LzQuantity>700</LzQuantity> <LzStrategy>Strat3</LzStrategy> </LzAllocationDetail> <LzAllocationDetail> <LzAccountId>Fund1</LzAccountId> <LzQuantity>800</LzQuantity> <LzStrategy>Strat4</LzStrategy> </LzAllocationDetail> </LzOmnibus> <LzOmnibus> <LzAllocationDetail> <LzAccountId>Fund1</LzAccountId> <LzQuantity>700</LzQuantity> <LzStrategy>Strat3</LzStrategy> </LzAllocationDetail> <LzAllocationDetail> <LzAccountId>Fund1</LzAccountId> <LzQuantity>800</LzQuantity> <LzStrategy>Strat4</LzStrategy> </LzAllocationDetail> </LzOmnibus> </LzMessage>
J'ai donc utilisé le xsl suivant :
Le résultat est le 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
19
20
21
22
23
24
25
26
27
28
29
30 <?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="regrouper" match="LzAccountId" use="."/> <xsl:template match="/"> <LzMessage> <xsl:apply-templates select="LzMessage/LzOmnibus"/> </LzMessage> </xsl:template> <xsl:template match="LzOmnibus"> <LzOmnibus> <xsl:apply-templates select="LzAllocationDetail/LzAccountId[generate-id(.)=generate-id(key('regrouper',.)[1])]"/> </LzOmnibus> </xsl:template> <xsl:template match="LzAccountId"> <LzAllocationDetail> <xsl:copy-of select="."/> <LzQuantity> <xsl:value-of select="sum(//LzQuantity[../LzAccountId=current()])"></xsl:value-of> </LzQuantity> <LzStrategy> <xsl:for-each select="//LzStrategy[../LzAccountId=current()]"><xsl:value-of select="."/>;<xsl:value-of select="../LzQuantity/."/> <xsl:choose> <xsl:when test="position()!=last()"><xsl:text> </xsl:text></xsl:when> </xsl:choose></xsl:for-each> </LzStrategy> </LzAllocationDetail> </xsl:template> </xsl:stylesheet>
Comme vous le voyez, tout a été ramené sous le premier omnibus, ce que je ne souhaite pas ...
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 <?xml version="1.0" encoding="UTF-8"?> <LzMessage> <LzOmnibus> <LzAllocationDetail> <LzAccountId>Fund1</LzAccountId> <LzQuantity>3500</LzQuantity> <LzStrategy>Strat1;500 Strat3;700 Strat4;800 Strat3;700 Strat4;800</LzStrategy> </LzAllocationDetail> <LzAllocationDetail> <LzAccountId>Fund2</LzAccountId> <LzQuantity>600</LzQuantity> <LzStrategy>Strat2;600</LzStrategy> </LzAllocationDetail> </LzOmnibus> <LzOmnibus/> </LzMessage>
Ou ais-je fauté ?
Merci par avance et une biere a celui qui m'éclaire
Partager