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' htmlelemento.
$x("node()")significa $x("child::node()")che restituisce anche lo stesso htmlelemento. 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?