XPath / XQuery:在节点中查找文本,但忽略特定后代元素的内容

时间:2011-01-19 12:52:47

标签: xpath xquery

我试图找到一种在节点内搜索字符串的方法,但不包括那些节点的某些子元素的内容。简单明了,我想在文本的段落中搜索一个字符串,不包括作为段落的子元素的脚注。

例如,

我的文件是:

<document>
   <p n="1">My text starts here/</p>
   <p n="2">Then it goes on there<footnote>It's not a very long text!</footnote></p>
</document>

当我在搜索“text”时,我希望Xpath / XQuery检索第一个p元素,而不是第二个p元素(其中“text”仅包含在脚注子元素中)。

我尝试了contains()函数,但它检索了两个p元素。

任何帮助都会非常感激:)

4 个答案:

答案 0 :(得分:14)

  

我想在中搜索一个字符串   文本的段落,不包括   脚注是儿童元素   段落

XPath 1.0 - 唯一的解决方案:

使用

//p//text()[not(ancestor::footnote) and contains(.,'text')]

针对以下XML文档(从您的文档中获取但在p中添加了footnote以使其更有趣):

<document>
    <p n="1">My text starts here/</p>
    <p n="2">Then it goes on there
        <footnote>It's not a very long text!
           <p>text</p>
        </footnote>
    </p>
</document>

此XPath表达式精确选择所需的文本节点

My text starts here/

答案 1 :(得分:4)

//p[(.//text() except .//footnote//text())[contains(., 'text')]]

答案 2 :(得分:1)

/document/p[text()[contains(., 'text')]]应该这样做。

答案 3 :(得分:0)

作为记录,作为其他答案的补充,我发现这个解决方法似乎也可以完成这项工作:

//p[contains(child::text()|not(descendant::footnote), "text")]