1

如何找到包含另一个节点名称的节点?

例如,如果<a>存在并<b>包含文本“a”,那么我希望选择<b>但如果给定的名称不存在则不选择。

<root>
    <a /> <!-- Do not care what is in this for now -->
    <b>a</b> <!-- Find this node only -->
    <b>c</b> <!-- This node is unwanted -->
</root>

我知道我可以有效地比较name()text()值,以下查找引用自己的节点并排除其他节点:

*[name() = text()]

我尝试查找其他引用失败,因为text()在此查询中处于错误的上下文中:

b[../*[name() = text()]]

<b>当至少有一个兄弟包含它自己的名字时,上面简单地返回 all ,也许如果有<a>a</a>.

我需要将节点的文本与名称的集合进行比较。我相信这应该是我正在寻找的,但*/name()会引发语法错误:

b[text() = ../*/name()]
4

1 回答 1

0

我认为这在 XPath 1.0 中是不可能的,因为 XPath 1.0 不提供用于定义范围变量的表达式/子句。此外,XPath 1.0 不允许将函数调用作为定位步骤。

XPath 2.0 解决方案很简单

b[. = ../*//name()]
于 2012-12-30T22:09:17.987 回答