2016-05-24 11 views
0

Ich versuche, ein XML-Dokument zu erstellen, um von einer Funktion wie folgt zurückzukehren. Warum funktioniert die Evaluierungssubstitution, wenn ich let verwende, um sie zuerst in einer anderen Variablen zu speichern? Kann ich den Ausdruck nicht bewerten? Wie Sie am Ende des Ergebnisses sehen können, wird das resultierende XML nur mit dem Variablenwert gefüllt, in dem ich ihn in der Variablen $x gespeichert hatte.Ausdruck Auswertung funktioniert nicht

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> 
) 

Ergebnisse in:

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

Ist das das richtige Verhalten?

Antwort

4

Aufbauend auf den Kommentar nach der Antwort, die Sie geschrieben, Sie haben Recht, dass der Namespace in der XPath-Platzhaltern arbeiten:

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

Allerdings ist dies eine schlechte Praxis betrachtet wird, wenn es vermeidbar ist. Um diesen XPath auszuführen, muss MarkLogic mehr Arbeit leisten, als wenn der Namespace bereitgestellt wird. Die Herausforderung besteht darin, dass Ihre Eingabe-XML den leeren Namespace verwendet und es keine Möglichkeit gibt, dies anzugeben. Ich würde die Eingabe ändern, um einen Namespace zu verwenden:

Dies ermöglicht Ihrem XPath, expliziter zu sein. Klein, der Unterschied spielt keine Rolle, aber im Maßstab summiert sich der Unterschied.

2

Ich stimme mit Dave überein, dass die Verwendung eines Namensraums für den Eingang das Leben leichter macht. Nur aus Gründen der Vollständigkeit, können Sie auch das Problem verhindern, indem sie nicht wörtlichen XML mit einem Standard-Namespace verwenden, sondern durch Elementkonstruktoren anstelle: obwohl

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> 
) 

ich in der Regel wörtliche XML bevorzugen, da sie dichter ist/weniger Unordnung ..

HTH!