【问题标题】:Can't select XML attributes with Oxygen XQuery implementation; Oxygen XPath emits result无法使用 Oxygen XQuery 实现选择 XML 属性;氧气 XPath 发出结果
【发布时间】:2015-06-05 20:40:31
【问题描述】:

我了解到每个 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 语句的作用?

【问题讨论】:

  • 您确定不要//actors/actor/@id
  • //actors/@id 在针对您使用兼容 XPath 引擎提供的内容运行时,肯定不会返回 1538
  • 您确定没有在 XPath 引擎中运行 //actor/@id//actors//@id 吗?如果您在本文档中为 //actor/@id 获得任何结果,您应该向 Oxygen 开发人员报告问题。
  • @Jens Erat 你想写 //actors/@id
  • 是的,我当然想要。不能再编辑评论了。看来我对错字的猜测是正确的,阅读 cmets 的答案。

标签: xpath xquery oxygenxml


【解决方案1】:

其他 XQuery 实现支持这个查询

如果您想验证您的查询(根据 cmets 中的讨论更正)确实在完全按照问题中给出的输入时与其他 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 引擎针对该数据返回任何内容。

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

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

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

...等等。

【讨论】:

  • 更正后,XQuery 引擎应该返回结果,除非您没有向我们显示详细信息(例如 XML 名称空间)。
  • 请测试您是否可以使用问题中包含的内容重现问题——即。把你在这里给的sn-p作为一个完整的文档上传,看看是否还会出现。
  • @mdslup, ...我已经修改了问题以准确显示我的测试方式(使用 XQuery 3.0 扩展将您的文档设置为上下文项;仅供参考,我使用的引擎是 BaseX) .
  • (也就是说,BaseX 的使用仅与 declare context item 的可用性相关,这是一个相对较新的语言功能;否则,这将与任何可用引擎的行为相同)。
  • 你能在任何非专有引擎上重现吗?我当然不会签署许可协议并将自己列入某人的营销名单以重现产品错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多