2012-10-02 3 views
3

Xquery에 고유 한 값과 유사한 기능이 있는지는 알고 싶지만 노드를 반환합니다.xquery : 노드의 고유 한 값을 얻는 방법

예를 들어 참고 문헌이 있고 각 저자마다 그가 작성한 모든 책을 나열하고 싶습니다. 내 특정 경우에 저자 요소는 다음과 같이이다 : 저자에 별개의-값을 사용

<author> 
    <last> Shakespear </last> 
    <first> William </first> 
</author> 

내가 도움이되지 않습니다 볼 수 있듯이 지금까지 ShakespearWilliam를 반환합니다. 중복을 고려하지 않고 요소 작성자의 구조를 보존하는 함수를 원합니다.

다른 방법을 찾으면 알려주십시오. 누구 아이디어가 있습니까?

답변

2

XQuery 3.0은 "그룹화"구문을 사용하므로 작성자를 (성, 이름) 값으로 그룹화 할 수 있습니다. 노드를 그룹화하면 본질적으로 답을 얻을 수 있습니다. 노드는 서로 다른 그룹에있는 경우에만 구별됩니다.

XQuery 3.0 초안의이 부분을 구현하는 제품이 많이 있습니다. 색슨 9.4가 그 중 하나입니다.

4

뚜렷한 노드를 얻는 문제는 두 노드가 뚜렷한 지 결정하는 것입니다. 이것은 XML의 복잡한 주제입니다. 복제 노드가 동일한 노드 ID를 가지면 (즉, 동일한 노드를 참조하는 경우) functx:distinct-nodes()과 같은 기능을 사용할 수 있습니다. 그렇지 않으면 노드가 동등한 것으로 간주 할만큼 충분히 동일한 지 또는 큰 데이터 집합에 대해 성능이 떨어지는 deep-equal()을 사용하여 비교할지를 결정하는 해시 유형이 필요합니다. '이 여전히 외설

$xml/author[index-of($xml/author/concat(last,first), concat(last,first))[1]] 

: 마지막과 이름이 동일 할 때

만약 두 <author>들 다음 해시로 concat(last,first) 같은 간단한을 사용하여 XPath를 사용하여 고유 한 값을 얻을 수, 동일 모든 단계에서 해시를 계산하기 때문에 이상적이므로 대용량 데이터 집합의 경우 속도가 느려집니다. 효율적 이상적으로를 사용 (해시하여 노드를 주문 얻을 수 있다면

$xml/author[index-of($xml/author/@hash, @hash)[1]] 

:

<author hash="ShakespearWilliam"> 
    <last>Shakespear</last> 
    <first>William</first> 
</author> 

과 : 성능을 향상시키기 위해 당신이 할 수있는 한 가지이며, 데이터에 예를 해시를 미리 계산 정렬 인덱스), 다음 제거 중복의보다 효율적인 방법이있다 :

declare function local:nodupes($first, $rest) 
{ 
    if (empty($rest)) then $first 
    else if ($first/@hash eq $rest[1]/@hash) 
    then local:nodupes($rest[1], subsequence($rest,2)) 
    else ($first, local:nodupes($rest[1], subsequence($rest,2))) 
}; 

이 그런 다음 명령 세트를 부르지가 :

let $ordered := 
    for $a in $xml/author 
    order by $a/@hash 
    return $a 
return 
    local:nodupes((),$ordered) 
+1

고유 값에 대한 xpath 표현 – Jayy

관련 문제