【问题标题】:Does Saxon provide a way to sort returned nodes?Saxon 是否提供了一种对返回的节点进行排序的方法?
【发布时间】:2017-10-31 06:28:42
【问题描述】:

Saxon 是否有办法按排序顺序返回节点,其中“顺序”由返回节点中的 1 个或多个节点/属性定义?

换句话说,XPath 查询可以是:

/Order/Dates/Date order by .

谢谢 - 戴夫

【问题讨论】:

    标签: java saxon


    【解决方案1】:

    答案是肯定的,有很多方法!但是,如果您想要一个准确的答案,您需要更准确地了解要求。

    您可以使用 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 中的新功能,因此您在许多书籍或在线教程中都找不到它。

    【讨论】:

    • 首先,我们确实有 Saxon 的企业版,所以这不是问题。我们的系统目前已设置好,用户可以输入“/Order/Dates/Date order by”。以按排序顺序获取节点列表。目前我们调用 Saxon 来获取文档顺序的节点,然后自己排序。如果撒克逊人能做到这一点,我更愿意这样做。在调用 select 时,我们会即时将我们的语法转换为上述语法。所以3个问题。哪种方法更好/更快?其次,它可以处理多个排序节点/属性(即姓氏、名字),第三,语法记录在哪里? TIA。
    • 如果我错了,请纠正我,但如果我们不能使用 XQuery 方法(因为我们的许可证),那么我们就只能使用 XPath 方法。而且 XPath 方法不支持升序和降序排序标准的组合 - 对吗?
    • 我们如何从 Saxon Java API 调用“sort(/*/Employee, function($e){$e/firstName, $e/lastName})”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    相关资源
    最近更新 更多