¿Exactamente cuándo se aplica la dirección inversa de un eje?

Aquellos que están familiarizados con XPath saben que algunos ejes, comopreceding::, son ejes inversos. Y si coloca un predicado posicional en una expresión construida con un eje inverso, puede contar hacia atrás en lugar de hacia adelante. P.ej.

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

devuelve el elemento hermano anterior justo antes$foo, no el primer elemento hermano anterior (en el orden del documento).

Pero luego encuentras variaciones donde esta regla parece estar rota, dependiendo de cuán lejos esté el predicado posicional del eje inverso. P.ej.

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

Cuenta hacia adelante desde el principio del documento, no hacia atrás desde$foo.

Hoy estaba escribiendo un código donde tenía una expresión como

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

Quería contar hacia atrás desde$foo. Pero fue mi predicado posicional demasiado alejado de lapreceding:: ¿eje? ¿Había perdido la expresión su dirección inversa antes de agregar el[1]? Pensé que probablemente no funcionaría, así que lo cambié a

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

pero entonces no estaba realmente seguro de la dirección, así que puse entre paréntesis para asegurarme:

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

Sin embargo, los paréntesis adicionales son un poco confusos, y pensé que la expresión podría ser menos eficiente, si realmente tiene que contar desde el principio del documento de entrada (grande) en lugar de hacia atrás desde$foo. ¿Era realmente necesario hacerlo de esta manera?

Finalmente, probé la expresión original y, para mi sorpresa, ¡funcionó! Así que el que interviene[not(parent::baz)] después de todo, no había hecho que la expresión perdiera su dirección inversa.

El problema se resolvió, pero he llegado al punto en el que me gustaría tener una mejor idea de cuándo puedo esperar que se aplique la dirección inversa de un eje. Mi pregunta es:¿En qué punto (s) una expresión XPath que usa un eje inverso pierde su dirección inversa?

Creo que he encontrado la respuesta ahora, así que responderé mi propia pregunta. Pero no pude encontrar la respuesta en SO, y es algo que me ha molestado lo suficiente como para que valiera la pena preguntar y responder aquí.

Respuestas a la pregunta(1)

Su respuesta a la pregunta