2012-06-20 3 views
11

Ich versuche, alle dom-Elemente auszuwählen, die id="mydiv" haben, aber diejenigen auszuschließen, die auch die class="exclass" haben. Im Moment mache ich den ersten Teil //*[@id="mydiv"]. Wie füge ich den Klassenausschluss hinzu?Xpath zum Ausschließen von Elementen mit einer Klasse

P.S. Falls Sie sich fragen, warum ich mehrere Elemente mit derselben ID auswählen muss, arbeite ich nur an einem vorhandenen DOM, das ich nicht kontrollieren kann.

+0

Sie haben mehrere Elemente mit der gleichen ID? Das ist nicht gesund, weißt du? http://stackoverflow.com/questions/2487074/what-are-the-side-effects-of-using-multiple-instances-of-a-single-id-name-in-htm – jolt

Antwort

17

können Sie Negation verwenden:

//*[@id="mydiv and @class!="exclass"] 

Wenn das class Attribut kann nicht auf allen Knoten vorhanden sind, müssen Sie dies:

//*[@id="mydiv" and (not(@class) or @class!="exclass")] 

Die letzte (etwas) ungerade Logik verwandelte sich in was werden kann Michael vorgeschlagen:

//*[@id="mydiv" and not(@class="exclass")] 

Obwohl, persönlich, die Tatsache, dass XPath nicht vergleichbar machen kann ons, wenn das Attribut fehlt, fühlt sich ein bisschen wie ein Manko an.

+0

Dies ist nicht ganz was der Benutzer gefragt. Downvoting. Siehe meine Antwort. –

+0

@MichaelKay Danke, dass du darauf hingewiesen hast, ich habe meine Antwort aktualisiert; Wie ich in meinem Update erwähnt habe, habe ich das Gefühl, dass ein "Nichts ist mit nichts zu vergleichen" etwas von einem Mangel von XPath ist; Ich kann mir einfach keinen Grund vorstellen, warum dieses Verhalten nützlich wäre:/ –

5

Die Antwort auf die Frage, wie geschrieben ist

//*[@id="mydiv" and not(@class="exclass")] 

Die erste Hälfte der Bedingung wahr ist, wenn es ein @id Attribut ist und sein Wert ist mydiv. Die zweite Hälfte ist wahr, wenn es kein @class-Attribut mit dem Wert exclass gibt: Das heißt, wenn es kein Klassenattribut gibt oder wenn ein Klassenattribut existiert und sein Wert etwas anderes als "exclass" ist.

Vermeiden Sie die Verwendung! = In dieser Situation: 90% der Zeit, wenn Sie an das Schreiben A=B denken, wollten Sie wahrscheinlich not(A=B). Die Bedeutung unterscheidet sich in dem Fall, in dem entweder A oder B kein Singleton ist, dh wenn es entweder leer ist oder mehrere Werte enthalten kann.

+0

TriXPath (wie in Tricks) Regeln! – jolt

Verwandte Themen