Bonjour a tous et merci par avance. Je souhaite faire le regroupement d'un fichier 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
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>
Grosso modo je veux, sous chaque Omnibus regrouper les allocationDetails par rapport au AccountId.
J'ai donc utilisé le xsl 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>
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
 
<?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>
Comme vous le voyez, tout a été ramené sous le premier omnibus, ce que je ne souhaite pas ...
Ou ais-je fauté ?
Merci par avance et une biere a celui qui m'éclaire