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

XPath/XQuery:在节点中查找文本,但忽略特定子元素的内容,xpath,xquery,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>

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

比如说,

我的文件是:

<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元素

任何帮助都将不胜感激:)

/document/p[text()[contains(,'text')]]
应该可以

//p[(.//text() except .//footnote//text())[contains(., 'text')]]
我想在中搜索字符串 文本的段落,不包括 作为子元素的脚注 段落的结尾

仅限XPath 1.0的解决方案:

使用

//p//text()[not(ancestor::footnote) and contains(.,'text')]
My text starts here/
针对以下XML文档(从您的文档中获取,但在
脚注
中添加了
p
s,以使其更有趣):


为了记录在案,作为对其他答案的补充,我找到了这个似乎也能解决问题的解决方法:

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

谢谢你,马丁!唯一的问题是,在p中选择“text”,忽略所有子元素的内容。我只想忽略脚注元素。您能用一些更具代表性的XML示例更新您的问题,以便更清楚地了解需求是什么吗?
/document/p[后代或自身::*[非(自身::脚注)]/text()[包含(,'text')]
足够了吗?好问题,+1。请参阅我的答案,了解一个简短而简单的XPath 1.0表达式,它可以选择所需的文本节点,即使在更复杂的XML文档中也是如此。:)这不是有效的XPath表达式。联合运算符(
|
)要求其两个操作数都是节点,但
not()
函数的返回类型是xs:boolean——任何兼容的XPath引擎都必须引发错误。哎哟,你说得对,Dimitre,Oxy引发了错误。奇怪,这个表达式在我的PHP脚本中起作用了!
//p[contains(child::text()|not(descendant::footnote), "text")]