2010-05-23 9 views
55

Por ejemplo, para el XML siguienteCoincidencia insensible a mayúsculas y minúsculas en xpath?

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

¿Cómo adaptar los 4 primeros registros con XPath como //CD[@title='empire burlesque']. ¿Hay una función xpath para hacer esto? Otras soluciones como la función PHP también son aceptadas.

+1

http://stackoverflow.com/questions/586231/how-can-i-convert-a-string-to-upper-or-lower-case-with-xslt out La publicación de ben gripka para xpath 1.0 – user2237201

Respuesta

88

XPath 2 tiene una función de cadena en minúsculas (y mayúsculas). Eso no es exactamente lo mismo que entre mayúsculas y minúsculas, pero espero que sea lo suficientemente cerca:

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

Si está utilizando XPath 1, hay una hack using translate.

+0

La implementación de xpath 1 de vtd-xml contiene mayúsculas y minúsculas –

+0

Incluso funciona en consultas XPath de SQL Server en columnas XML. Excelente. –

+0

Sí, pero https://stackoverflow.com/a/2893899/972128 FTW. – kkurian

8

Una posible solución 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")]; 
+8

Para el votante anónimo: Lea la pregunta del OP. Especialmente el * "Otras soluciones como la función PHP también son aceptadas." * Parte. – Tomalak

42

matches() es una función XPath 2.0 que permite para el caso-insensible a juego de expresiones regulares.

Uno de los flags es i para distinguir entre mayúsculas y minúsculas.

La siguiente XPath usando la función matches() con la bandera de mayúsculas y minúsculas:

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

Esto está basado en expresiones regulares, lo cual es una diferencia importante para la coincidencia basada en texto. – usr

2

Usted ha mencionado que las soluciones de PHP eran aceptables, y PHP es que ofrece una manera de lograr esto a pesar de que sólo es compatible con XPath v1. 0. Puede ampliar el soporte de XPath para permitir llamadas a funciones de 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"]'); 

Consulte la documentación de PHP registerPhpFunctions para obtener más ejemplos. Básicamente demuestra que "php: función" es para evaluación booleana y "php: functionString" es para evaluación de cadenas.

1

Esto no funciona en Chrome Herramientas para desarrolladores para localizar un elemento, busco para localizar el botón 'enviar' en la pantalla

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

Sin embargo, el uso de 'traducir' para reemplazar todas las tapas a las pequeñas obras como a continuación

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

Actualización: Acabo de encontrar el motivo por el que 'coincidencias' no funciona. Estoy usando Chrome con xpath 1.0 que no entenderá la sintaxis 'coincidencias'. Debe ser XPath 2.0 cheque

Cuestiones relacionadas