2

我了解到每个 Xpath 表达式也是一个有效的 Xquery 表达式。我在这个示例 XML 中使用 Oxygen 16.1:

<actors>
    <actor filmcount="4" sex="m" id="15">Anderson, Jeff</actor>
    <actor filmcount="9" sex="m" id="38">Bishop, Kevin</actor>
</actors>

我的表达是:

//actor/@id

当我使用 Xpath 3.0 在 Oxygen 中评估这个表达式时,我得到了我所期望的结果:

15
38

但是,当我使用 Xquery 3.0(也是 1.0)评估此表达式时,我收到消息:“您的查询返回了一个空序列。

谁能提供任何关于为什么会这样的见解,以及我如何编写等效的 Xquery 语句来获得上面的 Xpath 语句所做的事情?

4

1 回答 1

5

其他 XQuery 实现确实支持这个查询

如果您想验证您的查询(根据评论中的讨论更正)在完全按照问题中给出的输入时确实与其他 XQuery 实现一起工作,您可以按如下方式运行它(在 BaseX 中测试):

declare context item := document { <actors>
    <actor filmcount="4" sex="m" id="15">Anderson, Jeff</actor>
    <actor filmcount="9" sex="m" id="38">Bishop, Kevin</actor>
</actors> };

//actor/@id

Oxygen XQuery 需要一些额外的帮助

Oxygen XML 不支持序列化属性,因此当该序列将提供给用户时,会将它们从结果序列中丢弃。

因此,您可以使用如下查询来解决此问题:

  • //actor/@id/string(.)
  • data(//actor/@id)

以下适用于该问题的历史版本。

坦率地说,我永远不会期望//actors/@id使用任何有效的 XPath 或 XQuery 引擎针对该数据返回任何内容。

原因是只有一个地方你在递归 - 一个//- 并且正在寻找actors. 和/之间的单一意味着它们需要直接连接,但在您在这里提供的数据中并非如此——它们之间有一个元素。actors@idactor

因此,您需要修复您的查询。您可以编写许多查询来在本文档中找到您想要的数据——知道哪个是合适的需要比您提供的信息更多的信息:

  • //actor/@id- 在任何地方查找actor元素,并获取它们的id属性值。
  • //actors/actor/@id- 在任何地方查找actors元素;查找actor它们正下方的元素,并获取id此类actor元素的属性。
  • //actors//@id- 查找元素id子树中的所有属性actors
  • //@id- 在文档中的任何位置查找id属性。

...ETC。

于 2015-06-05T20:50:04.653 回答