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

时间:2015-01-01 19:03:31

标签: xpath xquery 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)那里有一个&#39现有的/标准的做法我不知道(3)这种方法存在明显的问题。谢谢!

1 个答案:

答案 0 :(得分:2)

XQuery中可用的排序集取决于您的XQuery实现。您可以在"顺序中选择排序规则作为选项。条款。 XQuery 3.1支持Unicode排序规则算法,允许您使用排序规则URI请求排序顺序

http://www.w3.org/2013/collation/UCA?numeric=yes

但是使用XQuery 1.0或3.0实现,您必须检查所选产品的文档。 Saxon有一个符合法案的字母数字校对,但我不了解MarkLogic。