首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPath1.0: ancestor-or-self::NameTest/NameTest[predicate]不像我预期的那样工作

XPath1.0: ancestor-or-self::NameTest/NameTest[predicate]不像我预期的那样工作
EN

Stack Overflow用户
提问于 2018-05-03 09:02:43
回答 1查看 63关注 0票数 0

我正在处理一个具有“默认值”的XML词汇表:即,如果一个节点没有某个子节点,我希望找到最近的有该子节点的包围节点,并使用它的字符串值作为原始节点的子节点的值。

如果我有一棵树

代码语言:javascript
复制
Super_node
    sub_node: XXX
    ...
        context_node
            /* does not have a child with name sub_node */

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

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

代码语言:javascript
复制
string(ancestor-or-self::*/sub_node[1]/text())

我的想法是,ancestor-or-self::*以反向文档顺序返回context_nodeparent_of_context_node、.、Super_node的列表。我将sub_node测试应用于此,并在该列表中获得sub_node的列表,希望再次以反向文档顺序进行。

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

我在Stack Exchange上闲逛后发现,有什么用呢?

代码语言:javascript
复制
string((ancestor-or-self::*/sub_node)[last()]/text())

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-03 11:44:32

表达式

代码语言:javascript
复制
ancestor-or-self::*/sub_node[1]

手段

代码语言:javascript
复制
ancestor-or-self::*/(child::sub_node[1])

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

我怀疑你在想

代码语言:javascript
复制
(ancestor-or-self::*/sub_node)[1]

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

像1这样的谓词绑定比"/“更强。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50150998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档