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

时间:2015-06-05 20:40:32

标签: 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>

我的表达是:

//actor/@id

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

15
38

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

任何人都可以提供任何有关其原因的见解,以及如何编写等效的Xquery语句来获取上面的Xpath语句?

1 个答案:

答案 0 :(得分: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之间的单@id表示他们需要直接连接,但数据中的情况并非如此在这里 - 他们之间有一个actor元素。

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

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

...等