Bon, je vais essayer d'être le plus claire possible...
Voici mon XML:
Voici maintenant un résumé de mon xslt:
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 <?xml version="1.0" encoding="UTF-8"?> <List> </ListItem> <Item> <City><![CDATA[Antony]]></City> <FirstName><![CDATA[John]]></FirstName> <LastName><![CDATA[Smith]]></LastName> <Age><![CDATA[35]]></Age> </Item> <Item> <City><![CDATA[Paris]]></City> <FirstName><![CDATA[Carl]]></FirstName> <LastName><![CDATA[Black]]></LastName> <Age><![CDATA[30]]></Age> </Item> <Item> <City><![CDATA[Paris]]></City> <FirstName><![CDATA[Mark]]></FirstName> <LastName><![CDATA[Smith]]></LastName> <Age><![CDATA[35]]></Age> </Item> <Item> <City><![CDATA[Antony]]></City> <FirstName><![CDATA[Joe]]></FirstName> <LastName><![CDATA[Brown]]></LastName> <Age><![CDATA[25]]></Age> </Item> </ListItem> </List>
Directement comme ça, tout fonctionne parfaitement. C'est à dire qu'il me retournera uniquement un enregistrement par nom de famille. Avec ce XML, il me retournera:
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="sortKeys" select="'LastName~~City~~Age~~'" /> <xsl:param name="parentSortKeys" select="''" /> <xsl:param name="parentSortValues" select="''" /> <xsl:template match="/"> <xsl:variable name="levelKey" select="substring-before($sortKeys, '~~')"/> <xsl:choose> <xsl:when test="$parentSortKeys != ''"> <xsl:call-template name="TREEVIEWAPPLYFILTER"> <xsl:with-param name="levelKey" select="$levelKey"/> <xsl:with-param name="parentSortKeys" select="$parentSortKeys"/> <xsl:with-param name="parentSortValues" select="$parentSortValues"/> <xsl:with-param name="builtSortKeys" select="$sortKeys"/> <xsl:with-param name="items" select="//Item"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="TREEVIEWBUILDRESULTS"> <xsl:with-param name="items" select="//Item"/> <xsl:with-param name="builtSortKeys" select="$sortKeys"/> <xsl:with-param name="levelKey" select="$levelKey"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="TREEVIEWAPPLYFILTER"> <xsl:param name="items"/> <xsl:param name="levelKey"/> <xsl:param name="parentSortKeys"/> <xsl:param name="parentSortValues"/> <xsl:param name="builtSortKeys"/> <xsl:param name="results"/> <xsl:variable name="key" select="substring-before($parentSortKeys, '~~')"/> <xsl:variable name="value" select="substring-before($parentSortValues, '~~')"/> <xsl:choose> <xsl:when test="$key != '' and $key != $levelKey"> <xsl:call-template name="TREEVIEWAPPLYFILTER"> <xsl:with-param name="items" select="$items[child::*[name() = $key and text() = $value]]"/> <xsl:with-param name="results" select="$items[child::*[name() = $key and text() = $value]]"/> <xsl:with-param name="parentSortKeys" select="substring-after($parentSortKeys, '~~')"/> <xsl:with-param name="parentSortValues" select="substring-after($parentSortValues, '~~')"/> <xsl:with-param name="builtSortKeys" select="$builtSortKeys"/> <xsl:with-param name="levelKey" select="$levelKey"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="TREEVIEWBUILDRESULTS"> <xsl:with-param name="items" select="$results"/> <xsl:with-param name="builtSortKeys" select="$builtSortKeys"/> <xsl:with-param name="levelKey" select="$levelKey"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="TREEVIEWBUILDRESULTS"> <xsl:param name="levelKey"/> <xsl:param name="builtSortKeys"/> <xsl:param name="items"/> <br/> <xsl:for-each select="$items"> <xsl:copy-of select="."/><br/> </xsl:for-each> <br/> <xsl:copy-of select="$levelKey"/><![CDATA[:]]><br/> <xsl:for-each select="$items[not(preceding-sibling::*/child::*[name()=$levelKey] = child::*[name()=$levelKey])]"> <xsl:copy-of select="child::*[name()=$levelKey]"/> <![CDATA[ --> ]]> <xsl:copy-of select="."/><br/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Smith
Black
Brown
Mais il ne passe pas par le template TREEVIEWAPPLYFILTER. si dans le cas où il y a un filtre a appliquer:
Pour en faire le test, il faut changer:
Pour:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <xsl:param name="sortKeys" select="'LastName~~City~~Age~~'" /> <xsl:param name="parentSortKeys" select="''" /> <xsl:param name="parentSortValues" select="''" />
Dans ce cas, en passant par le template TREEVIEWAPPLYFILTER il nettoie le noeud item pour en garder que ceux dont le LastName est Smith. Cela fonctionne aussi très bien puisque dans le template TREEVIEWBUILDRESULTS j'affiche un à un les résultats trouvés et il me retourne effectivement les deux enregistrements:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <xsl:param name="sortKeys" select="'City~~Age~~'" /> <xsl:param name="parentSortKeys" select="'LastName~~'" /> <xsl:param name="parentSortValues" select="'Smith~~'" />
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <xsl:for-each select="$items"> <xsl:copy-of select="."/><br/> </xsl:for-each>Antony John Smith 35
Paris Mark Smith 35
Le problème vient lorse que j'essaie de faire le distinct:
Il ne me retourne que le premier:
Code : Sélectionner tout - Visualiser dans une fenêtre à part <xsl:for-each select="$items[not(preceding-sibling::*/child::*[name()=$levelKey] = child::*[name()=$levelKey])]">
Antony --> Antony John Smith 35
C'est comme si lorse que je construit le noeud le preceding-sibling ne fonctionne plus...
J'ai aussi fait le test suivant: Premièrement, j'ai retiré les noeuds du XML qui ne sont pas des Smith et j'ai modifié mes paramètres comme ceci:
Encore une fois, ce que je m'attendait, le résultat est bon puisqu'il ne passe pas par le TREEVIEWAPPLYFILTER et ne fabrique pas le noeud...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <xsl:param name="sortKeys" select="'City~~Age~~'" /> <xsl:param name="parentSortKeys" select="''" /> <xsl:param name="parentSortValues" select="''" />
Antony --> Antony John Smith 35
Paris --> Paris Carl Black 30
Je dois avouer que je suis un peu perdu là!!! Est-ce qu'il y a une différence si je fait un for-each "directement" du XML ou si je fabrique un noeud???
J'espère que j'ai été assez claire...
Merci de votre aide...
Partager