我正在尝试从XML中提取唯一值以及它们出现的次数。
我一直在关注Xslt distinct select / Group by中给出的答案,但我的架构有点不同。
我的XML看起来类似于:
<A>
<B>
<C>
<D>APPLE</D>
</C>
</B>
<B>
<C>
<D>BANANA</D>
</C>
</B>
<B>
<C>
<D>APPLE</D>
</C>
</B>
</A>
根据上一个答案中的代码,我有:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:key
name="C-by-DValue"
match="B/C/D"
use="text()"
/>
<xsl:template match="A">
<xsl:for-each select="
B/C/D[
count(
. | key('C-by-DValue', B/C/D/text())[1]
) = 1
]
">
<xsl:value-of select="text()"/>
<xsl:value-of select="' - '"/>
<!-- simple: the item count is the node count of the key -->
<xsl:value-of select="
count(
key('C-by-DValue', text())
)
"/>
<xsl:value-of select="' '"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
但是这会回来:
APPLE - 2
BANANA - 1
APPLE - 2
因此for-each-select不仅匹配每个text()值的第一个实例。有人能指出我正确的方向吗。
答案 0 :(得分:3)
您想要更改
<xsl:template match="A">
<xsl:for-each select="
B/C/D[
count(
. | key('C-by-DValue', B/C/D/text())[1]
) = 1
]
">
<xsl:value-of select="text()"/>
<xsl:value-of select="' - '"/>
<!-- simple: the item count is the node count of the key -->
<xsl:value-of select="
count(
key('C-by-DValue', text())
)
"/>
<xsl:value-of select="' '"/>
</xsl:for-each>
</xsl:template>
到
<xsl:template match="A">
<xsl:for-each select="
B/C/D[
count(
. | key('C-by-DValue',.)[1]
) = 1
]
">
<xsl:value-of select="text()"/>
<xsl:value-of select="' - '"/>
<!-- simple: the item count is the node count of the key -->
<xsl:value-of select="
count(
key('C-by-DValue', text())
)
"/>
<xsl:value-of select="' '"/>
</xsl:for-each>
答案 1 :(得分:2)
可以用更短的方式完成此分组任务,从不使用xsl:for-each
。
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kDByVal" match="D" use="."/>
<xsl:template match="D[generate-id()=generate-id(key('kDByVal', .)[1])]">
<xsl:value-of select=
"concat(., ' - ', count(key('kDByVal', .)), '
')"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
应用于提供的XML文档:
<A>
<B>
<C>
<D>APPLE</D>
</C>
</B>
<B>
<C>
<D>BANANA</D>
</C>
</B>
<B>
<C>
<D>APPLE</D>
</C>
</B>
</A>
生成想要的正确结果:
APPLE - 2
BANANA - 1