ChatGPT解决这个技术问题 Extra ChatGPT

XPath 只返回包含文本的元素,而不是它的父元素

在这个 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”

有任何想法吗?

如果它包含文本中的任何位置的单词(例如“看看这是否会匹配单词”),或者只有值等于“匹配”的元素(忽略周围的空格),您是否正在寻找匹配?
这不是那么相关,要么会工作。问题主要是它也在返回它的父母

M
Mads Hansen

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

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

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

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

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

这将找到文本节点值中包含“匹配”的所有元素(匹配 random2random3):

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

XPATH 2.0 解决方案使用 matches() 函数和正则表达式模式,该模式查找包含“匹配”并从字符串开头(即 ^)或单词边界(即\W)并以字符串结尾(即$)或单词边界终止。第三个参数 i 评估不区分大小写的正则表达式模式。 (匹配 random2

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

你的第二个说法是不正确的。提示:获取具有多个文本节点的元素,其第一个文本节点不包含“匹配”。
谢谢@Dimitre。用应该更健壮的东西更新了它。
实际上我想用正则表达式运行一个特定的查询,比如 '^ma(t|T).*' 我可以使用第一个吗? //*[text()='^ma(t|T).*'] 对吗?
如果您想使用正则表达式,那么您将使用类似于最后一个示例的内容。 XSLT 1.0 不支持正则表达式,因此您需要 XSLT 2.0 样式表和 XSLT 2.0 处理器(如 saxon)才能使用它。
我认为 //*/text()[normalize-space(.)='match']/parent::* 应该是 //*[normalize-space(text())='match']//*[normalize-space(./text())='match']
G
Gregoire

尝试

//re:*[. ='match']