我有一个 XML 文档,我需要找到离我 previous sibling 姐妹最近的后代(在树中物理上最近的 - 在示例中为“宝藏”)。我不知道任何元素名称、元素内容,也不知道当前节点或我要选择的节点在文档中的深度。示例如下:
<tagA>
<tagB>
<tagC>
junk
</tagC>
<tagC>
<tagD>
junk
</tagD>
</tagC>
</tagB>
<tagB>
<tagC>
treasure
</tagC>
</tagB>
</tagA>
<tagX/>
从 tagX 的位置,我需要能够测试我的前一个 sibling 是否有后代,并选择最接近的“Treasure”。
我猜我可以使用 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 的输出是相同的。
您必须决定哪种解决方案更适合您的需求。
关于xml - XSLT/Xpath - 在单个语句中组合多个轴以查找 "grand nephew"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51507002/