问题描述
我有一个序列,需要根据最早年份和最近年份对列表进行排序。由于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)