2016-03-28 59 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