2012-10-16 4 views
1

하나의 변수에 하나의 값을 추출하고 다른 변수에 값 목록을 성공적으로 추출했습니다 (내 XQuery 표현식의 일부로). 이제xquery- 숫자 값 목록에서 연속 값의 차이를 얻는 방법

는 단일 값 변수

x=1 

하고 목록 변수가 값 나는 다음과 같은 값을 추출 할 2,4,7,11,16

와 Y이라는 가정 - (2-1), (4-2), (7-4), (11-7), (16-11)

즉, 목록 변수의 첫 번째 값에서 단일 값 변수를 뺀 값 list 변수의 연속 멤버 사이.

나는 ... 모든 출력으로 표시됩니다

for $pos in list-variable/position() 
-> if clause for $pos=1 (to subtract and shown list variable- single value variable)  
->else show difference b/w consecutive list variables... 

만을 사용하여 시도 내가 잘못 여기서 뭐하는 거지?

답변

2

I. 사용 :

let $pVal := 1, 
    $vList := (2,4,7,11,16), 
    $vList2 := ($pVal, subsequence($vList, 1, count($vList)-1)) 
return 
    map-pairs(function($m as xs:integer, $n as xs:integer) as xs:integer 
       { 
       $m - $n 
       }, 
       $vList, 
       $vList2 
      ) 
,369

1 2 3 4 5 

II : 1,363,210

이가 원하는, 올바른 결과을 생산하고 있습니다. XQuery를 1.0 용액 :

1 2 3 4 5 

성능 비교 :

Surprizingly,는 XPath (는 XQuery)가 3.0 쿼리가 거의 2 배 실행

let $pVal := 1, 
    $vList := (2,4,7,11,16), 
    $vList2 := ($pVal, subsequence($vList, 1, count($vList)-1)) 
return 
    for $i in 1 to count($vList) 
    return 
     $vList[$i] - $vList2[$i] 

다시 같은 올바른 결과 생산 BaseX에서 실행될 때 XQuery 1.0보다 빠릅니다.

+0

결과 목록에서 최소/최대 값을 원한다면 어떻게해야합니까? (xquery 1/xquery 3에서)? 감사... – Arvind

1

예제가 너무 추상적이어서 사용하려고 시도한 것이 명확하지 않습니다.

그러나이 같은 $의 X 또는 이전 요소 뺄 수 있습니다

let $x := 1, $seq := (2,4,7,11,16) 
for $temp at $pos in $seq 
return $seq[$pos] - if ($pos eq 1) then $x else $seq[$pos - 1] 

것은 당신이 위치를 원하는 경우 '$ pos의'사용하는 것을 기억합니다.

(그리고 BTW, XQuery를 3도 바로이 경우에 윈도우 절을 가지고

아마도 다음과 같을 것이다 :

let $x := 1, $seq := (2,4,7,11,16) 
for sliding window $w in ($x, $seq) 
    start at $s when fn:true() 
    only end at $e when $e - $s eq 1 
return $w[2] - $w[1] 

쉬울 것 같지 않지만, 시원하다)

XQuery를 3.0/XPath는 3.0
관련 문제