2016-03-28 21 views
1

Aşağıda belirtilen XQuery'yi denedim. dinamik değişken değerini değiştirmeMarklogic - Xquery'de dinamik değişken nasıl atanır?

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) 

Fiili çıkış

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

Beklenen çıkış

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 

beni öner Lütfen.

cevap

4

XQuery, değişkenlerin değişmez olduğunu ima eden işlevsel bir programlama dilidir. Tanımlanmış bir değişkeni basitçe artıramaz veya ekleyemezsiniz. Genellikle, sonucu oluşturmak için bir özyinelemeli işlev kullanılır.

Bu örnekler (daha özlü olanlar var, her bir parçayı parçalara ayırarak ayırmak istedim ve anlaması basit), her seferinde her seferinde başka bir seviyeye ekleyerek yolu yinelemeli olarak oluşturur. Farklı görevleri karıştırmamak için $path öneki ayrı olarak eklenir. Bu özel durumda

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) 

, alternatif bir pozisyon reçetesiz döngü olacaktır ve bu pozisyona parçaları katılmak:

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

Teşekkür Jens Erat, Onun iyi çalışıyor. – Antony