在xpath中不区分大小写的匹配?
例如,下面的xml
<CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD title="EMPIRE BURLESQUE"/> <CD title="EmPiRe BuRLeSQuE"/> <CD title="Others"/> <CATALOG>
如何匹配xpath的前4条logging如//CD[@title='empire burlesque']
。 有xpath函数来做到这一点? 其他解决scheme,如PHPfunction也被接受。
XPath 2有一个小写(和大写)string函数。 这不像大小写不敏感,但希望它会足够接近:
//CD[lower-case(@title)='empire burlesque']
如果您使用的是XPath 1,那么使用translate会有一些破解 。
matches()是一个XPATH 2.0函数,允许区分大小写的正则expression式匹配。
其中一个标志是i
不区分大小写的匹配。
使用带有不区分大小写标志的matches()函数的以下XPATH:
//CD[matches(@title,'empire burlesque','i')]
一个可能的PHP解决scheme
// 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")];
您提到PHP解决scheme是可以接受的,而PHP也提供了一种方法来实现这一点,即使它只支持XPath v1.0。 您可以扩展XPath支持以允许PHP函数调用。
$xpathObj = new DOMXPath($docObj); $xpathObj->registerNamespace('php','http://php.net/xpath'); // (required) $xpathObj->registerPhpFunctions("strtolower"); // (leave empty to allow *any* PHP function) $xpathObj->query('//CD[php:functionString("strtolower",@title) = "empire burlesque"]');
有关更多示例,请参阅PHP registerPhpFunctions文档。 它基本上certificate“php:function”用于布尔评估,“php:functionString”用于string评估。
这在Chrome开发人员工具中无法find元素,我正在寻找屏幕上的“提交”button
//input[matches(@value,'submit','i')]
但是,使用“翻译”将所有上限replace为小作品如下
//input[translate(@value,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'submit']
更新:我刚刚find“匹配”不起作用的原因。 我正在使用铬xpath 1.0,它不理解语法“匹配”。 它应该是xpath 2.0