XPath:返回具有特定子节点但没有自己文本的节点

时间:2014-01-27 11:03:34

标签: xml xslt xpath

在以下XML中:

<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. hi子元素,其rend属性包含单词“bold”
  2. 没有自己的文字
  3. 别的什么
  4. 这应该意味着我只获得其连接内容为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。

1 个答案:

答案 0 :(得分:3)

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

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