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

Aro*_*ost 85 javascript xml xslt xpath

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

/html/body//text()[contains(.,'test')]
Run Code Online (Sandbox Code Playgroud)

这是区分大小写的.但是,我也想抓住Test,TEST奥得TesT.这可能与XPath(在JavaScript中)?

Tom*_*lak 97

这适用于XPath 1.0.如果您的环境支持XPath 2.0,请参阅此处.


是.可能,但不美观.

/html/body//text()[
  contains(
    translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
    'test'
  )
]
Run Code Online (Sandbox Code Playgroud)

如果可以的话,用其他方法标记您感兴趣的文本部分,例如将它们包含在<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')]"
Run Code Online (Sandbox Code Playgroud)

(帽子提示@ KirillPolishchuk的答案 - 当然你只需要翻译那些你正在搜索的字符)

  • System.Xml.XmlNodeList x = mydoc.SelectNodes(“ // * [包含(翻译(text(),'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜÉÈÊÁÁÁÓÒÇÅÏÕÑŒ','abcdefghijklmnopqrstuvwxyzäöö'é''')'),) (2认同)

Kir*_*huk 59

更美丽:

/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
Run Code Online (Sandbox Code Playgroud)

  • @MuhammadAdeelZahid - 不,它用"t"代替"T",用"e"代替"E"等.这是一对一的比赛. (5认同)
  • +1绝对.这是我没想到的.*(我会在我的回答中使用它,这比我写的原始JavaScript例程要好得多)* (4认同)
  • 它不会只是将`TEST`转换为`test`并保持`Test`原样? (4认同)
  • 执行 `translate(., 'TES', 'tes')` 可能会更清楚。这样人们就会意识到这不是单词翻译,而是字母翻译。 (2认同)

kjh*_*hes 48

XPath 2.0解决方案

  1. 使用小写():

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

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

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

  • Firefox 和 Chrome 仅实现 XPath 1.0。 (4认同)

Mar*_*mit 7

我一直这样做的方法是使用 XPath 中的“翻译”功能。我不会说它非常漂亮,但它工作正常。

/html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',
                                        'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),'TEST')]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助,


And*_*ndy 7

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

/html/body//text()[contains(translate(., 
                                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                                      'abcdefghijklmnopqrstuvwxyz'),
                   'test')]
Run Code Online (Sandbox Code Playgroud)


Mic*_*Kay 6

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

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