【发布时间】:2017-10-31 06:28:42
【问题描述】:
Saxon 是否有办法按排序顺序返回节点,其中“顺序”由返回节点中的 1 个或多个节点/属性定义?
换句话说,XPath 查询可以是:
/Order/Dates/Date order by .
谢谢 - 戴夫
【问题讨论】:
Saxon 是否有办法按排序顺序返回节点,其中“顺序”由返回节点中的 1 个或多个节点/属性定义?
换句话说,XPath 查询可以是:
/Order/Dates/Date order by .
谢谢 - 戴夫
【问题讨论】:
答案是肯定的,有很多方法!但是,如果您想要一个准确的答案,您需要更准确地了解要求。
您可以使用 XQuery:
for $x in /Order/Dates/Date order by $x return $x
如果您有 Saxon,那么没有特别的理由需要纯 XPath 而不是 XQuery 的解决方案,但是 XPath 3.0 确实通过 fn:sort 函数具有一些排序能力:
sort(/Order/Dates/Date, function($date){ $date })
不过,除了最琐碎的排序键之外,fn:sort 涉及需要 Saxon-PE 或更高版本的高阶函数。
当然也可以使用 XSLT 进行排序。
如果您正在生成表达式,我认为生成 XQuery 表单没有太大区别:
for $e in /*/Employee
order by $e/firstName, $e/LastName
return e
和 XPath 版本
sort(/*/Employee,
function($e){$e/firstName, $e/lastName})
并且很可能存在任何明显的性能差异。 XQuery 版本更灵活一些,例如允许降序、选择排序规则、处理缺失值等。
这些是标准的 XPath/XQuery 工具,因此在 W3C 规范中进行了描述。 XQuery 排序从 1.0 开始就已经存在,因此将在任何有关 XQuery 的书籍中进行描述; XPath 排序是 XPath 3.1 中的新功能,因此您在许多书籍或在线教程中都找不到它。
【讨论】: