Marklogic 如何在XQuery中重复函数调用?

Marklogic 如何在XQuery中重复函数调用?,marklogic,Marklogic,在本例中,我有一个字符串$text,我想调用它四次fn:replace,以获得结果“zyxw” 相反,我得到了序列: ("zbcd", "aycd", "abxd", "abcw") 我明白为什么会这样。我只是不知道如何完成我在XQuery中要做的事情。我想要的JavaScript等价物是: 'use strict'; let text = "abcd"; let patterns = [&qu

在本例中,我有一个字符串
$text
,我想调用它四次
fn:replace
,以获得结果
“zyxw”

相反,我得到了序列:

("zbcd", "aycd", "abxd", "abcw")
我明白为什么会这样。我只是不知道如何完成我在XQuery中要做的事情。我想要的JavaScript等价物是:

'use strict';
let text = "abcd";
let patterns = ["a", "b", "c", "d"];
let replaces = ["z", "y", "x", "w"];
for(let i = 0, len = patterns.length; i < len; ++i){
  text = fn.replace(text, patterns[i], replaces[i]);
}
text
“严格使用”;
让text=“abcd”;
让模式=[“a”、“b”、“c”、“d”];
让我们替换=[“z”,“y”,“x”,“w”];
for(设i=0,len=patterns.length;i
尝试另一种方法:

for $i in (1 to fn:string-length($text))  
  let $target := substring($text,$i,1)
  let $fin := $replaces[index-of($patterns, $target) ]
return
concat($fin,"")
输出应为:

z y x w

这也适用于
$text
$patterns
顺序不同的情况;例如,XQuery中最自然的解决方案是使用递归:

declare function local:recurse($text, $patterns, $replaces) {
  let $text := fn:replace($text, fn:head($patterns), fn:head($replaces))
  let $remainder := fn:tail($patterns)
  return
    if (fn:exists($remainder)) then
      local:recurse($text, $remainder, fn:tail($replaces))
    else
      $text
};

let $text := "abcd"
let $patterns := ("a", "b", "c", "d")
let $replaces := ("z", "y", "x", "w")
return local:recurse($text, $patterns, $replaces)

是的,正如grtjn所建议的,递归是一种合法的方法。另一种方式,我只是在代码中做了一些小的调整,以获得所需的输出。试试这个-

let $text := "abcd"
let $patterns := ("a", "b", "c", "d")
let $replaces := ("z", "y", "x", "w")
let $replace-op :=
  for $i in (1 to fn:count($patterns))
  let $p := $patterns[$i]
  let $r := $replaces[$i]
  let $new-text := fn:replace($text, $p, $r)
  return xdmp:set($text, $new-text)
return $text
我建议,如果$pattern和$replaces变量很大,那么使用适当的映射技术来绑定它们

let $text := "abcd"
let $patterns := ("a", "b", "c", "d")
let $replaces := ("z", "y", "x", "w")
let $replace-op :=
  for $i in (1 to fn:count($patterns))
  let $p := $patterns[$i]
  let $r := $replaces[$i]
  let $new-text := fn:replace($text, $p, $r)
  return xdmp:set($text, $new-text)
return $text