我没有在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)这种方法存在明显的问题。谢谢!
答案 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。