В чем разница между «/ node ()» и «node ()» в XPath?

Aug 18 2020

В соответствии с моим пониманием XPath для любого документа HTML или XML:
$x("/node()")означает, $x("/child::node()")что означает возврат узла, который является дочерним по отношению к контекстному узлу. Здесь корневой узел (/)- это контекстный узел. Следовательно, он возвращает htmlэлемент.

$x("node()")означает, $x("child::node()")что также возвращает тот же htmlэлемент. Но в этом случае мы не предоставили контекстный узел, как в предыдущем случае. Итак, как в этом случае он определяет контекстный узел?

Кроме того, синтаксически и функционально оба вышеуказанных выражения XPath одинаковы.

Ответы

1 kjhughes Aug 18 2020 at 22:16

Разница в том, что /node()контекстный узел определяется абсолютно как корневой ( /) документа, но node()полагается на подразумеваемый относительный контекстный узел.

Как определяется подразумеваемый относительный узел контекста? Ну, исходя из контекста. ;-) Например, язык хостинга обычно устанавливает начальный узел контекста на текущий узел, который сопоставляется или повторяется. Затем, в рамках оценки самого XPath, каждый шаг определения местоположения (разделенный косой чертой /) устанавливает контекстный узел для последующих шагов.

$x(path, [startNode])Обозначения , используемые в Chrome консоли принимает необязательный второй аргумент , который может быть использован для указания узла контекста явно. По умолчанию он равен корневому узлу документа, что приводит к наблюдаемому поведению, когда $x("node()")и $x("/node()")возвращают те же результаты для данного документа.

Кроме того, синтаксически и функционально оба вышеуказанных выражения XPath одинаковы.

Ясно , что node()и child::node()являются синтаксически различными, но, да, они семантически (или функционально , как вы говорите) то же самое , потому что child::ось ось по умолчанию.

Смотрите также

  • Текущий узел против узла контекста в XSLT / XPath?
  • В чем разница между корневым узлом, корневым элементом и элементом документа в XML?
  • В чем разница между .// и // * в XPath?