//olist/items
返回什么?
嗯,//
是descendent-or-self::node()/
的缩写,因此它返回一组节点,这些节点是我的上下文节点的后代。之后,它的路径中必须有olist
。
item
表示child::item
,因此它返回我的上下文节点的子节点(即//olist/
)。因此,最后它返回项目节点,我的起始上下文节点的所有子节点的子节点或其路径中具有olist
的其中一个子节点。
右?
答案 0 :(得分:2)
item表示child :: item,因此它返回我的上下文节点的子节点(即// olist /)。所以,最后它返回项目节点,我的起始上下文节点的所有子节点的子节点或其路径中具有olist的一个后代。
右?
这几乎是正确的 - 不仅必须在结果集中item
元素" olist
在他们的路径" (我理解为:必须是olist
的后代) - 它们必须是olist
的直接子元素。
然后让我们清楚关于"根节点":
的混淆当Matt Jones使用"根节点"在他对//
的解释中,他并不是指他的XML例子中最外层的元素。只有巧合,最外面的元素也称为root
。
"根节点"或"文档节点"与XML文档的最外层元素不同。最外层的元素实际存在于您的文档中,所有XML元素和属性都在其中。
文档节点在文档中不可见,它是表示整个XML文档的抽象概念。 XML文档中的所有节点都是文档节点的后代。
另一方面,并非所有节点都是最外层元素的后代:例如,最外层元素之外可能存在处理指令或注释。但是那些处理指令和注释包含在文档节点中。
现在,//
表示上下文节点或其任何后代,如您所知。在这种情况下,文档节点将是您的路径表达式的上下文(如果这不是您想要的,请在其前面添加.
:.//
)。
所以表达式//item
表示/descendant-or-self::node()/child::item
,这意味着
选择名称为
item
的任何元素节点,该节点是XML结构中任何位置的节点的子节点
这样的item
元素的父元素将是文档节点(在这种情况下,item
元素将是最外层元素)或任何元素节点。
在XPath 1.0中,XML文档的抽象容器被称为"根节点",从XPath 2.0起,它被称为"文档节点"。
XPath 1.0 Specification, Abbreviated Syntax
"Document element and root node are often confused, but they are not the same thing"
答案 1 :(得分:0)
//olist/items
此XPath将返回名称为items
的元素集合,这些元素是名称为olist
的元素的子节点,这些元素是您要查询的XML文档的根节点的后代
在此示例XML中:
<root>
<olist>
<test/>
<items value="A"/>
</olist>
<other>
<inside>
<items value="B"/>
<olist>
<items value="C"/>
</olist>
</inside>
</other>
</root>
//olist/items
XPath将选择items
属性 A 和 C 的value
元素 - 因为它们是孩子olist
元素的元素。
它不会选择items
元素 B 的value
元素,因为该元素没有olist
所需的父元素。
从语法上讲,//
表示/descendant-or-self::node()/
- 在MDN上声明
descendant-or-self轴表示上下文节点及其所有后代。不包括属性和命名空间节点 - 属性节点的父节点是元素节点,但属性节点不是其父节点的子节点。
/olist
表示child::olist
- 子轴的MDN定义为
子轴表示上下文节点的子节点。如果XPath表达式未指定轴,则默认情况下会理解子轴。由于只有根节点或元素节点具有子节点,因此任何其他用途都不会选择任何内容。