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

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

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

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

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


是。 可能,但不漂亮。

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

如果可以的话,用一些其他方法标记你感兴趣的文本部分,比如把它们放在一个具有一定类别的<span>中。

如果这是不可能的,你可以让JavaScript帮助你build立一个合适的XPathexpression式:

 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的答案 – 当然,你只需要翻译你实际search的字符)

更美丽:

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

XPath 2.0解决scheme

  1. 使用小写()

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

  2. 使用与其大小写不敏感标志匹配的matches()正则expression式:

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

是。 您可以使用translate将您想匹配的文本转换为小写,如下所示:

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

如果您使用的是XPath 2.0,则可以将sorting规则指定为contains()的第三个参数。 但是,sorting规则URI不是标准化的,因此详细信息取决于您正在使用的产品。

请注意,以前使用translate()给出的解决scheme都假设您只使用了26个字母的英文字母。

我一直这样做的方式是使用XPath中的“translate”function。 我不会说它非常漂亮,但它工作正常。

 /html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')] 

希望这可以帮助,