xml - XSLT/Xpath - 在单个语句中组合多个轴以查找 "grand nephew"?

标签 xml xslt xpath

我有一个 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/

相关文章:

html - 使用 VS Projects 检查代码的 xslt 将 Xml 转换为 html

xml - <xsl :apply-templates/> and <xsl:apply-templates select ="."/> 有什么区别

java - 不稳定的测试 Selenium

c# - 用于选择节点的 XPath 查询

java - 除了 XPath 之外,在 selenium webdriver 中定位元素的最佳方法是什么?

xml - mxGraph:加载 XML 文件

c# - 如何从 XML 中按属性删除特定节点?

javascript - SAPUI5 通过属性名称从 XML 模型进行绑定(bind)聚合

c# - 如何找到xml元素的最小值和最大值

html - 哪个HTML元素具有特定类型的子级(例如标记)数量最多?