Voglio scrivere la risposta canonica a questa domanda perché la risposta sopra ha un problema.
Il nostro problema
Il selettore CSS :
.foo
selezionerà qualsiasi elemento che abbia la classe foo .
Come si esegue questa operazione in XPath?
Sebbene XPath sia più potente del CSS, XPath non ha un equivalente nativo di un selettore di classi CSS . Comunque, c'è una soluzione.
Il modo giusto per farlo
Il selettore equivalente in XPath è:
//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
La funzione normalize-space elimina gli spazi bianchi iniziali e finali (e sostituisce anche le sequenze di caratteri di spazi bianchi con un singolo spazio).
(In un senso più generale) questo è anche l'equivalente del selettore CSS:
*[class~="foo"]
che corrisponderà a qualsiasi elemento il cui valore dell'attributo di classe è un elenco di valori separati da spazi, uno dei quali è esattamente uguale a foo .
Un paio di modi ovvi, ma sbagliati per farlo
Il selettore XPath:
//*[@class="foo"]
non funziona! perché non corrisponderà a un elemento che ha più di una classe, ad esempio
<div class="foo bar">
Inoltre, non corrisponderà se sono presenti spazi bianchi aggiuntivi attorno al nome della classe:
<div class=" foo ">
Il selettore XPath "migliorato"
//*[contains(@class, "foo")]
non funziona neanche! perché abbina erroneamente elementi con la classe foobar , ad esempio
<div class="foobar">
Il merito va a questo tizio, che è stata la prima soluzione pubblicata a questo problema che ho trovato sul web:
http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes- in-xpathxslt /