XPath n//.. vs n//*/..
От: Jack128  
Дата: 22.08.23 10:01
Оценка:
Итак есть xml

<Root>
  <N1>
    <N2 />
  </N1>
</Root>



Если применить к нему XPath //N1//*/.. то результат — узел N1, что выглядит логичным. Мы выбрали всех наследников N1 (это узел N2) и взяли его родителя (родитель N2 — это N1)
А вот если сделать запрос //N1//.. то в результате у нас два узла. N1 и Root!! Откуда Root? Вроде как запросы должны быть идентичны??
Re: XPath n//.. vs n//*/..
От: vmpire Россия  
Дата: 22.08.23 10:20
Оценка: +1
Здравствуйте, 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, всё логично.
Re[2]: XPath n//.. vs n//*/..
От: Jack128  
Дата: 22.08.23 10:24
Оценка:
Здравствуйте, 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
Re[3]: XPath n//.. vs n//*/..
От: vmpire Россия  
Дата: 22.08.23 12:21
Оценка: 12 (1)
Здравствуйте, 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()/, то есть, все потомки узла или сам узел.
Re[4]: XPath n//.. vs n//*/..
От: Jack128  
Дата: 22.08.23 13:10
Оценка:
Здравствуйте, 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()/, то есть, все потомки узла или сам узел.



Да, теперь сложилось, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.