通过比较属性值来计算节点

时间:2017-01-24 23:56:30

标签: xslt xpath

说我有这样的颜色列表:

<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 = ...])"/>&#10;
</xsl:for-each>
No color: <xsl:value-of select="count(//item[not(@color)])"/>

但我不知道如何通过将它们与当前颜色进行比较来选择所有项目。有人能指出我正确的方向吗?

谢谢!

1 个答案:

答案 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>&#10;</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', ''))"/>