2016-05-24 18 views
0

以下の関数から返るようにXML文書を構築しようとしています。 letを使用して別の変数に評価置換を保存すると、評価置換はなぜ機能しますか?表現を評価することはできますか?結果の最後に表示されるように、結果のXMLには、変数変数$xに変数値が格納されています。中式の評価が機能しない

declare function local:oim-to-canonical($oimContent as node()) { 
    let $x := $oimContent/account/domain/text() 
    return 
    <person xmlns="http://schemas.abbvienet.com/people-db/model"> 
     <account> 
     <domain>{ $oimContent/account/domain/text() }</domain> 
     <username>{ $oimContent/account/username/text() }</username> 
     <status>{ $oimContent/account/status/text() }</status> 
     <x>{ $x }</x> 
     </account> 
    </person> 
}; 

local:oim-to-canonical(
    <person> 
    <account> 
     <domain>MYDOMAIN</domain> 
     <username>ttt</username> 
     <status>ENABLED</status> 
    </account> 
    </person> 
) 

結果:

<person xmlns="http://schemas.abbvienet.com/people-db/model"> 
    <account> 
    <domain/> 
    <username/> 
    <status/> 
    <x>MYDOMAIN</x> 
    </account> 
</person> 

これは正しい動作ですか?あなたが書いた答えの後にコメント

答えて

4

ビルは、あなたは、XPathで名前空間をワイルドカードが動作することをおっしゃるとおり、それは回避だとき

<domain>{ $oimContent/*:account/*:domain/text() }</domain> 

しかし、これは悪い習慣と考えられています。そのXPathを実行するために、MarkLogicは名前空間が提供される場合よりも多くの作業を行う必要があります。課題は、入力XMLが空の名前空間を使用しており、その名前空間を指定する方法がないことです。入力を変更して名前空間を使用します:

xquery version "1.0-ml"; 
declare namespace inp = "input"; 

declare function local:oim-to-canonical($oimContent as node()) { 
    let $x := $oimContent/inp:account/inp:domain/text() 
    return 
    <person xmlns="http://schemas.abbvienet.com/people-db/model"> 
     <account> 
     <domain>{ $oimContent/inp:account/inp:domain/text() }</domain> 
     <username>{ $oimContent/inp:account/inp:username/text() }</username> 
     <status>{ $oimContent/inp:account/inp:status/text() }</status> 
     <x>{ $x }</x> 
     </account> 
    </person> 
}; 

local:oim-to-canonical(
    <person xmlns="input"> 
    <account> 
     <domain>MYDOMAIN</domain> 
     <username>ttt</username> 
     <status>ENABLED</status> 
    </account> 
    </person> 
) 

これにより、XPathをより明示的にすることができます。小規模であれば、差は問題ではないかもしれませんが、規模ではその差が加算されます。

2

Daveと同意すると、入力に名前空間を使用すると、人生が楽になります。ただ、完全を期すために、あなたはまた、代わりの要素コンストラクタを使用して、デフォルトの名前空間とXMLリテラルを使用しないことで問題を回避することができます

declare variable $ns := "http://schemas.abbvienet.com/people-db/model"; 

declare function local:oim-to-canonical($oimContent as node()) { 
    let $x := $oimContent/account/domain/text() 
    return 
    element { fn:QName($ns, "person") } { 
     element { fn:QName($ns, "account") } { 
     element { fn:QName($ns, "domain") } { $oimContent/account/domain/text() }, 
     element { fn:QName($ns, "username") } { $oimContent/account/username/text() }, 
     element { fn:QName($ns, "status") } { $oimContent/account/status/text() }, 
     element { fn:QName($ns, "x") } { $x } 
     } 
    } 
}; 

local:oim-to-canonical(
    <person> 
    <account> 
     <domain>MYDOMAIN</domain> 
     <username>ttt</username> 
     <status>ENABLED</status> 
    </account> 
    </person> 
) 
それは、より緻密であるように私は通常、しかしXMLリテラルを好む

/

HTH!