Ich möchte die kanonische Antwort auf diese Frage schreiben, da die obige Antwort ein Problem hat.
Unser Problem
Der CSS- Selektor:
.foo
wählt jedes Element aus, das die Klasse foo hat .
Wie machst du das in XPath?
Obwohl XPath leistungsfähiger als CSS ist, verfügt XPath nicht über ein natives Äquivalent zu einem CSS-Klassenselektor . Es gibt jedoch eine Lösung.
Der richtige Weg, es zu tun
Der entsprechende Selektor in XPath lautet:
//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
Die Funktion " Raum normalisieren" entfernt führende und nachfolgende Leerzeichen (und ersetzt auch Sequenzen von Leerzeichen durch ein einzelnes Leerzeichen).
(Im allgemeineren Sinne) Dies ist auch das Äquivalent des CSS-Selektors:
*[class~="foo"]
Dies entspricht jedem Element, dessen Klassenattributwert eine Liste von durch Leerzeichen getrennten Werten ist, von denen einer genau gleich foo ist .
Ein paar offensichtliche, aber falsche Wege, dies zu tun
Der XPath-Selektor:
//*[@class="foo"]
funktioniert nicht! weil es beispielsweise nicht mit einem Element übereinstimmt, das mehr als eine Klasse hat
<div class="foo bar">
Es stimmt auch nicht überein, wenn der Klassenname ein zusätzliches Leerzeichen enthält:
<div class=" foo ">
Der 'verbesserte' XPath-Selektor
//*[contains(@class, "foo")]
funktioniert auch nicht! weil es zum Beispiel Elemente falsch mit der Klasse foobar vergleicht
<div class="foobar">
Dank geht an diesen Kerl, der die früheste veröffentlichte Lösung für dieses Problem war, die ich im Internet gefunden habe:
http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes- in-xpathxslt /