¿Es posible que XPath no distinga entre mayúsculas y minúsculas ()?

Resuelto Aron Woost asked hace 12 años • 6 respuestas

Estoy repasando todos los nodos de texto de mi DOM y verifico si nodeValue contiene una determinada cadena.

/html/body//text()[contains(.,'test')]

Esto distingue entre mayúsculas y minúsculas. Sin embargo, también quiero capturar Test, TESTo TesT. ¿Es eso posible con XPath (en JavaScript)?

Aron Woost avatar Dec 12 '11 19:12 Aron Woost
Aceptado

Esto es para XPath 1.0. Si su entorno admite XPath 2.0, consulte aquí .


Sí. Posible, pero no hermoso.

/html/body//text()[
  contains(
    translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
    'test'
  )
]

Esto funcionaría para cadenas de búsqueda donde el alfabeto se conoce de antemano. Agrega los caracteres acentuados que esperas ver.


Si puede, marque el texto que le interesa con algún otro medio, como encerrarlo en un texto <span>que tenga una determinada clase mientras construye el HTML. Estas cosas son mucho más fáciles de localizar con XPath que las subcadenas en el texto del elemento.

Si esa no es una opción, puedes dejar que JavaScript (o cualquier otro lenguaje host que estés usando para ejecutar XPath) te ayude a crear una expresión XPath dinámica:

function xpathPrepare(xpath, searchString) {
  return xpath.replace("$u", searchString.toUpperCase())
              .replace("$l", searchString.toLowerCase())
              .replace("$s", searchString.toLowerCase());
}

xp = xpathPrepare("//text()[contains(translate(., '$u', '$l'), '$s')]", "Test");
// -> "//text()[contains(translate(., 'TEST', 'test'), 'test')]"

(Un consejo para la respuesta de @KirillPolishchuk ; por supuesto, solo necesitas traducir los caracteres que realmente estás buscando ).

Este enfoque funcionaría para cualquier cadena de búsqueda, sin requerir conocimientos previos del alfabeto, lo cual es una gran ventaja.

Ambos métodos anteriores fallan cuando las cadenas de búsqueda pueden contener comillas simples, en cuyo caso las cosas se vuelven más complicadas .

Tomalak avatar Dec 12 '2011 12:12 Tomalak

Soluciones modernas XPath 2.0 (y superiores)

  1. Utilice minúsculas() :

    /html/body//text()[contains(lower-case(.),'test')]

  2. Utilice coincidencias de expresiones regulares () con su indicador que no distingue entre mayúsculas y minúsculas:

    /html/body//text()[matches(.,'test', 'i')]

Para entornos antiguos limitados por XPath-1.0, consulte la translate()técnica descrita en la respuesta de @Tomalak .

kjhughes avatar Apr 30 '2014 13:04 kjhughes

No distingue entre mayúsculas y minúsculascontains

/html/body//text()[contains(translate(., 'EST', 'est'), 'test')]
Kirill Polishchuk avatar Dec 12 '2011 12:12 Kirill Polishchuk