2010-05-23 23 views
55

,büyük küçük harf duyarlı eşleme? Aşağıdaki xml için Örneğin

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

//CD[@title='empire burlesque'] gibi XPath ile ilk 4 kayıtları eşleştirmek için nasıl. Bunu yapmak için xpath işlevi var mı? PHP fonksiyonu gibi diğer çözümler de kabul edilir.

+1

http://stackoverflow.com/questions/586231/how-can-i-convert-a-string-to-upper-or-lower-case-with-xslt çek olmalıdır xpath 1.0 – user2237201

cevap

88

XPath 2'de küçük harf (ve büyük harf) bir dize işlevi vardır.

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

XPath 1 kullanıyorsanız, bir hack using translate vardır: Bu durumda duyarsız, ama umarım yeterince yakın olacak şekilde aynı değil.

+0

için ben gripka'nın gönderimi vtd-xml'nin xpath uygulaması 1 büyük harf ve küçük harf içerir –

+0

Hatta XML sütunlarında SQL Server XPath sorgularında çalışır. Mükemmel. –

+0

Evet ama https://stackoverflow.com/a/2893899/972128 FTW. – kkurian

8

olası bir PHP çözüm:

// 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

İsimsiz aşağı seçmene: OP'nin sorusunu okuyun. Özellikle * "PHP fonksiyonu gibi diğer çözümler de kabul edilir." * Kısım. – Tomalak

42

matches() küçük harf duyarsız düzenli ifade eşleşmesi için izin veren bir XPATH 2.0 fonksiyonudur. flags ait

Bir harf duyarsız eşleştirme için i olduğunu.

harf duyarsız bayrağıyla matches() fonksiyonunu kullanarak aşağıdaki XPATH:

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

Bu, regex tabanlı olup, metin tabanlı eşleştirmede önemli bir farktır. – usr

2

O PHP çözümleri kabul edilebilir olduğunu belirtmiş ve PHP sadece XPath v1 desteklediği halde bunu gerçekleştirmek için bir yol teklif yok. 0. PHP işlev çağrılarına izin vermek için XPath desteğini genişletebilirsiniz.

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

fazla örnek için PHP registerPhpFunctions belgelere bakın. Temel olarak "php: function" un boole değerlendirmesi için olduğunu ve "php: functionString" dizgesi değerlendirmesi için olduğunu gösterir.

1

Bu küçük eserlerine kadar kapaklar yerine 'tercüme' kullanılarak, i

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

Ancak ekranda 'Gönder' butonuna bulmak için arıyorum, bir öğesini bulmak için Chrome Geliştirici araçları çalışmıyor

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

Güncelleme aşağıdaki gibi: sadece nedenini 'eşleşirken' çalışmıyor bulundu. 'Match' sözdizimini anlamayan xpath 1.0 ile Chrome kullanıyorum. Bu xpath 2.0

İlgili konular