【问题标题】:Xpath 1.0: ancestor-or-self::NameTest/NameTest[predicate] does not work as I expectXpath 1.0:ancestor-or-self::NameTest/NameTest[predicate] 不像我预期的那样工作
【发布时间】:2018-05-03 09:02:43
【问题描述】:

我正在处理一个具有“默认值”的 XML 词汇表:即,如果一个节点没有某个子节点,我想找到最近的包含该子节点的封闭节点,并将其字符串值用作原始节点的子节点的值。

例如,如果我有一棵树

Super_node
    sub_node: XXX
    ...
        context_node
            /* does not have a child with name sub_node */

Super_nodecontext_node 之间没有中间节点有一个子 sub_node,我想要一个计算结果为 XXX 的表达式。

我在想下面的查询应该可以工作,但我总是得到一个节点列表:

string(ancestor-or-self::*/sub_node[1]/text())

我的想法是ancestor-or-self::* 以相反的文档顺序返回context_nodeparent_of_context_node、...、Super_node 的列表。我对其应用sub_node 测试,并再次获得该列表中sub_nodes 的列表,希望以相反的文档顺序。

然后我应用谓词[1],它应该返回该列表的第一个元素。但是,这个谓词似乎无效:在我的实现中(我认为是基于libxml2),我仍然收到一个列表。

我在 Stack Exchange 上摸索了一下后发现,什么是有效的,是

string((ancestor-or-self::*/sub_node)[last()]/text())

为什么上面的谓词[1]无效?

【问题讨论】:

  • 共享真实的 XML 代码示例而不是伪节点树。 + 当前,所需的输出

标签: xpath xpath-1.0


【解决方案1】:

表达式

ancestor-or-self::*/sub_node[1]

意思

ancestor-or-self::*/(child::sub_node[1])

选择每个祖先元素的第一个 sub_node 子元素。

我怀疑你在想

(ancestor-or-self::*/sub_node)[1]

它选择所有祖先元素的所有sub_node子元素,将它们按文档顺序排序,然后返回此列表中的第一个节点。

像 [1] 这样的谓词比“/”绑定得更牢固。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2016-12-03
    • 2014-05-16
    • 1970-01-01
    相关资源
    最近更新 更多