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语句?
如果您想验证您的查询(在评论中按照讨论更正)确实与其他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 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
在文档中的任何位置查找属性....等等.