Qual è la differenza tra "/ node ()" e "node ()" in XPath?

Aug 18 2020

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

1 kjhughes Aug 18 2020 at 22:16

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?