Здравствуйте, Jack128, Вы писали:
J>>>J>>><Root>
J>>> <N1>
J>>> <N2 />
J>>> </N1>
J>>></Root>
J>>>
J>>>Если применить к нему XPath //N1//*/.. то результат — узел N1, что выглядит логичным. Мы выбрали всех наследников N1 (это узел N2) и взяли его родителя (родитель N2 — это N1)
J>>>А вот если сделать запрос //N1//.. то в результате у нас два узла. N1 и Root!! Откуда Root? Вроде как запросы должны быть идентичны??
V>>В первом случае выбирается парент для *, во втором — парент для N1, всё логично.
J>почему парент для N1 ? написано ж N1//.. два слеша означают, что выбераем наследников N1
Распишите xpath полностью без сокращений, всё станет понятно:
//N1//..
это то же самое, что
/descendant-or-self::node()/N1/descendant-or-self::node()/parent::node()
// по спецификации — это сокращённая запись /descendant-or-self::node()/, то есть, все потомки узла или сам узел.
Здравствуйте, Jack128, Вы писали:
J>J><Root>
J> <N1>
J> <N2 />
J> </N1>
J></Root>
J>
J>Если применить к нему XPath //N1//*/.. то результат — узел N1, что выглядит логичным. Мы выбрали всех наследников N1 (это узел N2) и взяли его родителя (родитель N2 — это N1)
J>А вот если сделать запрос //N1//.. то в результате у нас два узла. N1 и Root!! Откуда Root? Вроде как запросы должны быть идентичны??
В первом случае выбирается парент для *, во втором — парент для N1, всё логично.
Итак есть xml
<Root>
<N1>
<N2 />
</N1>
</Root>
Если применить к нему XPath //N1//*/.. то результат — узел N1, что выглядит логичным. Мы выбрали всех наследников N1 (это узел N2) и взяли его родителя (родитель N2 — это N1)
А вот если сделать запрос //N1//.. то в результате у нас два узла. N1 и Root!! Откуда Root? Вроде как запросы должны быть идентичны??
Здравствуйте, vmpire, Вы писали:
V>Здравствуйте, Jack128, Вы писали:
J>>J>><Root>
J>> <N1>
J>> <N2 />
J>> </N1>
J>></Root>
J>>
J>>Если применить к нему XPath //N1//*/.. то результат — узел N1, что выглядит логичным. Мы выбрали всех наследников N1 (это узел N2) и взяли его родителя (родитель N2 — это N1)
J>>А вот если сделать запрос //N1//.. то в результате у нас два узла. N1 и Root!! Откуда Root? Вроде как запросы должны быть идентичны??
V>В первом случае выбирается парент для *, во втором — парент для N1, всё логично.
почему парент для N1 ? написано ж N1
//.. два слеша означают, что выбераем наследников N1
Здравствуйте, vmpire, Вы писали:
V>Распишите xpath полностью без сокращений, всё станет понятно:
V>V>//N1//..
V>
V>это то же самое, что
V>V>/descendant-or-self::node()/N1/descendant-or-self::node()/parent::node()
V>
V>// по спецификации — это сокращённая запись /descendant-or-self::node()/, то есть, все потомки узла или сам узел.
Да, теперь сложилось, спасибо.