XSL:数字计数未按预期工作 -- 我的 XPath 有问题吗?

发布于 2024-11-04 18:32:32 字数 792 浏览 0 评论 0原文

这是 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:我想寻找任何级别的选项标签,而不仅仅是检查。应该已经解释过,但选项标签可以存在于下面的任何级别

Here's the XML

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

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

Here is the 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>

All I get is "0". http://www.w3schools.com/XPath/xpath_syntax.asp says "." means the current node. Shouldn't it be returning "6"?

Edit1: I wanted to look for option tags at ANY level, not just check. Should have explained but the option tags could exist at any level below

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

箜明 2024-11-11 18:32:33

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

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

If you want to count descendant options you shouldn't use xsl:number but:

<xsl:variable name="inputLevel" select="count(.//option)"> 
痴梦一场 2024-11-11 18:32:33

我认为问题在于 xpath 表达式 option 不会与 row 元素中的任何内容匹配 - 请尝试以下操作:

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

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

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

我不认为 from 属性是必需的,并且 level 属性可能没有按照您的想法执行(我'我也不确定它是做什么的......)

I think the problem is that the xpath expression option won't match anything at the row element - try this instead:

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

To look for option elements at any level use the following syntax:

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

I don't think the from attribute is reqired, and the level attribute probably isn't doing what you think it is (I'm also not sure what it does...)

影子的影子 2024-11-11 18:32:33

来自 XSLT 1.0 W3C 规范

“如果未指定 value 属性,则 xsl:number
元素
插入一个基于
当前节点在中的位置
源码树。
以下
属性控制当前的方式
节点要编号:

level属性指定什么
源树的级别应该是
经过考虑的;它有价值观
单个多个任意。这
默认为单个

count 属性是一个模式
指定节点应该是什么
按这些水平计算。如果算
未指定属性,则
默认为匹配的模式
具有相同节点类型的任何节点
当前节点,如果当前
节点有一个扩展名称,其中
与当前节点相同的扩展名称

level="any"时,它构造一个
长度为一的列表包含
count 匹配的节点数
模式并且属于该集合
包含当前节点和所有
文档任意级别的节点
位于当前节点之前
文件订单,不包括任何
命名空间和属性节点(在
换句话说成员联盟
先前的和祖先或自我
)。如果 from 属性是
指定,则仅在之后的节点
当前节点之前的第一个节点
与 from 模式匹配的是
经过考虑的。 ”。

从本文中可以清楚地看出,仅计算祖先节点或当前节点之前的节点。

在此问题中,当前节点是顶部元素节点并且它有 0 个祖先和 0 个前导元素节点。

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

解决方案

使用:

count(descendant::option)

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

From the XSLT 1.0 W3C specification:

"If no value attribute is specified, then the xsl:number
element
inserts a number based on the
position of the current node in the
source tree.
The following
attributes control how the current
node is to be numbered:

The levelattribute specifies what
levels of the source tree should be
considered; it has the values
single, multiple or any. The
default is single.

The count attribute is a pattern
that specifies what nodes should be
counted at those levels. If count
attribute is not specified, then it
defaults to the pattern that matches
any node with the same node type as
the current node and, if the current
node has an expanded-name, with the
same expanded-name as the current node

When level="any", it constructs a
list of length one containing the
number of nodes that match the count
pattern and belong to the set
containing the current node and all
nodes at any level of the document
that are before the current node in
document order, excluding any
namespace and attribute nodes (in
other words the union of the members
of the preceding and ancestor-or-self
axes
). If the from attribute is
specified, then only nodes after the
first node before the current node
that match the from pattern are
considered. ".

From this text it is clear that only nodes that are ancestors or are preceding the current node are counted.

In this question, the current node is the top element node row and it has 0 ancestor and 0 preceding element nodes.

Therefore, the returned result is correct!

Solution:

Use:

count(descendant::option)

The result of evaluating this expression is the count of all option elements in the document, that are descendents of the current node (the row element).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文