2014-01-27 30 views
1

文本在下面的XML:的XPath:具有特殊儿童回归节点,但没有自己的

<document> 
<p rend="Default Style"><hi rend="bold italic">This one</hi></p> 
<p rend="Default Style"><hi rend="bold italic">Not this one</hi> please</p> 
<p rend="Default Style"><hi rend="italic">Not this one either</hi></p> 
<p rend="Default Style"><hi rend="bold">Not this one either</hi><hi rend="italic">Not this one either because it has others</hi></p> 
<p rend="Default Style"><hi rend="bold italic">This one</hi> <hi rend="bold italic">because it is all bold</hi></p> 
</document> 

我想选择含有的P元素:

  1. 喜子元素,其撕裂属性包含单词“大胆”
  2. 没有自己
  3. 没有别的
文本3210

这应该意味着我只能得到段落,其连接的内容是hi标签,其中的rend属性包含“bold”。

我试过了各种方法。最接近的似乎是:

//p[hi[contains(@rend, "bold")] and not(text()) and not(*[not(self::hi[contains(@rend, "bold")])])] 

但是,not(text())方面没有按我的意思工作。在P标签本身(上面的条件#2)中具有文本的行未被满足。

我都试过了,其它条件:

  • 没有(* [祖先::文()])
  • 没有(父::文本())

和几个其他。

任何帮助将不胜感激。我正在使用XSLT 1.0。

回答

3

hi元素之间的空格是有效的文本节点。使用normalize-space()来过滤它们。

p[count(hi) = count(hi[contains(@rend, 'bold')]) and not(text()[normalize-space()!=''])] 
+0

非常感谢:这太棒了。 –

+0

我认为这也适用,简单地说最后一个条件有点:'p [count(hi)= count(hi [contains(@rend,'bold')])and not(normalize-space(text()))]] ' –

+0

不,它不起作用。 text()选择一个节点集,而normalize-space()接受一个字符串作为参数。因此,XPath使用string()函数将节点集转换为字符串,并且此函数返回节点集中节点的字符串值,该节点集首先按文档顺序排列。请参阅http://www.w3.org/TR/xpath/#section-String-Functions – Erlock

相关问题