2012-04-10 111 views
4

对于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

你可以只使用

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

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

+0

或者,如果你可以接受多个B的,一[B,而不是(* [名称()=” b'])而不是(文字())]​​ – Woody 2012-04-10 08:42:15

+0

完美,非常感谢! – 2012-04-10 08:44:09

+0

@JensBannmann:你可能会对更短,更紧凑的表达感兴趣:) – 2012-04-10 12:24:30

1

较短

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

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

更短,如果你也不想有任何PI或发表评论的孩子

a[b and not(node()[2])] 
相关问题