【问题标题】:What is the difference between "element" and "//element" in XPath?XPath 中的“元素”和“//元素”有什么区别?
【发布时间】:2018-06-24 22:49:06
【问题描述】:

我正在阅读这个 XPath 示例:https://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx,我想知道这两个表达式之间的区别:

author
All <author> elements within the current context.

//author
All <author> elements in the document.

这两种情况有什么区别?如果“当前上下文”是根节点,这是否会使两者等价?

对于这个简单的 XML 文件:

<root>
    <author>
        <first-name></first-name>
    </author>
</root>

我在这个网站上试过https://www.freeformatter.com/xpath-tester.html

为什么author 没有像我预期的那样返回任何东西(但//author 有效)?

【问题讨论】:

    标签: xpath


    【解决方案1】:

    description you cite 用于相对 XPath 表达式,author

    当前上下文中的所有 &lt;author&gt; 元素。

    错误1。它应该说,

    当前上下文node的所有&lt;author&gt;child元素。

    //author 确实会选择文档中的所有&lt;author&gt; 元素,因为// 沿descendant-or-self 轴选择。

    author 没有为您的 XML 文档选择任何内容的原因是,将上下文节点设置为文档根,您必须包含 root/author 才能选择 &lt;root&gt;&lt;author&gt; 子级或只需 root 选择 &lt;root&gt; 元素本身。

    1截至今天,2018-06-24,但是我已经提交了反馈,应该更正它,所以希望它会尽快修复。

    【讨论】:

    • 根节点(在我的示例中为&lt;root&gt;)不是文档节点吗?那么当我们评估 XML 时,它不也是上下文节点吗?在这种情况下,&lt;author&gt; 是它的子节点之一,所以 author 表达式应该能够返回 &lt;author&gt; 节点,不是吗?我理解错了什么?
    • @Chin:不,您的root 元素是文档元素。另一方面,root node 是树的根。除了作为树的根之外,不会出现根节点。文档元素的元素节点是根节点的子节点。根节点还具有子处理指令和注释节点,用于处理在序言中和文档元素结尾之后出现的指令和 cmet。
    【解决方案2】:

    element”选择当前节点的所有名为“element”的直接子节点,与“./element”相同。

    "//element" 选择任意深度的所有“元素”节点,从根开始(忽略当前节点)。

    并完成列表:

    .//element”将选择当前节点下方任意深度的“元素”子节点。

    "/element" 只会在根级别搜索(在你的例子中,你需要 "/root" 来获取任何东西)。

    至于“author”没有找到任何东西:你首先需要在你的根节点级别。 “/root/author”会得到你想要的节点,或者先选择“/root”然后你可以从那里选择“author”。

    【讨论】:

    • 我想当我评估一个XML文档时,如果我不指定起始节点,它会从根节点开始?如果它不是从根节点开始,那么在哪里?
    • @Chin:不,没有前导 /,XPath 表达式是 relative 到当前上下文节点。 reference you cite is unfortunately wrong 很可能导致了您的误解。
    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 2014-02-07
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2012-02-14
    • 2017-06-11
    • 2010-09-13
    相关资源
    最近更新 更多