2013-05-11 3 views
-2

노드 시퀀스에 함수 distinct-values()을 적용하면 일련의 노드가 아닌 일련의 값이 반환됩니다.XQuery에서 별개의 노드를 가져 오는 방법은 무엇입니까?

XQuery 데이터 모델의 어떤 기능을 사용하여 일련의 노드에서 중복 값을 직접 제거하기가 어렵습니까?

또한이 일련의 값을 노드 시퀀스로 되돌릴 수 있습니까?

나는 XML/XQuery 노트를 조사하고 명시적인 정보를 찾지 않고 인터넷을 검색했습니다.

답변

4

XQuery에서 모든 노드는 고유합니다 (내부 고유 노드 ID가 있음).


노드를 비교하려면 해당 값을 자세히 비교해야합니다. 이에 대한 사전 정의 된 기능은 없지만 일반적인 문제이므로 FunctXfunctx:distinct-deep() 중 하나가 포함되어 있습니다. 그것은 functx:is-node-in-sequence-deep-equal()에 대한 의존성을 가지고 있으므로, 당신도 그것을 필요로 할 것입니다.

declare namespace functx = "http://www.functx.com"; 
declare function functx:distinct-deep 
    ($nodes as node()*) as node()* { 

    for $seq in (1 to count($nodes)) 
    return $nodes[$seq][not(functx:is-node-in-sequence-deep-equal(
          .,$nodes[position() < $seq]))] 
} ; 
declare function functx:is-node-in-sequence-deep-equal 
    ($node as node()? , 
    $seq as node()*) as xs:boolean { 

    some $nodeInSeq in $seq satisfies deep-equal($nodeInSeq,$node) 
} ; 

은 또는 당신 import the whole FunctX module을 할 수있다, 그러나 이것은 당신의 XQuery를 인터프리터에 따라 실행 많이 느려질 수 있습니다.


당신이 FunctX을 고수하지 않으려면

, 당신은 모든 고유 값을 검색해야하고 각각 첫 번째 요소 (그래서 어느 한 사람이없는 사람)를 발견하고 서로 다른 값으로 data()을 비교합니다. 결국

for $value in distinct-values(//data()) 
return //*[data() = $value][every $preceding in preceding::node() satisfies name() != $preceding/name()] 

, 이것은 FunctX-기능 위에서처럼 동일한한다. 일부 부분에는 다른 구문을 사용할 수 있지만 이러한 단계는 생략하지 마십시오.

+0

안녕하세요. Jen! 회신 해 주셔서 감사합니다. 그냥 확인하십시오 : 모든 노드는 아무렇게나 구분되므로 distinct-value 함수를 적용하는 것은 문제가 있습니다. 노드를 비교하여 노드가 고유한지 또는 고유한지 여부를 확인해야하지만 XQuery에서이를 수행 할 미리 정의 된 기능은 없습니다. 일련의 값을 노드 시퀀스로 되돌릴 수있는 방법을 명확하게 설명해주십시오. 감사합니다 M – MafioSol

+1

_real_ 질문에 대해 알려주십시오. 나는 당신이 해결해야만하는 문제가 뚜렷한 노드를 얻는 것이라고 생각하지 않지만 이것을 필요로하는 것입니다. 입력과 예상 결과를 제공하면 문제를 훨씬 쉽게 이해할 수 있습니다. 질문을 편집하십시오. SSCCE 제공 방법 (http://sscce.org/)도 읽어보십시오. 당신이 더 구체적 일수록, 당신이 원하는 답을 정확하게 얻을 수있는 가능성이 높고 빠릅니다. –

+0

다시 Jens! 내 진짜 질문은 다음과 같습니다 : 첫째, 함수 distinct-values를 노드 시퀀스에 적용 할 때 노드 시퀀스가 ​​아닌 일련의 값을 반환합니다. XQuery 데이터 모델의 어떤 기능이 노드 시퀀스에서 직접 중복 값을 직접 제거하는 것을 어렵게하는지 간략하게 설명하십시오. 둘째로, 어떻게이 값들의 연속을 노드의 순서로 되돌릴 수 있습니까? 감사합니다. – MafioSol

관련 문제