我想将列表缩减为不同的元素,但要计算该元素每次出现的次数:
<list>
<entry>A</entry>
<entry>B</entry>
<entry>A</entry>
<entry>A</entry>
<entry>B</entry>
</list>
目标结果:
A - 3 [出现]
B - 2 [出现]
我尝试过使用
<xsl:value-of select="count()" />
但它要么计算“entry”元素(5)的所有出现次数,要么计算不同“entry”元素的数量(2,即A和B)。
我最近的尝试是将两个for-each循环组合在一起(之前从未做过),但这也不起作用:
<xsl:variable name="occurences">
<xsl:for-each select="//entry[not(.=preceding::entry)]">
<xsl:value-of select="count()" />
</xsl:for-each>
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="//entry">
<p>
<xsl:value-of select="." /> - <xsl:value-of select="$occurences" />
</p>
</xsl:for-each>
</xsl:template>
[使用错误的参数调用XPath函数。]
我会感激任何暗示......
谢谢! 约翰
答案 0 :(得分:0)
如果你确实可以使用XSLT 2.0,可以在这里使用xsl:for-each-group
,但是你需要选择entry
个元素,而不是单个list
元素,因为它是你的入口元素希望分组。
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="list">
<table>
<xsl:for-each-group select="entry" group-by=".">
<tr>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="count(current-group())"/></td>
</tr>
</xsl:for-each-group>
</table>
</xsl:template>
</xsl:stylesheet>
或者,您可以使用distinct-values
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="entry" match="entry" use="." />
<xsl:variable name="root" select="/" />
<xsl:template match="list">
<table>
<xsl:for-each select="distinct-values(entry)">
<tr>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="count(key('entry', ., $root))"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
请注意key
函数中第三个参数的使用,因为在循环中,您不再位于主文档的上下文中。