5

对于 XSLT 模板,我需要一个 XPath 表达式来定位具有特定子元素但没有文本节点的元素。

<!-- 1: matches -->
<a><b/></a>

<!-- 2: does not match -->
<a>foo bar quux<b/></a>

<!-- 3: does not match -->
<a>whatever <b/> further text</a>

<!-- 4: does not match -->
<a>whatever <b/> further text <b/></a>

 <!-- 5: does not match -->
<a><x/><b/></a>

<!-- 6: does not match -->
<a>foo bar quux</a>

我想出了a[*[1 = last() and name() = 'b']],但是在不应该匹配的情况下,情况 2 或 3 被匹配了。当然,原因是*选择元素而不关心文本节点。那么我该怎么做呢?

4

2 回答 2

3

你可以使用

a[count(*)=1 and b and not(text())]

如果您只寻找一个 b,没有其他元素,也没有文本。请记住,如果您的 xml 中有回车,某些处理器会将其视为文本。

于 2012-04-10T08:36:31.167 回答
2
a[b and not(text() or *[2])]

这将选择a当前节点(上下文节点)的每个具有子节点的子节点b,并且没有任何文本节点子节点或第二个元素子节点。

如果您也不想有任何 PI 或评论子项,您可以使用较短的版本:

a[b and not(node()[2])]
于 2012-04-10T12:18:46.873 回答