0

ドキュメント uri (/employee/*.xml) を使用して複数の従業員 xml ドキュメントを ML DB に保存しています。一意の参照キーが roleID である新しい XML から更新を取得したいと考えています (ML XML ではその roleID であり、新しい XML では newroleID です)。 )。一致が見つかった場合は常に、ML xml の firstName 値を新しい XMl の newFirstName で更新し、lastname 値を newlastName で更新し、dep を新しい dep で更新し、残りの xml 構造は同じままにする必要があります。

Marklogic XML 構造は次のとおりです。

    doc uri /employee/1.xml
    <employee>
        <firstName>Jim</firstName>
        <lastName>Day</lastName>
        <dep>IT</dep>
        <city>Boston</city>
        <roleID>1111<roleID>
        <internalID>2222</internalID>
    </employee>

    doc uri /employee/2.xml
    <employee>
        <firstName>Jan</firstName>
        <lastName>Silly</lastName>
        <dep>Finance</dep>
        <city>DC</city>
        <roleID>3333<roleID>
        <internalID>4444</internalID>
    </employee>

    doc uri /employee/3.xml
    <employee>
        <firstName>Jack</firstName>
        <lastName>John</lastName>
        <dep>HR</dep>
        <city>Virginia</city>
        <roleID>5555<roleID>
        <internalID>6666</internalID>
    </employee>

これを試していますが、ドキュメントを更新する方法がわかりません。また、最適化された xquery のようです。助けてください。

    let $newXML := <employees>
                        <newemployee>
                            <NewfirstName>New Fname1</newfirstName>
                            <newlastName>New Lname1</newlastName>
                            <newdep>New Dep1</newdep>
                            <newcity>Boston</newcity>
                            <newroleID>1111<newroleID>
                            <internalID>2222</internalID>
                        </newemployee>
                        <newemployee>
                            <newfirstName>New Fname2</newfirstName>
                            <newlastName>New Lname</newlastName>
                            <newdep>New Dep</newdep>
                            <newcity>Boston</newcity>
                            <newroleID>5555<newroleID>
                            <newinternalID>6666</newinternalID>
                        </employee>
                    </employees>
    for $oldXML in doc("/employee/*.xml")/employee
        where $newXML/newemployee/newroleID eq $oldXML/roleID
        return
          for $Matched in $oldXML
            return
            let $finalXML := 
                (: Not sure how to update some nodes in given URI, where rest of structure remain same :)

                <employee>
                    <firstName>{$newXML/newemployee/newfirstName/text()}</firstName>
                    <lastName>{$newXML/newemployee/newlastName/text()}</lastName>
                    <dep>{$newXML/newemployee/newdep/text()}</dep>              
                </employee>
4

2 に答える 2

3

xdmp:node-replaceを参照してください

ドキュメントの例から:

(: insert the doc :)
xdmp:document-insert("/example.xml", <a><b>bbb</b></a>);
(: replace the b node in the doc with this c node :)
xdmp:node-replace(doc("/example.xml")/a/b, <c>ccc</c>);
doc("/example.xml") => <a><c>ccc</c></a>
于 2012-08-01T19:55:06.300 に答える
1

表現がうまくいきdoc("/employee/*.xml")ません。xdmp:directoryディレクトリが(自動または手動で)作成されている場合は、wouldを使用します。または、従業員の URI を検索するために使用でき、URI レキシコンが有効になっている場合cts:uri-matchは、それらを に一撃で渡すことができます。doc()

しかし..あなたのアプローチの最大のボトルネックは、すべてのドキュメントを見て回ることです。それは必要ありません。roleID が一意の場合は、それを uri に使用します。そのため、すべてのドキュメントを確認する必要はありません。正しいドキュメントをすぐに開いてください。または、XQuery プロセッサによって最適化できる式を使用するか、単にインデックスに依存する式を使用します。次のようなもの:

doc()[//roleID = $newRoleID]

または:

cts:search(doc(), cts:element-value-query(xs:QName("roleID"), $newRoleID))

更新自体についてはxdmp:node-replace、@sgarrett の提案に従って and related を使用できますが、単純に XML 全体を再作成し、 xdmp:document-insert を使用して完全に置き換えることもできます。いずれにせよ、ドキュメントは完全に裏で置き換えられるため、そのような小さなドキュメントとの違いはほとんどわかりません。

チッ!

于 2012-08-01T20:23:30.903 に答える