сопоставление без учета регистра в 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 функции также принимаются.

5 58

5 ответов:

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

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

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

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

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

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

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

это не работает в инструменты разработчика Chrome, чтобы найти элемент, я ищу, чтобы найти кнопку "Отправить" на экране

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

однако, используя 'translate', чтобы заменить все колпачки на небольшие работы, как показано ниже

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

обновление: я только что нашел причину, почему "матчей" не работает. Я использую Chrome с xpath 1.0, который не будет понимать синтаксис "соответствует". Это должен быть xpath 2.0

Вы упомянули, что решения 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 " - для оценки строки.