Подтвердить что ты не робот

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

4b9b3361

Ответ 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