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