2016-03-28 11 views
1

私は下記のXQueryを試してみました。Marklogic - Xqueryで動的変数を割り当てる方法

declare variable $path as xs:string :="D:\Mongo\"; 

    let $uri :="/MJ/1932/Vol1/Part1/387.xml" 
    let $x := fn:normalize-space(fn:replace($uri,"/"," ")) 
    for $i in fn:tokenize($x, " ") 
    let $j := fn:concat($path,$i) 
    return($j) 

実際の出力

D:\Mongo\MJ 
    D:\Mongo\1932 
    D:\Mongo\Vol1 
    D:\Mongo\Part1 
    D:\Mongo\387.xml 

の予想される出力

D:\Mongo\MJ 
D:\Mongo\MJ\1932 
D:\Mongo\MJ\1932\Vol1 
D:\Mongo\MJ\1932\Vol1\Part1 
D:\Mongo\MJ\1932\Vol1\Part1\387.xml 

動的変数の値を変更する方法を、私を提案してください。

答えて

4

XQueryは関数型プログラミング言語であり、変数は不変であることを意味します。単に定義された変数にインクリメントまたは追加することはできません。通常、再帰関数を使用して結果を構築します。

この例(もっと簡潔なものがありますが、個々の部分を分割して分かりやすくしたいと思っています)は、パスを再帰的に作成し、実行するたびに別のレベルを追加します。 $path接頭辞は、別々のタスクを混在させないように別々に追加されます。この特定のケースで

declare variable $path as xs:string :="D:\Mongo\"; 
declare variable $uri as xs:string := "/MJ/1932/Vol1/Part1/387.xml"; 

declare function local:add-path($parts as xs:string*) as xs:string* { 
    let $head := $parts[1] 
    let $tail := $parts[position() > 1] 
    return 
    if ($head) 
    then (
     $head, 
     for $path in local:add-path($tail) 
     return string-join(($head, $path), "\") 
    ) 
    else() 

}; 

for $uri in local:add-path(fn:tokenize(fn:normalize-space(fn:replace($uri,"/"," ")), " ")) 
return concat($path, $uri) 

、代替は、位置カウンタをループになると、この位置までの部分に参加します:

declare variable $path as xs:string :="D:\Mongo\"; 
declare variable $uri as xs:string := "/MJ/1932/Vol1/Part1/387.xml"; 

let $parts := fn:tokenize(fn:normalize-space(fn:replace($uri,"/"," ")), " ") 
for $i in (1 to count($parts)) 
return concat($path, string-join($parts[position() <= $i], '\')) 
+0

おかげイェンスERAT、その作業罰金。 – Antony

関連する問題