xpath中不区分大小写的匹配?

Eth*_*han 66 xml xpath

例如,对于下面的xml

<CATALOG>
    <CD title="Empire Burlesque"/>
    <CD title="empire burlesque"/>
    <CD title="EMPIRE BURLESQUE"/>
    <CD title="EmPiRe BuRLeSQuE"/>
    <CD title="Others"/>
<CATALOG>
Run Code Online (Sandbox Code Playgroud)

如何将前4条记录与xpath匹配//CD[@title='empire burlesque'].是否有xpath函数来执行此操作?其他解决方案,如PHP函数也被接受.

Mat*_*hen 102

XPath 2具有小写(和大写)字符串函数.这与不区分大小写的不完全相同,但希望它足够接近:

//CD[lower-case(@title)='empire burlesque']
Run Code Online (Sandbox Code Playgroud)

如果您使用的是XPath 1,那么使用translate会有一个hack.


Mad*_*sen 52

matches()是一个XPATH 2.0函数,允许不区分大小写的正则表达式匹配.

其中的标志i不区分大小写的匹配.

以下XPATH使用带有不区分大小写标志的matches()函数:

//CD[matches(@title,'empire burlesque','i')]
Run Code Online (Sandbox Code Playgroud)

  • 这是基于正则表达式的,这是基于文本的匹配的重要区别. (11认同)
  • 请注意,这也可能会找到部分匹配项;如果这是不可接受的,则使用“^”和“$”,例如“matches(@title, '^empire burlesque$', 'i')” (2认同)

Tom*_*lak 9

一种可能的PHP解决方案

// load XML to SimpleXML
$x = simplexml_load_string($xmlstr);

// index it by title once
$index = array();
foreach ($x->CD as &$cd) {
  $title = strtolower((string)$cd['title']); 
  if (!array_key_exists($title, $index)) $index[$title] = array();
  $index[$title][] = &$cd;
}

// query the index 
$result = $index[strtolower("EMPIRE BURLESQUE")];
Run Code Online (Sandbox Code Playgroud)

  • 对于匿名的选民:阅读OP的问题.特别是*"其他解决方案,如PHP功能也被接受."*部分. (10认同)

Bhu*_*ani 9

这在Chrome开发者工具中无法找到元素,我希望在屏幕上找到"提交"按钮

//input[matches(@value,'submit','i')]
Run Code Online (Sandbox Code Playgroud)

但是,使用'translate'将所有大写字母替换为小作品,如下所示

//input[translate(@value,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'submit']
Run Code Online (Sandbox Code Playgroud)

更新:我刚刚找到了'匹配'无效的原因.我正在使用Chrome与xpath 1.0,它不会理解'匹配'的语法.它应该是xpath 2.0


小智 9

对于 selenium xpath 小写将不起作用...翻译将有帮助案例 1:

  1. 使用属性 //*[translate(@id,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='login_field']
  2. 使用任何属性 // [translate(@ ,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='login_field']

情况 2 : (包含) //[contains(translate(@id,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'login_field')]

情况 3 :对于 Text 属性 //*[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'username')]