Qual é a diferença entre “/ node ()” e “node ()” no XPath?

Aug 18 2020

De acordo com meu entendimento de XPath, para qualquer documento HTML ou XML:
$x("/node()")significa $x("/child::node()")que significa retornar o nó que é filho do nó de contexto. Aqui, o nó raiz (/)é o nó de contexto. Portanto, ele retorna o htmlelemento.

$x("node()")significa $x("child::node()")que também retorna o mesmo htmlelemento. Mas, neste caso, não fornecemos o nó de contexto, ao contrário do caso acima. Então, como ele identifica o nó de contexto neste caso?

Além disso, as expressões XPath acima são sintática e funcionalmente iguais.

Respostas

1 kjhughes Aug 18 2020 at 22:16

A diferença é que /node()especifica o nó de contexto absolutamente como a raiz do documento ( /), mas node()depende de um nó de contexto implícito relativo.

Como um nó de contexto implícito e relativo é determinado? Bem, com base no contexto. ;-) Por exemplo, a linguagem de hospedagem normalmente definirá o nó de contexto inicial para o nó atual que está sendo correspondido ou iterado. Então, dentro da avaliação do próprio XPath, cada etapa de localização (separada por barras /) estabelece o nó de contexto para as etapas subsequentes.

A $x(path, [startNode])notação usada no console do Chrome leva um segundo argumento opcional que pode ser usado para especificar o nó de contexto explicitamente. Por padrão, é igual ao nó raiz do documento, o que leva ao comportamento observado onde $x("node()")e $x("/node()")retornou os mesmos resultados para um determinado documento.

Além disso, as expressões XPath acima são sintática e funcionalmente iguais.

Claramente node()e child::node()são sintaticamente diferente, mas, sim, eles são semanticamente (ou funcionalmente , como você diz) o mesmo porque o child::eixo é o eixo padrão.

Veja também

  • Nó atual vs. Nó de contexto em XSLT / XPath?
  • Qual é a diferença entre nó raiz, elemento raiz e elemento de documento em XML?
  • Qual é a diferença entre .// e // * em XPath?