繁体   English   中英

fn:replace在迭代时返回一个字符串

[英]fn:replace to return one string on iteration

我希望通过使用映射的键和值对来实现文档中的字符串查找和替换。 由于2个映射值,我目前拥有的代码似乎返回2个字符串。 我希望返回一个字符串,其中大括号中的值将替换为映射中的值。

let $text:='On ${date} the value of alert is ${alerts}'
    let $params:= map:map()
    let $noop:=map:put($params,'date','TESTINGDATE')
    let $noop:=map:put($params,'alerts','TESTALERT')


    let $formatted-message:=for $keys in map:keys($params)
                            let $message:=fn:replace($text,fn:concat('\$\{',$keys,'\}'),map:get($params,$keys))
                            return $message

    return $formatted-message

你可以使用递归函数:

declare function local:replace-all($text, $key, $rest, $params) 
{
  if (fn:empty($key)) then
    $text
  else
    local:replace-all(fn:replace($text, fn:concat('\$\{',$key,'\}'), map:get($params,$key)), 
                      fn:head($rest), 
                      fn:tail($rest), 
                      $params)

};

let $text:='On ${date} the value of alert is ${alerts}'
let $params:= map:map()
let $noop:=map:put($params,'date','TESTINGDATE')
let $noop:=map:put($params,'alerts','TESTALERT')
let $keys := map:keys($params)
return
  local:replace-all($text, fn:head($keys), fn:tail($keys), $params)

或者你可以使用fn:fold-left()

let $text:='On ${date} the value of alert is ${alerts}'
let $params:= map:map()
let $noop:=map:put($params,'date','TESTINGDATE')
let $noop:=map:put($params,'alerts','TESTALERT')
let $keys := map:keys($params)
return
  fn:fold-left(
    function($text, $keys) {
      let $key := fn:head($keys)
      return 
        fn:replace($text, fn:concat('\$\{',$key,'\}'), map:get($params,$key))
    },
    $text,
    $keys
  )

两者都产生:

On TESTINGDATE the value of alert is TESTALERT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM