case sensitive xpath contiene () ansible?

Sto scorrendo su tutti i textnodes del mio DOM e controllo se il nodeValue contiene una certa stringa.

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

Questo è case sensitive. Tuttavia, voglio anche prendere Test , TEST o TesT . È ansible con XPath (in JavaScript)?

Questo è per XPath 1.0. Se il tuo ambiente supporta XPath 2.0, vedi qui .


Sì. Possibile, ma non bello.

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

Se puoi, segna le porzioni di testo che ti interessano con altri mezzi, come racchiuderle in un che ha una certa class.

Se ciò non è ansible, puoi chiedere a JavaScript di aiutarti a creare un’espressione XPath appropriata:

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

( Suggerimento per la risposta di @ KirillPolishchuk – ovviamente devi solo tradurre quei personaggi che stai effettivamente cercando )

Più bello:

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

Soluzioni XPath 2.0

  1. Usa la lettera minuscola () :

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

  2. Usa corrispondenze match () che corrispondono con il suo flag senza distinzione tra maiuscole e minuscole:

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

Sì. Puoi usare translate per convertire il testo che vuoi abbinare in minuscolo come segue:

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

Se si utilizza XPath 2.0, è ansible specificare un confronto come terzo argomento da contenere (). Tuttavia, gli URI di confronto non sono standardizzati, quindi i dettagli dipendono dal prodotto che si sta utilizzando.

Nota che le soluzioni fornite in precedenza usando translate () presuppongono che tu stia usando solo l’alfabeto inglese di 26 lettere.

Il modo in cui l’ho sempre fatto è stato usando la funzione “translate” in XPath. Non dirò che è molto carina ma funziona correttamente.

 /html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')] 

spero che questo ti aiuti,