XQuery - 对字符串执行 replace/match 操作

XQuery - perform replace/match operation on string

我有一个字符串,比方说,let $baseString := "stringToReplace-Rem-aining-String"。我要运行条件测试 检查 $baseString 是否包含 "stringToReplace""-"if (fn:substring($baseString,1,15) = 'stringToReplace' and fn:matches($baseString, "(([-])+)")), 如果是这样,我想将 'stringToReplace' 替换为 'replacedString',并将 "-" 替换为 ""(空白),因此,输出字符串应为 replacedStringRemainingString。 我怎样才能在 xQuery 中实现这一点?

到目前为止,我有以下 2 个单独的代码块在工作 - 但我需要以某种方式将这 2 个组合在一起。而且我真的不明白我在这里使用 for 循环的原因,但这就是我让这个代码块无误地执行的方式。

let $baseString := "stringToReplace-Rem-aining-String"
for $x in $baseString return
if (fn:substring($baseString,1,15) = 'stringToReplace' and fn:matches($baseString, "(([-])+)")) 
then (fn:concat('replacedString',fn:substring($baseString,16,40))) 
 else ($baseString) 

这给出了结果 replacedString-Rem-aining-String

let $baseString := "stringToReplace-Rem-aining-String"
for $x in $baseString return
if (fn:substring($baseString,1,15) = 'stringToReplace' and fn:matches($baseString, "(([-])+)")) 
then (fn:replace($baseString, "(([-])+)", ""))
 else ($baseString)

这给出了 stringToReplaceRemainingString 的结果。

有什么想法吗?

您可以尝试将 then 组合到

then (
  let $tmp := fn:concat('replacedString',fn:substring($baseString,16,40))
  return fn:replace($tmp, "(([-])+)", "") 
) 

这至少会得到您问题中字符串的预期输出。

尝试:

let $baseString := 'stringToReplace-Rem-aining-String'
return
if (matches($baseString, '^stringToReplace.*-'))  
then ('replacedString' || translate(substring($baseString, 16), '-', ''))
else $baseString