Vous étiez près:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:key
name="statistic-by-frontendGroupId"
match="statisticItem"
use="@frontendGroupId"
/>
<xsl:template match="statisticItems">
<xsl:for-each select="
statisticItem[
count(
. | key('statistic-by-frontendGroupId', @frontendGroupId)[1]
) = 1
]
">
<xsl:value-of select="@frontendGroupId"/>
<xsl:value-of select="' - '"/>
<!-- simple: the item count is the node count of the key -->
<xsl:value-of select="
count(
key('statistic-by-frontendGroupId', @frontendGroupId)
)
"/>
<xsl:value-of select="' '"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Il en résulte:
2336 - 2
2337 - 3
EDIT - Oh, je vois que vous voulez le compte distinct au sein du groupe. Ce serait:
<!-- the other key from the above solution is still defined -->
<xsl:key
name="kStatisticItemByGroupAndCase"
match="statisticItem"
use="concat(@frontendGroupId, ',', @caseId)"
/>
<xsl:template match="statisticItems">
<xsl:for-each select="
statisticItem[
count(
. | key('kStatisticItemByGroup', @frontendGroupId)[1]
) = 1
]
">
<xsl:value-of select="@frontendGroupId"/>
<xsl:value-of select="' - '"/>
<xsl:value-of select="
count(
key('kStatisticItemByGroup', @frontendGroupId)[
count(
. | key('kStatisticItemByGroupAndCase', concat(@frontendGroupId, ',', @caseId))[1]
) = 1
]
)
"/>
<xsl:value-of select="' '"/>
</xsl:for-each>
</xsl:template>
Qui semble (certes) un peu effrayant. Il produit:
2336 - 1
2337 - 2
L'expression principale:
count(
key('kStatisticItemByGroup', @frontendGroupId)[
count(
. | key('kStatisticItemByGroupAndCase', concat(@frontendGroupId, ',', @caseId))[1]
) = 1
]
)
se résume à:
Compter les nœuds de "key('kStatisticItemByGroup', @frontendGroupId)
" qui remplissent les conditions suivantes: Ils sont les premiers dans leurs " kStatisticItemByGroupAndCase
"groupe.
En y regardant de plus près, vous constaterez que ce n'est pas plus compliqué que ce que vous faites déjà. :-)
EDIT: Un dernier indice. Personnellement, je trouve cela beaucoup plus expressif que les expressions ci-dessus, car il met l'accent sur l'égalité des noeuds beaucoup plus que la « count(.|something) = 1
» approche:
count(
key('kStatisticItemByGroup', @frontendGroupId)[
generate-id()
=
generate-id(
key('kStatisticItemByGroupAndCase', concat(@frontendGroupId, ',', @caseId))[1]
)
]
)
Le résultat est le même.
"Quelque chose que j'ai trouvé si déroutant qui ne vaut pas la peine d'essayer" Quelle attitude étrange. – Tomalak
vous avez raison ma grammaire est fausse - j'ai essayé - beaucoup, j'ai eu besoin de grouper les niveaux multiples (4 ou 5 si rappelez-vous correctement). J'ai réussi à le faire fonctionner mais les définitions clés étaient très confuses, surtout lorsque les groupements imbriqués deviennent profonds. Mais la méthode de deux passes que j'ai essayé de montrer ci-dessus est beaucoup plus facile à expliquer et à lire – Adrian
Je recommande de lire ma réponse à: http: // stackoverflow.com/questions/948218/xslt-3-level-grouping-on-attributes - peut-être que cela vous aide :-) – Tomalak