XPath'de "/ node ()" ve "node ()" arasındaki fark nedir?

Aug 18 2020

XPath anlayışıma göre, herhangi bir HTML veya XML belgesi için: bu, bağlam düğümünün bir çocuğu olan düğümü döndürmek
$x("/node()")anlamına $x("/child::node()")gelir. Burada kök düğüm (/), bağlamsal düğümdür. Bu nedenle, htmlöğeyi döndürür .

$x("node()")$x("child::node()")aynı htmlöğeyi döndüren anlamına gelir . Ancak bu durumda, yukarıdaki durumda olduğu gibi bağlam düğümünü sağlamadık. Öyleyse, bu durumda bağlam düğümünü nasıl tanımlar?

Ayrıca, yukarıdaki XPath ifadelerinin her ikisi de sözdizimsel ve işlevsel olarak aynıdır.

Yanıtlar

1 kjhughes Aug 18 2020 at 22:16

Aradaki fark, /node()bağlam düğümünü kesinlikle belge kökü ( /) olarak belirtmesi , ancak node()örtük, göreceli bir bağlam düğümüne dayanmasıdır.

Örtülü, göreceli bir bağlam düğümü nasıl belirlenir? Bağlama göre. ;-) Örneğin, barındırma dili tipik olarak ilk bağlam düğümünü eşleşen veya yinelenen geçerli düğüme ayarlar. Daha sonra, XPath'in kendi değerlendirmesi dahilinde, her konum adımı (eğik çizgilerle ayrılmış /), sonraki adımlar için bağlam düğümünü oluşturur.

$x(path, [startNode])Krom konsolunda kullanılan notasyon açıkça bağlam düğümü belirtmek için kullanılabilecek opsiyonel bir ikinci argüman alır. Varsayılan olarak, belge kök düğümüne eşittir, bu da belirli bir belge için aynı sonuçları döndürdüğü $x("node()")ve $x("/node()")döndürdüğü gözlemlenen davranışa yol açar .

Ayrıca, yukarıdaki XPath ifadelerinin her ikisi de sözdizimsel ve işlevsel olarak aynıdır.

Açıkça node()ve child::node()vardır sözdizimsel evet öyleler, farklı, ancak semantik (ya da işlevsel olarak dediğiniz gibi) çünkü aynı child::eksen varsayılan eksenidir.

Ayrıca bakınız

  • XSLT / XPath'deki mevcut düğüm ve Bağlam düğümü?
  • XML'deki kök düğüm, kök öğe ve belge öğesi arasındaki fark nedir?
  • XPath'de .// ve // ​​* arasındaki fark nedir?