Apa perbedaan antara "/ node ()" dan "node ()" di XPath?

Aug 18 2020

Sebagai per saya memahami dari XPath, untuk setiap HTML atau XML dokumen:
$x("/node()")cara $x("/child::node()")yang berarti kembali simpul yang merupakan anak dari simpul konteks. Di sini, simpul akar (/)adalah simpul konteks. Oleh karena itu, ia mengembalikan htmlelemen tersebut.

$x("node()")artinya $x("child::node()")yang juga mengembalikan htmlelemen yang sama . Namun dalam kasus ini, kami belum menyediakan node konteks seperti pada kasus di atas. Jadi, bagaimana cara mengidentifikasi simpul konteks dalam kasus ini?

Juga, kedua ekspresi XPath di atas secara sintaksis dan fungsional sama.

Jawaban

1 kjhughes Aug 18 2020 at 22:16

Perbedaannya adalah yang /node()menentukan simpul konteks secara mutlak sebagai dokumen root ( /), tetapi node()bergantung pada simpul konteks relatif yang tersirat.

Bagaimana node konteks relatif tersirat ditentukan? Nah, berdasarkan konteksnya. ;-) Misalnya, bahasa hosting biasanya akan menyetel node konteks awal ke node saat ini yang dicocokkan atau diiterasi. Kemudian, dalam evaluasi XPath itu sendiri, setiap langkah lokasi (dipisahkan melalui garis miring /) , menetapkan simpul konteks untuk langkah-langkah selanjutnya.

The $x(path, [startNode])notasi yang digunakan dalam Chrome konsol membawa argumen opsional kedua yang dapat digunakan untuk menentukan node konteks eksplisit. Secara default, ini sama dengan node root dokumen, yang mengarah ke perilaku yang diamati di mana $x("node()")dan $x("/node()")mengembalikan hasil yang sama untuk dokumen tertentu.

Juga, kedua ekspresi XPath di atas secara sintaksis dan fungsional sama.

Jelas node()dan child::node()secara sintaksis berbeda, tetapi, ya, keduanya secara semantik (atau secara fungsional , seperti yang Anda katakan) sama karena child::sumbu adalah sumbu default.

Lihat juga

  • Node saat ini vs. Node konteks di XSLT / XPath?
  • Apa perbedaan antara simpul akar, elemen akar dan elemen dokumen dalam XML?
  • Apa perbedaan antara .// dan // * di XPath?