【问题标题】:Is this XPath technique reliable in all situations?这种 XPath 技术在所有情况下都可靠吗?
【发布时间】:2011-02-15 23:37:18
【问题描述】:

我正在开发一个应用程序,它接受用户定义的 XPath 表达式并将它们用作其运行时操作的一部分。

但是,我希望能够通过以编程方式操作表达式来推断一些额外的数据,并且我很想知道是否存在这种方法可能会失败的任何情况。

给定任何返回节点集的用户定义 XPath 表达式,将其包装在 XPath count() 函数中以确定集合中的节点数是否安全:

count(user_defined_expression)

同样地,将数组索引附加到表达式以提取集合中的一个节点是否安全:

user_defined_expression[1]

【问题讨论】:

    标签: xpath nodesets


    【解决方案1】:

    XPath 表达式(在 XPath 1.0 中)可以产生节点集、字符串、数字或布尔值,并且 count(expression) 仅对产生节点集的任何表达式有意义。

    至于添加位置谓词,我认为您可能希望在表达式周围使用括号,即将/root/foo/bar 更改为(/root/foo/bar)[1],这样您就可以在@ 选择的节点集中选择第一个bar 元素987654324@ 如果没有它们,你会得到/root/foo/bar[1],它将选择root 元素的任何foo 子元素的第一个bar 子元素。

    【讨论】:

    • 很高兴看到我提出了同样的问题 :)
    • 谢谢,这正是我试图避免的那种意想不到的并发症。
    • 我很高兴看到这条评论:我试图弄清楚如何使用 position()=N 或 [N] 作为查找第 N 个 匹配的方法> 而不是它的上下文 DOM 兄弟中的第 N 个项目,不知何故,我尝试了除括号之外的所有内容。
    【解决方案2】:

    您是否在检查此类用户定义的表达式是否始终计算为节点集?

    如果是,则第一个 Expr 是可以的。 fn:count 的数据类型将是正确的

    第二个比较棘手,例如,在很多情况下谓词会超重轴。 Check this answer 进行简单分析。很难说出用户的真正意思。

    【讨论】:

    • 也谢谢。您的答案与我接受的答案非常接近(很遗憾我不能同时接受两者),但 Martin 的方法很可能涵盖了我的应用将面临的场景。
    【解决方案3】:

    更健壮的方法是将 XPath 表达式转换为 XQueryX,它是抽象语法树的 XML 表示;然后,您可以对此 XML 表示进行 XQuery 或 XSLT 转换,然后转换回修改后的 XPath(或 XQuery)以进行评估。

    但是,这仍然只会为您提供表达式的句法结构;如果您需要语义信息,例如推断的结果的静态类型,您可能需要在 XPath 进程中插入以公开此信息。

    【讨论】:

    • +1 解析表达式会带来更多信息。补充一点:一个标准的 DOM Level 3 XPath 实现还提供了正确的工具来了解评估后结果数据类型等(节点集长度,即)。
    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    相关资源
    最近更新 更多