不区分大小写的 XPath 包含() 可能吗?

2022-08-30 05:27:46

我正在运行DOM的所有文本节点,并检查nodeValue是否包含某个字符串。

/html/body//text()[contains(.,'test')]

这区分大小写。但是,我也想抓住,或者.这在XPath(在JavaScript中)是可能的吗?TestTESTTesT


答案 1

这是针对 XPath 1.0 的。如果您的环境支持 XPath 2.0,请参阅此处


是的。可能,但不美观。

/html/body//text()[
  contains(
    translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
    'test'
  )
]

这适用于事先知道字母表的搜索字符串。添加您希望看到的任何重音字符。


如果可以的话,使用其他方法标记您感兴趣的文本,例如在构建 HTML 时将其括在具有特定类的中。使用 XPath 比使用元素文本中的子字符串更容易找到此类内容。<span>

如果这不是一个选项,您可以让 JavaScript(或您用于执行 XPath 的任何其他宿主语言)帮助您构建动态 XPath 表达式:

function xpathPrepare(xpath, searchString) {
  return xpath.replace("$u", searchString.toUpperCase())
              .replace("$l", searchString.toLowerCase())
              .replace("$s", searchString.toLowerCase());
}

xp = xpathPrepare("//text()[contains(translate(., '$u', '$l'), '$s')]", "Test");
// -> "//text()[contains(translate(., 'TEST', 'test'), 'test')]"

帽子提示@KirillPolishchuk的答案 - 当然,你只需要翻译那些你实际搜索的字符。

这种方法适用于任何搜索字符串,而不需要事先了解字母表,这是一个很大的优势。

当搜索字符串可以包含单引号时,上述两种方法都会失败,在这种情况下,事情会变得更加复杂


答案 2

不区分大小写contains

/html/body//text()[contains(translate(., 'EST', 'est'), 'test')]