我有一个XML文档,我需要找到离我以前的兄弟姐妹最近的后代(在树中物理上最接近——在示例中是"宝"(。我不知道任何元素名称、元素内容,也不知道当前节点或我要选择的节点在文档中的深度。示例如下:
<tagA>
<tagB>
<tagC>
junk
</tagC>
<tagC>
<tagD>
junk
</tagD>
</tagC>
</tagB>
<tagB>
<tagC>
treasure
</tagC>
</tagB>
</tagA>
<tagX/>
从tagX的位置,我需要能够测试我的前一个兄弟姐妹是否有后代,并选择最接近的一个,"宝藏"。
我猜,一旦选择了前面的同级,我就可以使用descendant::*[last()]
,但我不确定实现该目标的语法。显然previous-sibling::descendant::*[last()]
不起作用。
有没有一种方法可以将这些轴组合起来,在一个查询中实现这一点?
XPath表达式中只有一些小错误
在上下文节点<tagX>
中尝试以下表达式。
preceding-sibling::*[1]/descendant::*[last()]
其输出为
<tagC>
treasure
</tagC>
如果只需要文本内容,请将/text()
附加到表达式中。
另一种表达方式是
(preceding-sibling::*[1]//text()[normalize-space()])[last()]/..
使用示例XML的输出是相同的
您必须决定哪种解决方案更适合您的需求。