查找具有特定子元素但没有文本节点的元素

时间:2012-04-10 08:22:58

标签: xslt xpath

对于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时。当然,原因是*选择元素而不关心文本节点。那我该怎么做呢?

2 个答案:

答案 0 :(得分:3)

你可以使用

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

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

答案 1 :(得分:2)

a[b and not(text() or *[2])]

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

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

a[b and not(node()[2])]