在 MarkLogic 上的 XQuery 中实现自然排序

Implementing natural sort in XQuery on MarkLogic

我没有在 XQuery 中找到任何现成的自然排序实现,所以我想试一试。使用找到的东西 here 作为参考,这就是我想出的:

xquery version "1.0-ml";


declare namespace xf = "http://www.w3.org/2005/xpath-functions";
declare namespace nat-sort = "https://github.com/JKesMc9tqIQe9M/xquery-natural-sort";
import module namespace functx = "http://www.functx.com" at "/MarkLogic/functx/functx-1.0-nodoc-2007-01.xqy";


declare %public function nat-sort:nat-sort($s as item()*) as item()* {

    let $pad-length := fn:max($s ! fn:analyze-string(., '([0-9]+)')/xf:match ! fn:string-length(.)) + 1

    for $item in $s    
    let $sort-key := fn:string-join(
      let $decomposed := fn:analyze-string($item, '([0-9]+)')/xf:*
      for $i in $decomposed
      return
        if ($i/self::xf:match)
        then fn:string(functx:pad-integer-to-length(fn:number($i), $pad-length))
        else fn:string($i),
      '')
    order by $sort-key
    return $item
};

它似乎有效,至少对于我构建的几个测试用例是这样,但我想知道是否 (1) 有更简洁的方法 (2) 有 existing/standard 方法来do it I'm unaware of (3) 这种方法存在明显的问题。谢谢!

XQuery 中可用的归类集取决于您的 XQuery 实现。您可以选择排序规则作为 "order by" 子句中的选项。 XQuery 3.1 带来了对 Unicode 归类算法的支持,它允许您使用归类 URI

请求您要求的排序顺序
http://www.w3.org/2013/collation/UCA?numeric=yes

但是对于 XQuery 1.0 或 3.0 实现,您必须查看所选产品的文档。 Saxon 有符合要求的字母数字排序规则,但我不知道 MarkLogic。