Bonjour à tous,
Je viens demander un peu d'aide pour réaliser un xslt qui me permette de regrouper des articles identiques et d'en réaliser la somme (quantité).
Voici le fichier XML d'origine (gestion rayon bricolage):
Avec mon XSLT j'obtiens un fichier csv pour une lecture dans Excel avec ce format:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 <?xml version='1.0' encoding='utf-8'?> <BOUTIQUE> <MAGASIN_BRICO name="Type" value="Nomenclature article" /> <RAYONAGE> <OUTILLAGE> <FIELD name="Name" value="CATERPILLARD" /> <FIELD name="Type" value="ELEC" /> <FIELD name="CODE_CLIENT" value="CAT_145789" /> <FIELD name="QTE" value="1" /> <LIST_ARTICLE> <ITEM> <FIELD name="Name" value="SPEED Z100" /> <FIELD name="Type" value="ELEC" /> <FIELD name="CODE_ARTICLE" value="P100255" /> <FIELD name="QTE" value="4" /> </ITEM> <ITEM> <FIELD name="Name" value="SPEED Z200" /> <FIELD name="Type" value="ELEC" /> <FIELD name="CODE_ARTICLE" value="P100300" /> <FIELD name="QTE" value="2" /> </ITEM> <ITEM> <FIELD name="Name" value="SPEED Z100" /> <FIELD name="Type" value="ELEC" /> <FIELD name="CODE_ARTICLE" value="P100255" /> <FIELD name="QTE" value="2" /> </ITEM> </LIST_ARTICLE> </OUTILLAGE> <OUTILLAGE> <FIELD name="Name" value="BOSCH" /> <FIELD name="Type" value="ELEC" /> <FIELD name="CODE_CLIENT" value="BOSCH_245896" /> <FIELD name="QTE" value="1" /> <LIST_ARTICLE> <ITEM> <FIELD name="Name" value="ACTIV G01" /> <FIELD name="Type" value="ELEC" /> <FIELD name="CODE_ARTICLE" value="AC100500" /> <FIELD name="QTE" value="4" /> </ITEM> <ITEM> <FIELD name="Name" value="ACTIV G01" /> <FIELD name="Type" value="ELEC" /> <FIELD name="CODE_ARTICLE" value="AC100500" /> <FIELD name="QTE" value="2" /> </ITEM> <ITEM> <FIELD name="Name" value="ACTIV G02" /> <FIELD name="Type" value="ELEC" /> <FIELD name="CODE_ARTICLE" value="AC100550" /> <FIELD name="QTE" value="2" /> </ITEM> </LIST_ARTICLE> </OUTILLAGE> </RAYONAGE> </BOUTIQUE>
OUTILLAGE;CAT_145789;1
ARTICLE;ELEC;P100255;4
ARTICLE;ELEC;P100300;2
ARTICLE;ELEC;P100255;2
OUTILLAGE;BOSCH_245896;1
ARTICLE;ELEC;AC100500;4
ARTICLE;ELEC;AC100500;2
ARTICLE;ELEC;AC100550;2
Ma question porte sur les articles identiques en doublon, car j'aimerai au final les grouper en une ligne et avoir la somme dans l'attribut QTE.
Ce que j'aimerai obtenir:
OUTILLAGE;CAT_145789;1
ARTICLE;ELEC;P100255;6
ARTICLE;ELEC;P100300;2
OUTILLAGE;BOSCH_245896;1
ARTICLE;ELEC;AC100500;6
ARTICLE;ELEC;AC100550;2
Voici le code de mon XSLT complet, sans la gestion des regroupements:
J'avoue que je sèche sur la manière de programmer ce type de regroupement et calcul
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" > <xsl:output method="text" version="1.0" encoding="iso-8859-1" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:apply-templates select="//OUTILLAGE"/> </xsl:template> <xsl:template match="OUTILLAGE" > <xsl:text>OUTILLAGE;</xsl:text> <xsl:for-each select="FIELD"> <xsl:if test="@name!='Name'"> <xsl:if test="@name!='Type'"> <xsl:value-of select="@value"/> <!--Suppression de la dernière ';'--> <xsl:if test="position() != last()"> <xsl:text>;</xsl:text> </xsl:if> </xsl:if> </xsl:if> </xsl:for-each> <xsl:text> </xsl:text> <xsl:for-each select="LIST_ARTICLE/ITEM"> <xsl:text>ARTICLE;</xsl:text> <xsl:for-each select="FIELD"> <xsl:if test="@name!='Name'"> <xsl:if test="@name!='CONFIG'"> <xsl:value-of select="@value"/> <!--Suppression de la dernière ';'--> <xsl:if test="position() != last()"> <xsl:text>;</xsl:text> </xsl:if> </xsl:if> </xsl:if> </xsl:for-each> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Merci d'avance à tous pour votre aide sur ce sujet !
Partager