[英]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中的一個錯誤。
- 如果從軸步驟中省略軸名稱,則默認軸為
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.