487 Stimmen

Wie kann ich ein Attribut abgleichen, das eine bestimmte Zeichenfolge enthält?

Ich habe ein Problem bei der Auswahl von Knoten nach Attributen, wenn die Attribute mehr als ein Wort enthalten. Zum Beispiel:

<div class="atag btag" />

Dies ist mein xpath-Ausdruck:

//*[@class='atag']

Der Ausdruck funktioniert mit

<div class="atag" />

aber nicht für das vorherige Beispiel. Wie kann ich die <div> ?

554voto

surupa123 Punkte 5519

Hier ist ein Beispiel, das div-Elemente findet, deren className Folgendes enthält atag :

//div[contains(@class, 'atag')]

Hier ist ein Beispiel, das div-Elemente findet, deren className den Wert atag y btag :

//div[contains(@class, 'atag') and contains(@class ,'btag')]

Es werden jedoch auch Teilübereinstimmungen gefunden wie class="catag bobtag" .

Wenn Sie keine Teilübereinstimmungen wünschen, lesen Sie die Antwort von bobince weiter unten.

323voto

bobince Punkte 512550

Die Antwort von mjv ist ein guter Anfang, wird aber fehlschlagen, wenn atag nicht der erste aufgelistete Klassenname ist.

Der übliche Ansatz ist der eher unhandliche:

//*[contains(concat(' ', @class, ' '), ' atag ')]

dies funktioniert, solange die Klassen nur durch Leerzeichen getrennt sind und nicht durch andere Formen von Leerzeichen. Dies ist fast immer der Fall. Wenn dies nicht der Fall ist, müssen Sie es noch unhandlicher machen:

//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]

(Die Auswahl nach klassennamenähnlichen, durch Leerzeichen getrennten Zeichenketten ist ein so häufiger Fall, dass es überrascht, dass es dafür keine spezielle XPath-Funktion gibt, wie z. B. die CSS3-Funktion '[class~="atag"]').

41voto

mjv Punkte 70143

EDIT : siehe die Lösung von bobince, die Folgendes verwendet enthält statt start-mit zusammen mit einem Trick, der sicherstellt, dass der Vergleich auf der Ebene eines vollständigen Tokens durchgeführt wird (damit das "atag"-Muster nicht als Teil eines anderen "Tags" gefunden wird).

"atag btag" ist ein merkwürdiger Wert für das Attribut class, aber versuchen Sie es trotzdem:

//*[starts-with(@class,"atag")]

41voto

SelenUser Punkte 618

Versuchen Sie dies: //*[contains(@class, 'atag')]

31voto

Daniel Haley Punkte 48844

Ein XPath 2.0, der funktioniert:

//*[tokenize(@class,'\s+')='atag']

oder mit einer Variablen:

//*[tokenize(@class,'\s+')=$classname]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X