Xpath 1.0: ancestor-or-self::NameTest/NameTest[predicate] 没有像我预期的那样工作
Xpath 1.0: ancestor-or-self::NameTest/NameTest[predicate] does not work as I expect
我正在处理具有 "default values" 的 XML 词汇表:即,如果一个节点没有某个子节点,我想找到最近的包含该子节点的封闭节点, 并将其字符串值作为原节点子节点的值。
例如,如果我有一棵树
Super_node
sub_node: XXX
...
context_node
/* does not have a child with name sub_node */
并且 Super_node
和 context_node
之间的中间节点没有子节点 sub_node
,我想要一个计算结果为 XXX
.
的表达式
我认为以下查询应该有效,但我总是得到一个节点列表:
string(ancestor-or-self::*/sub_node[1]/text())
我的想法是,ancestor-or-self::*
returns,按照相反的文档顺序,列表 context_node
, parent_of_context_node
, ..., Super_node
.我对其应用 sub_node
测试,并再次获得该列表中 sub_node
的列表,希望以相反的文档顺序。
然后我应用谓词 [1]
,它应该 return 该列表的第一个元素。然而,这个谓词似乎并不有效:在我的实现中(我认为是基于libxml2
),我仍然收到一个列表。
我在 Stack Exchange 上浏览了一下后发现,有效的是
string((ancestor-or-self::*/sub_node)[last()]/text())
为什么上面的谓词[1]
无效?
表达式
ancestor-or-self::*/sub_node[1]
表示
ancestor-or-self::*/(child::sub_node[1])
选择每个祖先元素的第一个 sub_node
子元素。
我怀疑你在想
(ancestor-or-self::*/sub_node)[1]
选择所有祖先元素的所有 sub_node
个子元素,将它们按文档顺序排序,然后 returns 此列表中的第一个节点。
像 [1] 这样的谓词比“/”绑定得更牢固。
我正在处理具有 "default values" 的 XML 词汇表:即,如果一个节点没有某个子节点,我想找到最近的包含该子节点的封闭节点, 并将其字符串值作为原节点子节点的值。
例如,如果我有一棵树
Super_node
sub_node: XXX
...
context_node
/* does not have a child with name sub_node */
并且 Super_node
和 context_node
之间的中间节点没有子节点 sub_node
,我想要一个计算结果为 XXX
.
我认为以下查询应该有效,但我总是得到一个节点列表:
string(ancestor-or-self::*/sub_node[1]/text())
我的想法是,ancestor-or-self::*
returns,按照相反的文档顺序,列表 context_node
, parent_of_context_node
, ..., Super_node
.我对其应用 sub_node
测试,并再次获得该列表中 sub_node
的列表,希望以相反的文档顺序。
然后我应用谓词 [1]
,它应该 return 该列表的第一个元素。然而,这个谓词似乎并不有效:在我的实现中(我认为是基于libxml2
),我仍然收到一个列表。
我在 Stack Exchange 上浏览了一下后发现,有效的是
string((ancestor-or-self::*/sub_node)[last()]/text())
为什么上面的谓词[1]
无效?
表达式
ancestor-or-self::*/sub_node[1]
表示
ancestor-or-self::*/(child::sub_node[1])
选择每个祖先元素的第一个 sub_node
子元素。
我怀疑你在想
(ancestor-or-self::*/sub_node)[1]
选择所有祖先元素的所有 sub_node
个子元素,将它们按文档顺序排序,然后 returns 此列表中的第一个节点。
像 [1] 这样的谓词比“/”绑定得更牢固。