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


76

例如,对于下面的xml

<CATALOG>
    <CD title="Empire Burlesque"/>
    <CD title="empire burlesque"/>
    <CD title="EMPIRE BURLESQUE"/>
    <CD title="EmPiRe BuRLeSQuE"/>
    <CD title="Others"/>
<CATALOG>

如何将前4条记录与xpath匹配//CD[@title='empire burlesque']。有xpath函数可以做到这一点吗?还接受其他解决方案,例如PHP函数。


1
stackoverflow.com/questions/586231/… 请查看本本·格里普卡的xpath 1.0文章
user2237201 2013年

在这里,我还发现了另外2个解决方案,其描述如下:(不是我的网站/促销)codingexplained.com/coding/php/…–
bharat

Answers:


113

XPath 2具有小写(和大写)字符串功能。这与不区分大小写的代码不太一样,但是希望它足够接近:

//CD[lower-case(@title)='empire burlesque']

如果您使用的是XPath 1,则可能会使用翻译


甚至可以在XML列上的SQL Server XPath查询中使用。优秀。
TJ Crowder

55

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

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

以下XPATH使用match()函数以及不区分大小写的标志:

//CD[matches(@title,'empire burlesque','i')]

13
这是基于正则表达式的,这与基于文本的匹配是重要的区别。
usr

12

这在Chrome Developer工具中无法找到元素,我正在寻找屏幕上的“提交”按钮

//input[matches(@value,'submit','i')]

但是,使用“翻译”将所有大写字母替换为小型作品,如下所示

//input[translate(@value,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'submit']

更新:我只是找到了“匹配”不起作用的原因。我将Chrome与xpath 1.0结合使用,无法理解语法“ matches”。应该是xpath 2.0


就国际化而言,翻译概念似乎称为“不区分大小写的排序规则”
神秘的

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")];

11
匿名匿名投票者:阅读OP的问题。尤其是“也接受其他类似PHP函数的解决方案。” 部分。
Tomalak

3

您提到了PHP解决方案是可以接受的,并且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文档。它基本上说明“ php:function”用于布尔值评估,“ php:functionString”用于字符串评估。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.