[xslt]Comportement d'un noeud crée dynamiquement
Bon, je vais essayer d'être le plus claire possible...
Voici mon XML:
Code:
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> |
Voici maintenant un résumé de mon xslt:
Code:
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> |
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:
:arrow: Smith
:arrow: Black
:arrow: 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:
Code:
1 2 3 4
| <xsl:param name="sortKeys" select="'LastName~~City~~Age~~'" />
<xsl:param name="parentSortKeys" select="''" />
<xsl:param name="parentSortValues" select="''" /> |
Pour:
Code:
1 2 3 4
| <xsl:param name="sortKeys" select="'City~~Age~~'" />
<xsl:param name="parentSortKeys" select="'LastName~~'" />
<xsl:param name="parentSortValues" select="'Smith~~'" /> |
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:
1 2 3
| <xsl:for-each select="$items">
<xsl:copy-of select="."/><br/>
</xsl:for-each> |
:arrow: Antony John Smith 35
:arrow: Paris Mark Smith 35
Le problème vient lorse que j'essaie de faire le distinct:
Code:
<xsl:for-each select="$items[not(preceding-sibling::*/child::*[name()=$levelKey] = child::*[name()=$levelKey])]">
Il ne me retourne que le premier:
:arrow: 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:
Code:
1 2 3 4
| <xsl:param name="sortKeys" select="'City~~Age~~'" />
<xsl:param name="parentSortKeys" select="''" />
<xsl:param name="parentSortValues" select="''" /> |
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...
:arrow: Antony --> Antony John Smith 35
:arrow: 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...