我了解到每个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语句?
答案 0 :(得分:5)
如果要验证您的查询(在评论中按照讨论更正)确实实际上与其他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 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
个属性。...等