XSL:数量计数无法按预期工作 - 我的XPath问题?

时间:2011-05-04 00:20:51

标签: xslt xpath count

这是XML

<row>
    <cell>blah blah</cell>

    <check>
        <option/>
        <option/>
        <option/>
        <option/>
        <option/>
        <option/>
    </check>
</row>

这是XSL

<xsl:template match="row">
    <xsl:variable name="inputLevel">
        <xsl:number count="option" level="any" from="."/>
    </xsl:variable>

    <xsl:value-of select="$inputLevel"/>
</xsl:template>

我得到的只是“0”。 http://www.w3schools.com/XPath/xpath_syntax.asp说“。”表示当前节点。它不应该返回“6”吗?

Edit1:我想在任何级别查找选项标签,而不仅仅是检查。应该已经解释过,但选项标签可以存在于

以下的任何级别

3 个答案:

答案 0 :(得分:3)

如果您想计算后代option,则不应使用xsl:number,但是:

<xsl:variable name="inputLevel" select="count(.//option)"> 

答案 1 :(得分:2)

我认为问题是xpath表达式optionrow元素上的任何内容都不匹配 - 请尝试这样做:

<xsl:number count="check/option" level="any" from="." />

要在任何级别查找option元素,请使用以下语法:

<xsl:number count="//option" level="any" from="." />

我不认为from属性是必需的,而level属性可能不是你认为的那样(我也不确定它的作用......)

答案 2 :(得分:2)

来自 XSLT 1.0 W3C specification

  

“如果未指定value属性,则xsl:number element会根据   当前节点的位置   源树。以下   属性控制当前如何   节点应编号:

     

level属性指定了什么   源树的级别应该是   考虑;它有价值   singlemultipleany。该   默认值为single

     

count属性是一种模式   指定应该是什么节点   计算在那些水平。如果算数   没有指定属性,那么它   默认为匹配的模式   具有相同节点类型的任何节点   当前节点和,如果是当前节点   node有一个扩展名,带有   与当前节点相同的扩展名称

     

level="any"时,它会构造一个   包含该长度的长度列表   与count匹配的节点数   模式和属于集合   包含当前节点和所有节点   文档任何级别的节点   在当前节点之前   文件订单,不包括任何   命名空间和属性节点(in   换言之成员的结合   前面的和祖先的或者自我的   轴)。如果from属性是   指定,然后只有节点之后   当前节点之前的第一个节点   与模式相匹配的是   考虑。 ”

从本文中可以清楚地看到,只有祖先或在当前节点之前的节点才会被计算

在这个问题中,当前节点是顶层元素节点row,它有0个祖先和0个元素节点。

因此,返回的结果是正确的!

<强>解决方案

使用:

count(descendant::option)

评估此表达式的结果是文档中所有option元素的计数,它们是当前节点(row元素)的后代。