нечувствительное к регистру соответствие в xpath?

Например, для 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 также приняты.

66
задан Ethan 23 May 2010 в 21:32
поделиться

3 ответа

XPath 2 имеет строковую функцию в нижнем (и верхнем) регистре. Это не совсем то же самое, что нечувствительность к регистру, но, надеюсь, будет достаточно близко:

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

Если вы используете XPath 1, есть хак с использованием translate .

102
ответ дан 24 November 2019 в 14:51
поделиться

Match () - это функция XPATH 2.0, которая позволяет использовать регулярные выражения без учета регистра соответствие.

Один из флагов - это i для сопоставления без учета регистра.

Следующий XPATH, использующий функцию match () с флагом без учета регистра:

//CD[matches(@title,'empire burlesque','i')]
52
ответ дан 24 November 2019 в 14:51
поделиться

Одно из возможных решений 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")];
9
ответ дан 24 November 2019 в 14:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: