【问题标题】:MarkLogic Xquery: How to sort string values in a for loopMarkLogic Xquery:如何在 for 循环中对字符串值进行排序
【发布时间】:2020-08-27 18:14:51
【问题描述】:

我有一个序列,需要根据最早年份与最新年份对列表进行排序。由于 year 元素中的一些独特值,它使排序变得更加复杂。有没有办法实现以下目标?

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

日期元素文本通常是数据中的年份,但异常案例有前置或后置。有什么方法可以最低限度地实现这一目标?

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    我不确定这是否是最小的,但它有效:

    let $dates := ('1982', '2019', '2095', 'pre-1982', 'post-2095')
    return    
    for $date in $dates
    let $year := 
            if (fn:contains($date, "-")) 
            then fn:substring-after($date, "-") 
            else $date
    
    let $prepost := 
            if (fn:starts-with($date, "pre")) 
            then -1 
            else if (fn:starts-with($date, "post")) 
            then 1
            else 0
    order by $year, $prepost
    return $date
    

    【讨论】:

      【解决方案2】:

      仅供参考:绝对不是最小的,但我想知道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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-14
        • 2016-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        相关资源
        最近更新 更多