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