После проигрывания вокруг с position()
напрасно я гуглил вокруг для решения и прибыл в этот более старый stackoverflow вопрос, который почти описывает мою проблему.
Различие - то, что набор узлов, в котором я хочу положение, является динамичным, а не непрерывный раздел документа.
Для иллюстрирования я изменю пример от связанного вопроса соответствовать моим требованиям. Обратите внимание что каждый элемент в другом
элемент. Это - критический бит.
zyx
wvu
tsr
qpo
Теперь, если я запросил, с помощью XPath для a/b
Я получил бы набор узлов четырех узлы. Я хочу затем найти положение в том наборе узлов узла, который содержит строку
'tsr'
. Решение в другом сообщении повреждается здесь: count(a/b[.='tsr']/preceding-sibling::*)+1
возвраты 1
потому что preceding-sibling
перемещается по документу, а не набору узлов контекста.
Действительно ли возможно работать в наборе узлов контекста?
Как насчет этого ..
count(a/b[.='tsr']/preceding-sibling::b) + count(a[b[.='tsr']]/preceding-sibling::a/b) + 1
Подсчитайте предыдущих братьев и сестер элемента b в текущем элементе a, а затем подсчитайте элементы b всех предыдущих братьев и сестер элемента a. Или что-то подобное.
Причина, по которой вы получаете 1, не связана с контекстом против документа. документа, а потому, что вы считаете только b
узлы внутри одного a
узла (поэтому вы всегда получите 0, потому что никогда нет никаких предшествующих 'b' узлов.
Скорее вам нужно найти количество предшествующих узлов 'a' перед узлом 'b', который содержит ваш 'a'.
Something like:
count(a[b[.='tsr']]/preceding-sibling::a)