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 .
translate()
em si não importa quantas vezes você repete cada personagem -translate(., 'EE', 'ee')
é absolutamente equivalente atranslate(., 'E', 'e')
. PS: Não se esqueça de votar a favor de @KirillPolishchuk, a ideia foi dele.Mais bonito:
fonte
TEST
paratest
e licençaTest
como é?translate(., 'TES', 'tes')
. Assim as pessoas perceberão que não é uma tradução de palavras, mas sim de letras.Soluções XPath 2.0
Use letras minúsculas () :
/html/body//text()[contains(lower-case(.),'test')]
Use match () regex correspondente com seu sinalizador que não diferencia maiúsculas de minúsculas:
/html/body//text()[matches(.,'test', 'i')]
fonte
Sim. Você pode usar
translate
para converter o texto que deseja corresponder em minúsculas da seguinte maneira:fonte
Se você estiver usando XPath 2.0, poderá especificar um agrupamento como o terceiro argumento para contains (). No entanto, os URIs de agrupamento não são padronizados, portanto, os detalhes dependem do produto que você está usando.
Observe que todas as soluções fornecidas anteriormente usando translate () assumem que você está usando apenas o alfabeto inglês de 26 letras.
ATUALIZAÇÃO: XPath 3.1 define um URI de agrupamento padrão para correspondência caseira.
fonte
A maneira como sempre fiz isso foi usando a função "traduzir" no XPath. Não vou dizer que é muito bonito, mas funciona corretamente.
espero que isto ajude,
fonte