MarkLogic Xquery:如何在for循环中对字符串值进行排序

问题描述

我有一个序列,需要根据最早年份和最近年份对列表进行排序。由于year元素中有一些独特的值,这使排序变得更加复杂。有什么方法可以实现以下目标?

let $dates := ('1982','2019','2095','pre-1982','post-2095')
return    
for $date in $dates
order by $date
return $date

dates元素文本通常是数据中的年份,但异常情况带有前或后附加。有什么办法可以最小程度地做到这一点?

解决方法

我不确定这是否是最小的,但是它可以工作:

npx cypress-tags run -e TAGS='@smoke'
,

仅供参考:绝对不是最小,但是我想知道fn:sort在返回序列时的作用。原来它做对了。

xquery version "3.1";

declare variable $local:ascending := 1;
declare variable $local:descending := -1;

declare function local:sort-prefixed-years ($y,$order) {
    if (fn:contains($y,"-")) 
    then (
        let $p := fn:tokenize($y,"-")
        let $m :=
            switch($p[1])
            case "pre" return -1 * $order
            case "post" return 1 * $order
            default return 0
        return (xs:integer($p[2]) * $order,$m)
    )
    else (xs:integer($y) * $order,0)
};

declare function local:sort-prefixed-years-ascending ($prefixed-year) {
    local:sort-prefixed-years($prefixed-year,$local:ascending)
};

declare function local:sort-prefixed-years-descending ($prefixed-year) {
    local:sort-prefixed-years($prefixed-year,$local:descending)
};

let $dates := ('1982','2019','2095','pre-1982','post-2095')
return sort($dates,(),local:sort-prefixed-years-descending#1)