XPath - Alle folgenden Geschwister außer erste spezifische Elemente
Sagen wir, ich bin der Abfrage ein xhtml-Dokument, und ich möchte die Abfrage alle Geschwister folgenden eine Tabelle mit id='target'
. Auch, dass ich weder der erste <table>
Geschwister noch die ersten <ol>
Geschwister von diesem bestimmten element. Hier ist das beste, das ich kommen konnte mit:
//table[@id='target']/following-sibling::*[not(self::table[1]) and not(self::ol[1])]
Dies ist jedoch nicht der Rückkehr keine Ergebnisse, wenn es sollte. Natürlich bin ich nicht auf das Verständnis einiger der syntax für diese (ich konnte nicht finden eine gute Quelle der Informationen). Ich würde sicherlich zu schätzen wissen, wenn jemand mehr Erfahrung mit der XPath-syntax könnte geben Sie mir eine hand. Auch für rein Akademische Zwecke, ich wäre neugierig, was die oben eigentlich macht.
UPDATE:
Sehen LarsH-Antwort für die Erklärung, warum meine XPath nicht funktioniert, und sehen, Dimitre Antwort für die akzeptierte Lösung.
- Gute Frage, +1. Siehe meine Antwort für ein einzelnes XPath-Ausdruck, der wählt genau die wollten Knoten. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden:
Diese wählt alle folgenden Geschwister des Tisches, die nicht
table
und sind nichtol
und alle folgendentable
Geschwister mit position 2 oder höher und alle folgendenol
Geschwister mit position 2 oder größer.Das ist genau das, was Sie wollen: alle folgenden Geschwister mit Ausnahme des ersten
table
folgenden Geschwister und die erstenol
folgenden Geschwister.Das ist Reine XPath 1.0 und nicht mit jedem XSLT-Funktionen.
//
eher als/
ist erforderlich, bevortable
.Beantwortung der zweiten Frage zuerst: was die oben genannten tun, ist die Auswahl alle folgenden Geschwister, die weder
table
nochol
Elemente.Ist hier, warum:
self::table[1]
wählt den Kontextknoten selbst (iff übergibt er dastable
element name test) und Filter wählen Sie nur den ersten Knoten entlang des self:: - Achse. Gibt es höchstens einen Knoten auf dem self:: Achse der name des Elements test, also ist die[1]
redundant ist.self::table[1]
wählt den Kontextknoten, wenn es ist ein table-element, unabhängig von seiner position unter seinen Geschwistern. Sonot(self::table[1])
gibt false zurück, wenn der Kontext-node ist ein table-element, unabhängig von seiner position unter den Geschwistern.Ebenso für
self::ol[1]
.Wie zu tun, was Sie zu tun versuchen:
@John Kugelman, die Antwort ist fast richtig, verfehlt aber die Tatsache, dass wir ignorieren müssen Geschwister-Elemente vor und einschließlich
table[@id='target']
. Ich glaube nicht, dass es möglich ist, zu tun, richtig im reinen XPath 1.0. Haben Sie die Möglichkeit zum verwenden von XPath 2.0? Wenn Sie die Arbeit in einem browser, die Antwort ist in der Regel nicht.Einige workarounds wären:
//table[@id='target']
als nodeset zurück, um die host-Umgebung (also außerhalb von XPath, z.B. in JavaScript), loop-through, Knotenbereich; innerhalb der Schleife: wählen Siefollowing-sibling::*
via XPath, Durchlaufen , dass außerhalb von XPath, und testen Sie jede Folge (außerhalb des XPath), um zu sehen, ob es die erste Tisch-oder ol.//table[@id='target']
als nodeset zurück, um die host-Umgebung (also außerhalb von XPath, z.B. in JavaScript), loop-through, Knotenbereich; innerhalb der Schleife: wählen Siegenerate-id(following-sibling::table[1])
undgenerate-id(following-sibling::ol[1])
via XPath, erhalten die Werte in JS Variablen t1id und o1id, und erstellen Sie eine Zeichenfolge für den XPath-Ausdruck, welcher die form'following-sibling::*[generate-id() != ' + t1id + ' and generate-id() != ' + o1id + ']'
. Wählen Sie die Zeichenfolge, die in XPath und Sie haben Ihre Antwort! :-pUpdate: Eine Lösung ist möglich in XSLT 1.0 - siehe @Dimitre ist.
Gibt es nur noch zu einem Knoten, wenn Sie die
self::
Achse, so glaube ich, dassself::*[1]
wird immer wahr sein. Jeder Knoten ist der erste (und einzige) Knoten, auf seine eigeneself::
Achse. Dies bedeutet, dass Ihre geklammerte Ausdruck ist äquivalent zu[not(self::table) and not(self::ol)]
, bedeutet, dass für alle Tabellen und Listen gefiltert.Habe ich nicht eine test-Umgebung eingerichtet, aber aus der Spitze von meinem Kopf, könnte dies besser tun:
Es müssen einige Optimierungen, aber die Idee ist, heraus zu filtern
table
s, die nicht über Vorgänger-Geschwistertable
s, undol
s, die nicht über Vorgänger-Geschwisterol
s.[1]
. Auch, einer Tabelle oder ol-Elementen, bevor in die Ziel-Tabelle muss ignoriert werden, indem die Vorgänger-Geschwister-test.