Xpath 1.0:ancestor-or-self :: NameTest / NameTest [predicate]不能正常工作

时间:2018-05-03 09:02:44

标签: xpath xpath-1.0

我正在处理具有“默认值”的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_node的列表。

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

我在堆栈交换机上稍稍找到后找到了什么工作

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

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

1 个答案:

答案 0 :(得分:0)

表达式

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

装置

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

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

我怀疑你在考虑

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

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

像[1]这样的谓词比#34; /"。

更强烈地绑定