2016-05-24 88 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!