2010-05-23 135 views
55

例如,下面的XMLxpath中不区分大小写的匹配?

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

如何匹配前4条记录与像//CD[@title='empire burlesque']的XPath。有xpath函数来做到这一点?其他解决方案,如PHP功能也被接受。

+1

http://stackoverflow.com/questions/586231/how-can-i-convert-a-string-to-upper-or-lower-case-with-xslt 检查out本文作者为xpath 1.0的文章 – user2237201 2013-04-02 17:36:55

回答

88

XPath 2具有小写(和大写)字符串函数。这不是不太一样不区分大小写的,但希望这将是非常接近:

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

如果您正在使用XPath 1,有hack using translate

+0

vtd-xml的xpath 1实现包含大写和小写 – 2010-05-23 22:05:41

+0

甚至可以在XML列上的SQL Server XPath查询中工作。优秀。 – 2015-08-26 06:24:02

+0

是的但https://stackoverflow.com/a/2893899/972128 FTW。 – kkurian 2017-11-24 02:41:56

8

一种可能的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")]; 
+8

给匿名低调的选民:阅读OP的问题。特别是*“其他解决方案,如PHP功能也被接受。”*部分。 – Tomalak 2011-08-02 12:32:15

42

matches()是XPath 2.0功能,允许进行不区分大小写的正则表达式匹配。

flags之一是i用于不区分大小写的匹配。

使用matches()功能与不区分大小写的标志以下XPath:

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

这是基于正则表达式的,这对于基于文本的匹配是一个重要的区别。 – usr 2014-01-20 15:58:30

2

你提到的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”用于字符串评估。

1

这不会在Chrome开发者工具的工作来定位元素,我期待找到“提交”按钮,在屏幕

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

但是,使用“翻译”来替换全部大写小作品如下

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

更新:我刚刚找到'匹配'的原因不起作用。我使用xpath 1.0的Chrome,它不理解语法'matches'。它应该是的XPath 2.0