我了解到每个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在氧气中计算这个表达式时,我得到了我所期望的结果:
15
38但是,当我用Xquery 3.0 (也是1.0)计算这个表达式时,我得到消息:“您的查询返回了一个空序列。
有没有人能解释为什么会这样,以及我如何编写等价的Xquery语句来获得上面的Xpath语句的作用?
发布于 2015-06-06 04:50:05
其他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/@idOxygen XQuery需要额外的帮助
Oxygen XML不支持序列化属性,因此当结果序列本来应该提供给用户时,它会从结果序列中丢弃这些属性。
因此,您可以使用如下查询解决此问题:
//actor/@id/string(.)data(//actor/@id)下面适用于这个问题的历史版本。
坦率地说,对于任何有效的XPath或XQuery引擎,我都不期望//actors/@id会针对该数据返回任何内容。
原因是只有一个地方需要递归--一个// --那就是寻找actors。actors和@id之间的单个/意味着它们需要通过直接连接,但这里给出的数据并非如此--它们之间有一个actor元素。
因此,您需要修复您的查询。您可以编写许多查询来查找本文档中所需的数据--知道哪一个是合适的将需要比您提供的更多的信息:
//actor/@id -在任何位置查找actor元素,并获取其id属性//actor/@id-在任何位置查找actor元素;在其正下方查找id元素,并获取此类actors elements.//@id的id属性-在actor elements.//@id的子树中查找所有actors属性-在文档中的任何位置查找id属性。<代码>H241<代码>F242...etc。
https://stackoverflow.com/questions/30675484
复制相似问题