¿Cuál es la diferencia entre “/ nodo ()” y “nodo ()” en XPath?
Según mi comprensión de XPath, para cualquier documento HTML o XML:
$x("/node()")
significa $x("/child::node()")
que significa devolver el nodo que es un hijo del nodo de contexto. Aquí, el nodo raíz (/)
es el nodo de contexto. Por tanto, devuelve el html
elemento.
$x("node()")
significa $x("child::node()")
que también devuelve el mismo html
elemento. Pero en este caso, no hemos proporcionado el nodo de contexto a diferencia del caso anterior. Entonces, ¿cómo identifica el nodo de contexto en este caso?
Además, ambas expresiones XPath anteriores son sintáctica y funcionalmente iguales.
Respuestas
La diferencia es que /node()
especifica el nodo de contexto absolutamente como la raíz del documento ( /
), pero se node()
basa en un nodo de contexto relativo implícito.
¿Cómo se determina un nodo de contexto relativo implícito? Bueno, basado en el contexto. ;-) Por ejemplo, el lenguaje de alojamiento establecerá típicamente el nodo de contexto inicial en el nodo actual que se empareja o se itera. Luego, dentro de la evaluación del XPath en sí, cada paso de ubicación (separado mediante barras /
) establece el nodo de contexto para los pasos siguientes.
La $x(path, [startNode])notación utilizada en la consola de Chrome toma un segundo argumento opcional que se puede utilizar para especificar el nodo de contexto de forma explícita. De forma predeterminada, es igual al nodo raíz del documento, lo que conduce al comportamiento observado donde $x("node()")
y $x("/node()")
devolvió los mismos resultados para un documento determinado.
Además, ambas expresiones XPath anteriores son sintáctica y funcionalmente iguales.
Claramente node()
y child::node()
son sintácticamente diferentes, pero, sí, son semánticamente (o funcionalmente , como dices) iguales porque el child::
eje es el eje predeterminado.
Ver también
- ¿Nodo actual frente a nodo de contexto en XSLT / XPath?
- ¿Cuál es la diferencia entre nodo raíz, elemento raíz y elemento de documento en XML?
- ¿Cuál es la diferencia entre .// y // * en XPath?