뚜렷한 노드를 얻는 문제는 두 노드가 뚜렷한 지 결정하는 것입니다. 이것은 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)
출처
2012-10-02 16:27:41
wst
고유 값에 대한 xpath 표현 – Jayy