XSLT/Xpath - 在单个语句中组合多个轴来查找“侄孙”?

wol*_*son 2 xml xslt xpath

我有一个 XML 文档,我需要找到距我的前一个兄弟姐妹最近的后代(在树中物理上最接近的 - 示例中的“宝藏”)。我不知道任何元素名称、元素内容,也不知道当前节点或我要选择的节点在文档中的深度。示例如下:

<tagA>
    <tagB>
        <tagC>
             junk
        </tagC>
        <tagC>
            <tagD>
                 junk
            </tagD>
        </tagC>
    </tagB>
    <tagB>
        <tagC>
            treasure
        </tagC>
    </tagB>
</tagA>
<tagX/>
Run Code Online (Sandbox Code Playgroud)

从 tagX 的位置,我需要能够测试我的前一个兄弟姐妹是否有后代,并选择最接近的一个“Treasure”。

我猜descendant::*[last()]一旦选择了前面的同级,我就可以使用它,但我不确定到达那里的语法。显然previous-sibling::descendant::*[last()]行不通。

有没有办法组合这些轴以在单个查询中实现此目的?

zx4*_*485 6

您的 XPath 表达式中只有一些小错误。
从上下文节点尝试以下表达式<tagX>

preceding-sibling::*[1]/descendant::*[last()]
Run Code Online (Sandbox Code Playgroud)

它的输出是

<tagC>
    treasure
</tagC>
Run Code Online (Sandbox Code Playgroud)

如果您只需要文本内容,请附加/text()到表达式中。


另一种表达是

(preceding-sibling::*[1]//text()[normalize-space()])[last()]/..
Run Code Online (Sandbox Code Playgroud)

使用示例 XML 的输出是相同的。
您必须决定哪种解决方案更适合您的需求。