无法使用Oxygen XQuery实现选择XML属性; Oxygen XPath发出结果

mds*_*lup 2 xpath xquery oxygenxml

我了解到每个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>
Run Code Online (Sandbox Code Playgroud)

我的表达是:

//actor/@id
Run Code Online (Sandbox Code Playgroud)

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

15
38
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以提供任何有关为什么这样做的见解,以及我如何编写等效的Xquery语句来获取上面的Xpath语句?

Cha*_*ffy 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
Run Code Online (Sandbox Code Playgroud)

Oxygen XQuery需要一些额外的帮助

Oxygen XML不支持序列化属性,因此当该序列以其他方式提供给用户时,会从结果序列中丢弃它们.

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

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

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

坦率地说,我不希望//actors/@id用任何有效的XPath或XQuery引擎返回任何反对该数据的东西.

原因是你只有一个地方在递归 - 一个//- 而且正在寻找actors.它们/之间的单一actors@id它们需要直接连接的方式,但在这里给出的数据中并非如此 - actor它们之间存在一个元素.

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

  • //actor/@id- actor在任何地方查找元素,并获取其id属性值.
  • //actors/actor/@id- actors随处查找元素; actor在它们下面寻找元素,并获取id这些actor元素的属性.
  • //actors//@id- 查找元素id子树中的所有属性actors.
  • //@id- id在文档中的任何位置查找属性.

...等等.