no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación

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

Cómo hacer coincidir los 4 primeros registros con xpath como //CD[@title='empire burlesque']. Es allí función xpath para hacer esto? Otras soluciones como la función de PHP también son aceptados.

InformationsquelleAutor Ethan | 2010-05-23

5 Kommentare

  1. 103

    XPath 2 tiene un menor caso (y en mayúsculas) de la cadena de la función. Que no es lo mismo, ya no distingue mayúsculas de minúsculas, pero espero que sea lo suficientemente cerca:

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

    Si usted está usando XPath 1, hay una hack uso de traducir.

    • Incluso funciona en SQL Server consultas XPath en las columnas XML. Excelente.
  2. 52

    los partidos (el) es una expresión XPATH 2.0 función que permite insensible a mayúsculas-regex coincidencia.

    Uno de los banderas es i para no distingue mayúsculas de minúsculas a juego.

    La siguiente XPATH utilizando el los partidos (el) función con las mayúsculas y minúsculas de la bandera:

    //CD[matches(@title,'empire burlesque','i')]
    • Esto es basado en expresiones regulares, que es una diferencia importante para los basados en texto coincidente.
  3. 9

    Una posible PHP solución:

    //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")];
    • Para el anónimo de abajo-votante: Leer el OP pregunta. Especialmente el «Otras soluciones como la función de PHP también son aceptados.» parte.
  4. 9

    Esto no funciona en Chrome Developer tools para localizar un elemento, estoy buscando 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 de pequeños trabajos de la siguiente

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

    Actualización: acabo de encontrar la razón por la que ‘partidos’ no funciona. Yo estoy usando el Chrome con xpath 1.0, que no entienden la sintaxis ‘partidos’. Debe ser xpath 2.0

  5. 3

    Mencionó que PHP soluciones eran aceptables, y PHP, no ofrecen una manera de lograr esto, aunque sólo es compatible con XPath v1.0. Puede ampliar la compatibilidad de XPath para permitir la función PHP que se llama.

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

    Ver el PHP registerPhpFunctions documentación para obtener más ejemplos. Básicamente demuestra que «php:function» es booleana de evaluación y de «php:functionString» es para la evaluación de la cadena.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea