38
A
回答
52
如果您將「不是後代」翻譯爲「沒有祖先」,您會得到表達式//*[not(ancestor::X)]
。這將返回文檔中的所有節點,這些節點不是名爲「X」的節點的後代。
16
jarnbjo指出了直觀的方法來做到這一點,使用//*[not(ancestor::X)]
。這具有非常大的優點,無論文檔的結構如何,它都可以工作,並且這是您在大多數情況下應該使用的。
但是,如果你有一個非常大的文件,它可能是非常低效的。這是一個非常昂貴的查詢。它告訴XPath處理器訪問文檔中的每個節點並檢查其祖先節點是否存在名爲X的元素。雖然XPath處理器可能足夠聰明以知道它不需要訪問X的後代要評估該查詢,這不太可能。
如果您有關於X元素位置的一些信息,並且您非常小心,則可以編寫更高效的查詢。例如,如果X是頂級元素的子元素,並且它有很多後代,這將是更快:
/* | /*/* | /*/*[not(name()='X')]//*
那找到頂級元素,它的所有直系子的,以及其任何直系子女的後代(不是X),它不會檢查任何X的後代。
同樣,如果你知道X是接近樹的底部,此查詢可能會更有效:
//*[not(ancestor::*[position() <= 3][X])]
,因爲它不會審查它測試每個節點整個祖先軸,只是最後三個元素。 (除非XPath處理器足夠笨重以檢查軸上的每個節點,當它執行使用position()
的測試時,可能是這樣。)
正如我所說,雖然大多數時候最簡單的版本將是最好的,大部分時間都是我自己使用的。
相關問題
- 1. 使用Xpath獲取第一個祖先
- 2. 獲取沒有特定祖先的節點xml xpath
- 3. 的XPath祖先
- 4. Xpath /獲得具有一定價值的最親密的祖先
- 5. Xpath的祖先發現DIV
- 6. 獲取只有一個祖先節點的值
- 7. 與它的祖先獲取元素的XPath
- 8. XPATH祖先或自身
- 9. 如何用xpath獲得最近的祖先或祖先的子女
- 10. 的XPath:獲取某些節點和祖先
- 11. 獲取最遙遠的祖先節點-Xpath,XSLT
- 12. 獲取父/祖先UL
- 13. 獲取祖先onclick屬性
- 14. 如何獲取可能擁有祖先及其祖先的所有元素都沒有指定的類?
- 15. 使用PHP和xpath獲取祖先節點
- 16. WordPress的菜單祖先沒有給祖先類
- 17. 使用Xpath查找一個屬性的祖先
- 18. 避免使用「祖先::」的XPath軸
- 19. 連接祖先價值的Xpath搜索
- 20. Google Datastore祖先查詢每個祖先每秒寫一個
- 21. 獲取祖先節點+的XQuery-SQL
- 22. 獲取祖先類的泛型類型
- 23. 沒有共同祖先的分支
- 24. 如何使用XPath找到一個祖先或自身的最近的祖先節點列表
- 25. XPath祖先和後代在XSL副本
- 26. XPath祖先或自我解析命令
- 27. 有沒有辦法用QueryPath或DOM獲取祖先的字符串表示?
- 28. 獲取第一個匹配的祖先包含一個特定的類
- 29. Sql HierarchyId如何獲取2級祖先
- 30. 在Wpf中獲取祖先源