Qual è la differenza tra "/ node ()" e "node ()" in XPath?
Secondo la mia comprensione di XPath, per qualsiasi documento HTML o XML:
$x("/node()")
significa $x("/child::node()")
che significa restituire il nodo che è un figlio del nodo di contesto. Qui, il nodo radice (/)
è il nodo di contesto. Pertanto, restituisce l' html
elemento.
$x("node()")
significa $x("child::node()")
che restituisce anche lo stesso html
elemento. Ma in questo caso, non abbiamo fornito il nodo di contesto a differenza del caso precedente. Quindi, come identifica il nodo di contesto in questo caso?
Inoltre, entrambe le espressioni XPath di cui sopra sono sintatticamente e funzionalmente uguali.
Risposte
La differenza è che /node()
specifica il nodo di contesto assolutamente come radice del documento ( /
), ma node()
si basa su un nodo di contesto relativo implicito.
Come viene determinato un nodo di contesto relativo implicito? Bene, in base al contesto. ;-) Ad esempio, la lingua di hosting in genere imposterà il nodo del contesto iniziale sul nodo corrente che viene abbinato o iterato. Quindi, all'interno della valutazione dell'XPath stesso, ogni passaggio di posizione (separato da barre /
) stabilisce il nodo di contesto per i passaggi successivi.
La $x(path, [startNode])notazione utilizzata nella console Chrome accetta un secondo argomento facoltativo che può essere utilizzato per specificare esplicitamente il nodo del contesto. Per impostazione predefinita, è uguale al nodo radice del documento, che porta al comportamento osservato dove $x("node()")
e $x("/node()")
restituisce gli stessi risultati per un dato documento.
Inoltre, entrambe le espressioni XPath di cui sopra sono sintatticamente e funzionalmente uguali.
Chiaramente node()
e child::node()
sono sintatticamente diversi, ma sì, sono semanticamente (o funzionalmente , come dici tu) gli stessi perché l' child::
asse è l'asse predefinito.
Guarda anche
- Nodo attuale e nodo di contesto in XSLT / XPath?
- Qual è la differenza tra nodo radice, elemento radice ed elemento documento in XML?
- Qual è la differenza tra .// e // * in XPath?