Глядя на DTD:контекст XPath узлов во время оси навигации
<!ELEMENT root (a|b)+>
<!ELEMENT a (a|b)*>
<!ELEMENT b (a|b)*>
И следующий простой XML: (I помеченных элементы для удобства)
<root>
<b1>
<b2></b2>
<a1></a1>
</b1>
<b3></b3>
</root>
Когда я выполняю следующие запросы:
a) /descendant-or-self::node()/b[1]
b) /descendant-or-self::b[1]
Как в пунктах a), так и b), перед применением [1] я получаю все b в дереве XML.
Но когда я прошу о первом b, в a) я получаю {b1, b2}, а в b) получаю только {b1}.
Мой вопрос в том, какова логика контекстных узлов в этом сценарии? Другими словами, почему разница между «/ descendant-or-self :: node()/b» (которую я знаю эквивалентно «//») и «/ descendant-or-self/b»?
В общем,/descendant-or-self :: b вернет все b, где узлом контекста является «я», в котором я перехожу к «потомок-само-я» из? Если да, то «/ descendant-or-self :: b [2]« Я получу второй ближайший тег для root в xml-файле, b2 в моем примере? – sel