我了解到每个 Xpath 表达式也是一个有效的 Xquery 表达式。我将 Oxygen 16.1 与此示例 XML 结合使用:
<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 语句的作用?
最佳答案
其他 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(.)
数据(// Actor /@id)
以下内容适用于该问题的历史版本。
坦率地说,我不希望 //actors/@id
使用任何有效的 XPath 或 XQuery 引擎返回针对该数据的任何内容。
原因是您只能递归一个地方 - 一个 //
- 也就是寻找 actor
。 actors
和 @id
之间的单个 /
意味着它们需要直接连接,但这不是您在此处提供的数据中的情况 - 它们之间有一个 actor
元素。
因此,您需要修复您的查询。您可以编写许多查询来在本文档中找到您想要的数据 - 要知道哪一个是合适的,需要比您提供的更多信息:
//actor/@id
- 在任意位置查找actor
元素,并获取其id
属性值。//actors/actor/@id
- 在任何地方查找actors
元素;查找直接位于其下的actor
元素,并获取此类actor
元素的id
属性。//actors//@id
- 查找actors
元素子树中的所有id
属性。//@id
- 在文档中的任意位置查找id
属性。
...等等
关于xpath - 无法使用 Oxygen XQuery 实现选择 XML 属性; Oxygen XPath 发出结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30675484/