Простой XPath вопрос о корневом узле - PullRequest
2 голосов
/ 06 апреля 2011

Я только начал изучать XPath и сначала изучаю язык без аббревиатуры.

Когда путь местоположения начинается с символа '/', начальный контекстный узел принудительно становится корневым узлом ...

Образец XML из книги:

<widget type="gadget">
    ...
</widget>

Если я должен написать XPath, чтобы получить атрибут типа, почему я должен написать:

/ ребенка :: штучка / атрибут :: типа

и не так / атрибут :: тип

Я что-то не так понял относительно корневого узла или? Потому что я думал, что '/' и виджет были одинаковыми ...

Спасибо

Ответы [ 2 ]

5 голосов
/ 06 апреля 2011

С http://www.w3.org/TR/xpath/#attribute-nodes

Каждый узел элемента имеет связанный набор узлов атрибута;элемент является родителем каждого из этих узлов атрибута;однако узел атрибута не является дочерним по отношению к его родительскому элементу.

Только узлы элемента имеют атрибуты.

Корневой узел не является элементом.С http://www.w3.org/TR/xpath/#root-node

Корневой узел является корнем дерева.Корневой узел не встречается, кроме как корень дерева.Узел элемента для элемента документа является дочерним по отношению к корневому узлу.Корневой узел также имеет дочерние узлы инструкций и комментариев для обработки инструкций и комментариев, которые встречаются в прологе и после конца элемента документа.

Таким образом, вы не можете выбирать атрибуты корневого узла, такие какв /@* или /attribute::*

Вы спрашиваете:

Я что-то не так понял относительно корневого узла или?

Да.Не следует путать корневой узел (абстракцию) с элементом документа (иногда его также называют корневым элементом)

2 голосов
/ 06 апреля 2011

Если я должен написать XPath так Я получаю атрибут типа, почему у меня написать:

/child::widget/attribute::type

и не так

/attribute::type

Выражение XPath :

/attribute::type

означает

Выберите атрибут type корневого узла документа XML .

Однако корневой узел не имеет атрибутов (согласно W3C Spec ), поэтому приведенное выше выражение XPath ничего не выбирает.

Вы хотите :

/widget/@type

Это означает :

Выберите атрибут type верхнего элемента (с именем widget) документа XML .

Я что-то не так понял? корневой узел или? Потому что я думал '/' и виджет был одинаковым ...

Всегда помните, что корневой узел / не является элементом. согласно W3C XPath Spec .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...