Sie waren in der Nähe:
<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>
Daraus ergibt sich:
2336 - 2
2337 - 3
EDIT - Oh, ich sehe, Sie die Distinct Count innerhalb der Gruppe werden soll. Dies wäre:
<!-- 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>
Was (zugegebenermaßen) ein bisschen beängstigend aussieht. Es gibt:
2336 - 1
2337 - 2
Der Kern expression:
count(
key('kStatisticItemByGroup', @frontendGroupId)[
count(
. | key('kStatisticItemByGroupAndCase', concat(@frontendGroupId, ',', @caseId))[1]
) = 1
]
)
läuft darauf hinaus:
Zähle die Knoten von "key('kStatisticItemByGroup', @frontendGroupId)
", die die folgende Bedingung erfüllen: Sie sind die ersten in ihren jeweiligen " kStatisticItemByGroupAndCase
"Gruppe.
Wenn Sie genau hinsehen, werden Sie feststellen, dass dies nicht komplizierter ist als das, was Sie bereits tun. :-)
EDIT: Ein letzter Hinweis. Ich persönlich finde das viel ausdrucksvoller als die oben genannte Ausdrücke, weil es Knoten Gleichheit betont viel mehr als die „count(.|something) = 1
“ -Ansatz:
count(
key('kStatisticItemByGroup', @frontendGroupId)[
generate-id()
=
generate-id(
key('kStatisticItemByGroupAndCase', concat(@frontendGroupId, ',', @caseId))[1]
)
]
)
Das Ergebnis ist das gleiche.
"etwas, das ich so verwirrend gefunden habe, ist es nicht wert zu versuchen" Was für eine seltsame Einstellung. – Tomalak
Sie richtig meine Grammatik ist falsch - ich habe es versucht - viel, ich musste mehrere Ebenen (4 oder 5 wenn ich mich richtig erinnere) gruppieren. Ich habe es funktioniert, aber die wichtigsten Definitionen waren sehr verwirrend, besonders wenn die verschachtelten Gruppierungen tief werden. Aber die Zwei-Pass-Methode, die ich versucht habe, oben zu zeigen, ist viel einfacher zu erklären und zu lesen – Adrian
Ich empfehle, meine Antwort zu lesen: http: // stackoverflow.com/questions/948218/xslt-3-level-grouping-on-attribute - vielleicht hilft es dir :-) – Tomalak