XPath中的缩写语法

时间:2016-01-22 17:24:58

标签: xml xpath

//olist/items返回什么?

嗯,//descendent-or-self::node()/的缩写,因此它返回一组节点,这些节点是我的上下文节点的后代。之后,它的路径中必须有olist

item表示child::item,因此它返回我的上下文节点的子节点(即//olist/)。因此,最后它返回项目节点,我的起始上下文节点的所有子节点的子节点或其路径中具有olist的其中一个子节点。

右?

2 个答案:

答案 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表达式未指定轴,则默认情况下会理解子轴。由于只有根节点或元素节点具有子节点,因此任何其他用途都不会选择任何内容。