簡體   English   中英

XPath:為什么/ document-node()與文檔節點匹配?

[英]XPath: Why does /document-node() match the document node?

/的XPath表達式返回文檔節點。

/html的XPath表達式等同於/child::html並且給定HTML文檔將返回html元素。 這當然是通過轉到文檔節點(由/表示)然后找到元素child(它是html標記)來評估的。

為什么/document-node()實際上返回文檔節點?

給定一般的XPath表達式規則,我假設/document-node()等效於/child::document-node() ,而/child::document-node()應該返回一個空節點序列(因為文檔節點)永遠不是文檔節點的孩子)。 實際上/child::document-node() 確實返回一個空節點序列,這使我相信/document-node()不等同於/child::document-node() 這似乎違反了一般的XPath表達式規則,其中空軸是隱含的子軸1

是否有一些特殊的規則,當你有一個document-node()的步驟時,假設軸是self而不是child 我正在使用最新版本的Altova XMLSpy(2018 sp1)。 或者,這是XMLSpy中的錯誤嗎? 或者我對一般XPath表達式規則的理解有些不正確?

注意:對於嘗試此操作的任何人,只有XPath 2和XPath 3支持document-node()

1更新:作為一個不相關的FYI,我從Mads Hansen的回答中學到了一些新東西:在XPath 2和XPath 3中,空軸是隱含的子軸, 除非有屬性測試; 如果有屬性測試,它實際上是一個隱含的屬性軸。 因此,當/html隱式/child::html/attribute()是隱式/attribute::attribute()

這似乎是XML Spy中的一個錯誤。

3.3.5縮寫語法

  1. 如果從軸步驟中省略軸名稱,則默認軸為child ,但有兩個例外:如果軸步驟中的NodeTest包含AttributeTest或SchemaAttributeTest,則默認軸為attribute ; 如果軸步驟中的NodeTest是NamespaceNodeTest,則會引發靜態錯誤[錯誤:XQST0134]。

使用Saxon 9.8.0.8(HE,PE,EE)和MarkLogic 9.0.3進行驗證時,XPath /document-node()/child::document-node()不會選擇任何內容。

這些具有不同軸名稱的XPath確實選擇了document-node()

/self::document-node()
/ancestor-or-self::document-node()
/*/ancestor::document-node()
/*/ancestor-or-self::document-node()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM