我正在处理具有"默认值"的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::*
以相反的文档顺序返回context_node
、parent_of_context_node
、...、Super_node
的列表。 我对此应用sub_node
测试,并再次希望以相反的文档顺序获取该列表中的sub_node
列表。
然后我应用谓词[1]
,它应该返回该列表的第一个元素。 但是,这个谓词似乎无效:在我的实现中(我认为这是基于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
子元素,将它们按文档顺序排序,然后返回此列表中的第一个节点。
像 [1] 这样的谓词比 "/" 绑定得更强烈。