XPath仅返回包含文本的元素,而不返回其父元素


77

在此xml中,我要匹配包含“ match”的元素(random2元素)

<root>
 <random1>
  <random2>match</random2>
  <random3>nomatch</random3>
 </random1>
</root>

好的,到目前为止,我有:

//[re:test(.,'match','i')] (with re in the proper namespace)

这将返回random2,random1和root ...我只想获取“ random2”

有任何想法吗?


您是否要匹配包含在文本中任何位置的单词(例如“查看是否单词匹配”),或者仅匹配值等于“ match”(忽略周围的空白)的元素?
Mads Hansen

没关系,两者都可以。问题主要在于它
也要

Answers:


165

您是否要查找包含“匹配”或等于“匹配”的元素?

这将查找具有等于'match'的文本节点的元素(由于中的前导和尾随空格,因此不匹配任何元素random2):

//*[text()='match']

在删除前导和尾随空格(matches random2)之后,这将查找具有等于“ match”的文本节点的所有元素:

//*[normalize-space(text())='match']

这将查找文本节点值中包含“ match”的所有元素(matchrandom2random3):

//*[contains(text(),'match')]

XPATH 2.0解决方案使用matches()函数和一个正则表达式模式,看起来对于包含“匹配”和在字符串(即开始时起算文本节点^)或字边界(即,\W)和由所述字符串的末尾端的(即$)或单词边界。第三个参数i计算不区分大小写的正则表达式模式。(匹配项random2

//*[matches(text(),'(^|\W)match($|\W)','i')]

您的第二个说法不正确。提示:采用具有多个文本节点的元素,其第一个文本节点不包含“匹配”。
Dimitre Novatchev 2010年

谢谢@Dimitre。更新了一些应该更强大的功能。
Mads Hansen

实际上,我想使用regexp来运行特定查询,例如'^ ma(t | T)。*'。我可以使用第一个查询吗?//*[text()='^ma(t|T).*']对吗?
julian 2010年

如果要使用正则表达式,则可以使用上一个示例。XSLT 1.0不支持Regex,因此您需要XSLT 2.0样式表和XSLT 2.0处理器(如saxon)才能使用它。
Mads Hansen 2010年

我相信//*/text()[normalize-space(.)='match']/parent::*应该是//*[normalize-space(text())='match']//*[normalize-space(./text())='match']
neaumusic

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.