web-dev-qa-db-fra.com

correspondance insensible à la casse dans xpath?

Par exemple, pour le xml ci-dessous

<CATALOG>
    <CD title="Empire Burlesque"/>
    <CD title="empire burlesque"/>
    <CD title="EMPIRE BURLESQUE"/>
    <CD title="EmPiRe BuRLeSQuE"/>
    <CD title="Others"/>
<CATALOG>

Comment faire correspondre les 4 premiers enregistrements avec xpath comme //CD[@title='empire burlesque']. Y at-il une fonction xpath pour faire cela? D'autres solutions comme la fonction PHP sont également acceptées.

66
Ethan

XPath 2 a une fonction de chaîne minuscule (et majuscule). Ce n'est pas tout à fait la même chose que la casse, mais j'espère que ce sera assez proche:

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

Si vous utilisez XPath 1, il y a un bidouille utilisant translate .

101
Matthew Flaschen

matches () est une fonction XPATH 2.0 permettant une correspondance rationnelle sans distinction de casse.

L'un des flags est i pour la correspondance sans distinction de casse.

Le XPATH suivant utilisant la fonction matches () avec l'indicateur ne respectant pas la casse:

//CD[matches(@title,'empire burlesque','i')]
51
Mads Hansen

Une solution possible 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
Tomalak

Cela ne fonctionne pas dans Chrome Outils de développement permettant de localiser un élément. Je cherche à localiser le bouton "Soumettre" à l'écran.

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

Cependant, utiliser 'translate' pour remplacer toutes les majuscules par de petites œuvres comme ci-dessous

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

Mise à jour: je viens de trouver la raison pour laquelle "les correspondances" ne fonctionnent pas. J'utilise Chrome avec xpath 1.0 qui ne comprendra pas la syntaxe "correspond" à. Il devrait s'agir de xpath 2.0

8
Bhuvanesh Mani

Vous avez mentionné que PHP les solutions étaient acceptables et PHP offre un moyen d'accomplir cela même s'il ne prend en charge que XPath v1.0. Vous pouvez étendre le XPath support pour permettre à PHP appels de fonction.

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

Voir la documentation PHP registerPhpFunctions pour plus d'exemples. Cela démontre fondamentalement que "php: function" est destiné à l'évaluation booléenne et "php: functionString" à l'évaluation de chaîne.

2
jimp