说我有这样的颜色列表:
<colors>
<color>Red</color>
<color>Green</color>
<color>Blue</color>
</colors>
我有任意数量的项目,每个项目都有颜色:
<items>
<item color="Blue"/>
</items>
现在我想为每种颜色显示该颜色有多少项:
<xsl:for-each select="//color">
<xsl:value-of select="."/>: <xsl:value-of select="count(//item[@color = ...])"/>
</xsl:for-each>
No color: <xsl:value-of select="count(//item[not(@color)])"/>
但我不知道如何通过将它们与当前颜色进行比较来选择所有项目。有人能指出我正确的方向吗?
谢谢!
答案 0 :(得分:1)
我建议您使用 key 按项目颜色链接到项目。例如,给定:
<强> XML 强>
<root>
<colors>
<color>Red</color>
<color>Green</color>
<color>Blue</color>
</colors>
<items>
<item color="Red"/>
<item color="Green"/>
<item color="Blue"/>
<item color="Green"/>
<item color="Blue"/>
<item color="Blue"/>
</items>
</root>
以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:key name="item-by-color" match="item" use="@color" />
<xsl:template match="/root">
<xsl:for-each select="colors/color">
<xsl:value-of select="."/>
<xsl:text>: </xsl:text>
<xsl:value-of select="count(key('item-by-color', .))"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
将返回:
Red: 1
Green: 2
Blue: 3
如果您还想计算没有颜色的项目,请将密钥定义更改为:
<xsl:key name="item-by-color" match="item" use="string(@color)" />
然后使用:
<xsl:value-of select="count(key('item-by-color', ''))"/>