98 votes

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.

133voto

Matthew Flaschen Points 131723

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 hack à traduire .

68voto

Mads Hansen Points 24537

matches() est un XPATH 2.0 fonction qui permet à la casse regex de correspondance.

L'un des drapeaux est - i comparaison insensible à la casse.

Le XPATH suivante en utilisant les matches() , fonction de la casse drapeau:

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

10voto

Tomalak Points 150423

Une solution PHP possible:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X