2015-01-01 2 views
2

XQuery에서 즉시 사용할 수있는 자연 정렬 구현을 찾지 못했지만 한 번 생각했습니다. 사용 재료는 참조로 here을 발견, 이것이 내가 생각 해낸 것입니다 :MarkLogic에서 XQuery로 자연 정렬 구현

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) 거기에 기존/표준 방법은 내가 (3)이 방법에 명백한 문제가있다. 감사!

답변

2

XQuery에서 사용할 수있는 데이터 정렬 집합은 XQuery 구현에 따라 다릅니다. "order by"절에서 옵션으로 데이터 정렬을 선택할 수 있습니다. XQuery를 3.1, 당신이해야합니다 당신의 문서를 확인하면 정렬

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

하지만, XQuery를 1.0 또는 3.0 구현과 URI

를 사용을 요구하고 정렬 순서를 요청할 수 있습니다 유니 코드 데이터 정렬 알고리즘에 대한 지원을 제공합니다 귀하가 선택한 제품. Saxon은 법안에 맞는 영숫자 데이터 정렬을 가지고 있지만 MarkLogic에 대해서는 잘 모릅니다.

+1

감사합니다. FWIW는 'order by'의 관련 데이터 정렬을 사용하여 MarkLogic에서이를 수행하는 방법입니다. $ i에 대해 ('1', '10', '2', '11') $ i 데이터 정렬에 의한 정렬 "http : //marklogic.com/collation/ko/MO " return $ i' – JKesMc9tqIQe9M