计算XSLT中父节点具有某些属性的节点

时间:2010-07-02 15:52:54

标签: xslt xpath parent

我有这样的XML:

<exam>
    <section name="SampleSection1">
        <attributes>
            <variable_name data_type="String" value="SCORE"/>
        </attributes>
        <item name="SampleItem1-1"/>
        <item name="SampleItem1-2"/>
        <item name="SampleItem1-3"/>
    </section>
    <section name="SampleSection2">
        <attributes>
            <variable_name data_type="String" value="NO-SCORE"/>
        </attributes>
        <item name="SampleItem2-1"/>
        <item name="SampleItem2-2"/>
    </section>
</exam>

我想计算一个变量名为“SCORE”的部分中的项目数。

我认为这可以胜任:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

    <xsl:template match="section">
        <xsl:variable name="scoredItems"
                  select="./item/../attributes/variable_name[@value='SCORE']"/>
        <xsl:variable name="scoredItemsCount" select="count($scoredItems)"/>
        <xsl:value-of select="$scoredItemsCount"/>
    </xsl:template>
</xsl:stylesheet>

然而,这输出:

1
0

3
0

这是我期望的(也是想要的)。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

    <xsl:variable name="scoredItems" 
              select="./item/../attributes/variable_name[@value='SCORE']"/>

这会选择所有variable-name元素,以使其value属性的值为'SCORE'。而只是一个节点。

你想:

<强> self::section[attributes/variable_name/@value='SCORE']/item

如果上下文节点(section)的元素attributes具有variable_name属性为''SCORE'的元素value,则会选择所有项元素。

如果上下文节点没有该属性,则上面的XPath表达式不会选择任何内容。

现在已更正的转化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

    <xsl:template match="section">
        <xsl:variable name="scoredItems"
                  select="self::section[attributes/variable_name/@value='SCORE']/item"/>
        <xsl:variable name="scoredItemsCount" select="count($scoredItems)"/>
        <xsl:value-of select="$scoredItemsCount"/>
    </xsl:template>
</xsl:stylesheet>

产生想要的结果

3
0