eXist DB에서 세 번째 유형의 요소를 쿼리하는 데 사용하는 두 개의 요소 목록이 있습니다.목록에있는 노드에 elemens를 어떻게 추가 할 수 있습니까?
let $aList1 := for $elementB in $elementListB return //ElementA[ft:query(@referenceB, $elementB/@id)]
let $aList2 := for $elementC in $elementListC return //ElementA[ft:query(@referenceC, $elementC/@id)]
let $results := $aList1 intersect $aList2
건이며, 내가 필요로하는 기능이있다 : 만 두 쿼리에 의해 발견되어 그 결과를 원하기 때문에하지만 그 두 개의 하위 결과의 교집합을 (즉, 초기 매개 변수의 두 가지를 만족) 시작 목록의 각 요소를 호출하여 몇 가지 추가 정보를 얻을 수 있습니다. 일반적으로 나는 같은 것을 할 것입니다 :
let $aList1 := for $elementB in $elementListB
let $additionalInfo := additionalInfoFunction($elementB)
return
<wrapper>
<additionalInfo>{$additionalInfo}</additionalInfo>
{
//ElementA[ft:query(@referenceB, $elementB/@id)]
}
</wrapper>
을 그러나, 나는이 작업을 수행하는 경우 교차 참조하지 값으로 작동하기 때문에 나는 $aList1
과 $aList2
의 교차점을 수행 할 수 없습니다.
내가 이런 교차로 후 additionalInfoFunction
를 호출 생각 :
return for $result in $results
let $elementB := $elementListB[@id = $result/@referenceB]
let $additionalInfo := additionalInfoFunction($elementB)
return
<wrapper>
<additionalInfo>{$additionalInfo}</additionalInfo>
{
BLA BLA
}
</wrapper>
그러나 여기에서 문제는 $elementListB
및 $elementListC
단지 몇 요소를 포함하면서, $results
이 문제가 additionalInfoFunction
이기 때문에입니다 수백을 포함 할 수 있다는 것입니다 상대적으로 비싸다.
여기서 볼 수없는 영리한 해결 방법이 있습니까?
당신이 묘사하는 문제는 제가 의미했던 것입니다. 어쩌면 충분히 명확하지 않을 수도 있습니다. 어쨌든, 당신의 솔루션은 효과가 있습니다. 감사합니다. 정기적 인 교차로와 비교하여이 접근법의 성능에 대한 아이디어는 있습니까? – pajevic
'deep-equal'은 단순히 참조를 비교하는 것보다 훨씬 복잡합니다. 또한 해석 된 XQuery에서 루프를 수행하는 것은 구현의 모국어로 쓰여진 'intersects'보다 느릴 수 있습니다. 현재 실행중인 eXist 인스턴스가 없습니다. 벤치마킹을한다면 공유하십시오.;) –
실제로, 모든 요소는 고유 한 ID를 가지고 있으므로, 나는 똑같은 값을 대신하는 대신에 그들을 비교할 수 있습니다 :'return $ a [$ b/$ id /. id]를 만족하는 일부 $ e $ – pajevic