小编典典

不区分大小写的xpath contains()可能吗?

javascript

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

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

这是区分大小写的。不过,我也想赶上TestTESTTesT。XPath(在JavaScript中)可以实现吗?


阅读 351

收藏
2020-05-01

共1个答案

小编典典

是。可能,但不漂亮。

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

这适用于事先知道字母的搜索字符串。添加您希望看到的所有带重音符号的字符。


如果可以的话,请通过其他方式标记您感兴趣的文本,例如<span>在构建HTML时将其包含在具有特定类的文本中。与元素文本中的子字符串相比,使用XPath定位这些东西要容易得多。

如果这不是一种选择,则可以让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')]"
2020-05-01