Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Marklogic-如何在Xquery中分配动态变量_Xquery_Marklogic_Marklogic 8 - Fatal编程技术网

Marklogic-如何在Xquery中分配动态变量

Marklogic-如何在Xquery中分配动态变量,xquery,marklogic,marklogic-8,Xquery,Marklogic,Marklogic 8,我尝试了下面提到的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) retu

我尝试了下面提到的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
预期产出

    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

请告诉我如何更改动态变量值。

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], '\'))
将变量$path声明为xs:string:=“D:\Mongo\”;
将变量$uri声明为xs:string:=“/MJ/1932/Vol1/Part1/387.xml”;
让$parts:=fn:tokenize(fn:normalize space(fn:replace($uri,“/”,“”)),“”)
对于$i in(1计算($parts))

返回concat($path,string join($parts[position()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], '\'))
将变量$path声明为xs:string:=“D:\Mongo\”;
将变量$uri声明为xs:string:=“/MJ/1932/Vol1/Part1/387.xml”;
让$parts:=fn:tokenize(fn:normalize space(fn:replace($uri,“/”,“”)),“”)
对于$i in(1计算($parts))
返回concat($path,string join($parts[position())