Например, для 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 также приняты.
XPath 2 имеет строковую функцию в нижнем (и верхнем) регистре. Это не совсем то же самое, что нечувствительность к регистру, но, надеюсь, будет достаточно близко:
//CD[lower-case(@title)='empire burlesque']
Если вы используете XPath 1, есть хак с использованием translate .
Match () - это функция XPATH 2.0, которая позволяет использовать регулярные выражения без учета регистра соответствие.
Один из флагов - это i
для сопоставления без учета регистра.
Следующий XPATH, использующий функцию match () с флагом без учета регистра:
//CD[matches(@title,'empire burlesque','i')]
Одно из возможных решений 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")];