Isso é para XPath 1.0. Se o seu ambiente for compatível com XPath 2.0, veja aqui .
Sim. Possível, mas não bonito.
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
Isso funcionaria para cadeias de caracteres de pesquisa onde o alfabeto é conhecido de antemão. Adicione quaisquer caracteres acentuados que você espera ver.
Se puder, marque o texto que lhe interessa com algum outro meio, como encerrá-lo em um <span>
que tenha uma determinada classe durante a construção do HTML. Essas coisas são muito mais fáceis de localizar com XPath do que substrings no texto do elemento.
Se isso não for uma opção, você pode deixar JavaScript (ou qualquer outra linguagem de host que você está usando para executar XPath) ajudá-lo a construir uma expressão 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')]"
(Dica de chapéu para a resposta de @KirillPolishchuk - é claro que você só precisa traduzir os caracteres que está realmente procurando .)
Essa abordagem funcionaria para qualquer string de pesquisa, sem exigir conhecimento prévio do alfabeto, o que é uma grande vantagem.
Ambos os métodos acima falham quando as strings de pesquisa podem conter aspas simples, caso em que as coisas ficam mais complicadas .