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

时间:2011-12-12 12:05:08

标签: javascript xml xpath

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

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

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

6 个答案:

答案 0 :(得分:91)

这适用于XPath 1.0。如果您的环境支持XPath 2.0,请参阅here


是。可能,但不美观。

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

如果可以,请使用其他方式标记您感兴趣的文字部分,例如将其封闭在具有特定类别的<span>中。

如果无法做到这一点,您可以让JavaScript帮助您构建适当的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's answer - 当然你只需翻译那些你实际上正在搜索的字符

答案 1 :(得分:53)

更漂亮:

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

答案 2 :(得分:45)

XPath 2.0解决方案

  1. 使用lower-case()

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

  2. 使用matches()正则表达式匹配不区分大小写 标志:

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:2)

我总是这样做的方法是在XPath中使用“translate”功能。我不会说它非常漂亮,但它可以正常工作。

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

希望这有帮助,