2016-07-20 3 views
2

Глядя на 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»?

ответ

1

/descendant-or-self::node()/b[1] выбирает все b элементов, которые являются первым ([1]) b ребенком их родительского элемента, как /descendant-or-self::node()/b[1] короток для /descendant-or-self::node()/child::b[1]. /descendant-or-self::b выбирает все b элементов в документе и с /descendant-or-self::b[1] вы выбираете первый из них.

+0

В общем,/descendant-or-self :: b вернет все b, где узлом контекста является «я», в котором я перехожу к «потомок-само-я» из? Если да, то «/ descendant-or-self :: b [2]« Я получу второй ближайший тег для root в xml-файле, b2 в моем примере? – sel

Смежные вопросы