Qual é a diferença entre “/ node ()” e “node ()” no XPath?
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 html
elemento.
$x("node()")
significa $x("child::node()")
que também retorna o mesmo html
elemento. 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
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?