1

3 番目のタイプの要素 (eXist DB 内) を照会するために使用する要素のリストが 2 つあります。しかし、両方のクエリで見つかった結果のみが必要なので (つまり、初期パラメーターの 2 つのセットを満たす)、これら 2 つのサブ結果の交差を行います。

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>

ただし、これを行うと、交差は値ではなく参照で機能するため、 $aList1andの交差を実行できなくなり$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$resultsadditionalInfoFunction

ここに私が見ることができない巧妙な回避策はありますか?

4

1 に答える 1

0

XQuery は、不変変数を持つ関数型言語であるため、副作用がありません。

ただし、これを行う と、交差は値ではなく参照で機能するため、 $aList1andの交差を実行できなくなり$aList2ます。

関数や演算子intersectsが参照を返すかどうかは、実装にのみ関連します (参照はより高速になる可能性があります) が、すべての値は不変であるため、これが問題になることはありません。


実際の問題は関連していますが、似ていません。intersectsdeep-equal は実行せず、内部の「ノード ID」(または必要に応じて参照) のみを調べます。同じコンテンツを含む 2 つの要素を作成すると、異なるノードが作成されるためintersect、結果は返されません。

独自の交差を作成する必要がありますが、これはそれほど難しくありません。

let $a := (<a><a1/><a2/></a>, <b><b1/><b2/></b>),
    $b := (<a><a1/><a2/></a>, <c><c1/><c2/></c>)

return $a[
  some $e in $b
  satisfies deep-equal(., $e)
]

これは、 からの要素と深く等しい$a要素があるすべての要素を返します。$b$a

于 2013-01-13T20:28:22.670 に答える