这是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:我想在任何级别查找选项标签,而不仅仅是检查。应该已经解释过,但选项标签可以存在于
以下的任何级别答案 0 :(得分:3)
如果您想计算后代option
,则不应使用xsl:number
,但是:
<xsl:variable name="inputLevel" select="count(.//option)">
答案 1 :(得分:2)
我认为问题是xpath表达式option
与row
元素上的任何内容都不匹配 - 请尝试这样做:
<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
属性指定了什么 源树的级别应该是 考虑;它有价值single
,multiple
或any
。该 默认值为single
。
count
属性是一种模式 指定应该是什么节点 计算在那些水平。如果算数 没有指定属性,那么它 默认为匹配的模式 具有相同节点类型的任何节点 当前节点和,如果是当前节点 node有一个扩展名,带有 与当前节点相同的扩展名称当
level="any"
时,它会构造一个 包含该长度的长度列表 与count
匹配的节点数 模式和属于集合 包含当前节点和所有节点 文档任何级别的节点 在当前节点之前 文件订单,不包括任何 命名空间和属性节点(in 换言之成员的结合 前面的和祖先的或者自我的 轴强>)。如果from
属性是 指定,然后只有节点之后 当前节点之前的第一个节点 与模式相匹配的是 考虑。 ”
从本文中可以清楚地看到,只有祖先或在当前节点之前的节点才会被计算。
在这个问题中,当前节点是顶层元素节点row
,它有0个祖先和0个元素节点。
因此,返回的结果是正确的!
<强>解决方案强>:
使用:
count(descendant::option)
评估此表达式的结果是文档中所有option
元素的计数,它们是当前节点(row
元素)的后代。