Chcę napisać kanoniczną odpowiedź na to pytanie, ponieważ powyższa odpowiedź ma problem.
Nasz problem
CSS selektor:
.foo
wybierze dowolny element, który ma klasę foo .
Jak to robisz w XPath?
Chociaż XPath jest potężniejszy niż CSS, XPath nie ma natywnego odpowiednika selektora klas CSS . Jest jednak rozwiązanie.
Właściwy sposób, aby to zrobić
Odpowiedni selektor w XPath to:
//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
Funkcja normalize-space usuwa początkowe i końcowe białe znaki (a także zastępuje sekwencje białych znaków pojedynczą spacją).
(W bardziej ogólnym sensie) jest to również odpowiednik selektora CSS:
*[class~="foo"]
który będzie pasował do każdego elementu, którego wartością atrybutu klasy jest lista wartości oddzielonych białymi znakami, z których jedna jest dokładnie równa foo .
Kilka oczywistych, ale złych sposobów na zrobienie tego
Selektor XPath:
//*[@class="foo"]
nie działa! ponieważ na przykład nie będzie pasował do elementu, który ma więcej niż jedną klasę
<div class="foo bar">
Nie będzie również pasować, jeśli wokół nazwy klasy znajduje się dodatkowa spacja:
<div class=" foo ">
„Ulepszony” selektor XPath
//*[contains(@class, "foo")]
też nie działa! ponieważ na przykład błędnie dopasowuje elementy z klasą foobar
<div class="foobar">
Podziękowania dla tego gościa, który był najwcześniej opublikowanym rozwiązaniem tego problemu, jakie znalazłem w sieci:
http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes- in-xpathxslt /