7 Stimmen

Kombinieren Sie XPATH-Prädikat mit Position

Ich habe eine Sammlung von div-Elementen, die die Klasse haben media-gallery-item .
Ich möchte das Element Nummer x auswählen.

Wenn ich nur alle Elemente auswähle, erhalte ich 5 Ergebnisse

$x("//div[@id='content-area']//div[@class='media-gallery-item']")

Jetzt möchte ich Artikel Nummer 2 auswählen können, aber ich weiß nicht, wie ich die beiden richtig kombinieren kann:

$x("//div[@id='content-area']//div[@class='media-gallery-item'][2]")

$x("//div[@id='content-area']//div[@class='media-gallery-item'
                                   and position() = 2]")

Ich weiß, dass dies nicht sehr sinnvoll ist, da es sich nicht um eine aktuelle AND sondern eher: "erst danach filtern, dann die 2. Übereinstimmung auswählen". Das Ziel ist es, weiterhin Dinge auszuwählen (z.B. im zweiten Element, hole mir die href Attribut des a Element)

11voto

Flack Punkte 5802

Schritt-für-Schritt-Antwort.

Zur Auswahl von Elementen mit einem div[@id='content-area'] Vorfahren, die die zweiten Kinder ihrer jeweiligen Eltern sind, verwenden:

//div[@id='content-area']//div[2]

So wählen Sie den zweiten (in der Reihenfolge der Dokumente) div Element mit einer div[@id='content-area'] Vorfahren verwenden:

(//div[@id='content-area']//div)[2]

Achten Sie auf den Unterschied.

Dann, um Elemente auszuwählen, die zweite Kinder ihrer jeweiligen Eltern sind, vorausgesetzt, sie haben eine Klasse "media-gallery-item" verwenden:

//div[@id='content-area']//div[2][@class='media-gallery-item']

Um Elemente auszuwählen, die das zweite von jenen Kindern (ihrer jeweiligen Eltern) sind, die eine Klasse haben media-gallery-item :

//div[@id='content-area']//div[@class='media-gallery-item'][2]

So wählen Sie den zweiten (in der Reihenfolge der Dokumente) div Element mit einer div[@id='content-area'] Vorfahre, vorausgesetzt, er hat media-gallery-item Klasse:

(//div[@id='content-area']//div)[2][@class='media-gallery-item']

So wählen Sie den zweiten (in der Reihenfolge der Dokumente) von allen div Element mit einer div[@id='content-area'] Vorfahre und ein media-gallery-item Klasse:

(//div[@id='content-area']//div)[@class='media-gallery-item'][2]

Zitate wie von @Alejandro vorgeschlagen:

Ein Prädikat filtert eine in Bezug auf eine Achse, um eine neue Knotenmenge zu erzeugen. Für jeden Knoten in der Knotenmenge, die gefiltert werden soll, wird das PrädikatExpr mit diesem Knoten als Kontextknoten ausgewertet, wobei die Anzahl der Knoten in der Knotenmenge als Kontextgröße, und mit der Nähe Position des Knotens in der Knotenmenge in Bezug auf die Achse als Kontext-Position

http://w3.org/TR/xpath/#predicates

Die Position in der Nähe einer Knotengruppe in Bezug auf eine Achse ist definiert als in der Knotenmenge, geordnet in Dokument geordnet, wenn die Achse eine Vorwärtsachse ist und in umgekehrter Reihenfolge der Dokumente geordnet wenn die Achse eine Rückwärtsachse ist

http://w3.org/TR/xpath/#dt-proximity-position

Unterm Strich funktioniert das Positionsprädikat in Bezug auf die Achse. Und man braucht Klammern, um die Priorität explizit zu deklarieren. Also nicht die child Achse, aber die Knotenmenge nach der Auflösung der descendant-or-self Achse wird bei der Berechnung der Position berücksichtigt.

0voto

Marc Seeger Punkte 2707

Es stellt sich heraus: Klammern!

(//div[@id='content-area']//div[@class='media-gallery-item'])[2] 

Werke

0voto

cuj74 Punkte 25

Es sieht so aus, als ob Sie auf Attribute auf die falsche Weise zugreifen. Versuchen Sie zu verwenden

/div[@id='content-area' and @class='media-gallery-item'][2]

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