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