Wann genau gilt die umgekehrte Richtung einer Achse?

Diejenigen, die mit XPath vertraut sind, wissen, dass einige Achsen, wie zpreceding::sind Rückwärtsachsen. Und wenn Sie einem Ausdruck, der mit einer umgekehrten Achse erstellt wurde, ein Positionsprädikat hinzufügen, zählen Sie möglicherweise rückwärts statt vorwärts. Z.B.

$foo/preceding-sibling::*[1]

Gibt das vorhergehende Geschwisterelement zurück$foo, nicht das erste vorangestellte Geschwisterelement (in Dokumentenreihenfolge).

Dann treten jedoch Variationen auf, bei denen diese Regel verletzt zu sein scheint, je nachdem, wie weit das Positionsprädikat von der umgekehrten Achse entfernt ist. Z.B.

($foo/preceding-sibling::*)[1]

zählt vom Anfang des Dokuments an vorwärts, nicht rückwärts von$foo.

Heute habe ich einen Code geschrieben, in dem ich einen Ausdruck wie hatte

$foo/preceding::bar[not(parent::baz)][1]

Ich wollte rückwärts zählen$foo. Aber war mein Stellungsprädikat zu weit von dem entfernt?preceding:: Achse? Hatte der Ausdruck seine umgekehrte Richtung verloren, bevor ich den hinzufügte?[1]? Ich dachte, es würde wahrscheinlich nicht funktionieren, also habe ich es auf geändert

$foo/preceding::bar[not(parent::baz)][last()]

Aber dann war ich mir der Richtung nicht ganz sicher. Deshalb habe ich die folgenden Angaben in Klammern gesetzt:

($foo/preceding::bar[not(parent::baz)])[last()]

Die zusätzlichen Klammern sind jedoch etwas verwirrend, und ich dachte, der Ausdruck ist möglicherweise weniger effizient, wenn er wirklich vom Anfang des (großen) Eingabedokuments an gezählt werden muss, anstatt von hinten$foo. War es wirklich nötig, das so zu machen?

Schließlich testete ich den ursprünglichen Ausdruck und stellte zu meiner Überraschung fest, dass es funktionierte! Also das Eingreifen[not(parent::baz)] hatte den Ausdruck doch nicht dazu gebracht, seine umgekehrte Richtung zu verlieren.

Dieses Problem wurde gelöst, aber ich bin an einem Punkt angelangt, an dem ich einen besseren Überblick haben möchte, wenn ich davon ausgehen kann, dass die umgekehrte Richtung einer Achse angewendet wird. Meine Frage ist:An welchen Punkten verliert ein XPath-Ausdruck, der eine umgekehrte Achse verwendet, seine umgekehrte Richtung?

Ich glaube, ich habe die Antwort jetzt gefunden, also beantworte ich meine eigene Frage. Aber ich konnte die Antwort auf SO nicht finden, und es hat mich lange genug gestört, dass es sich gelohnt hat, hier zu fragen und zu antworten.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage