XQuery — выполнить операцию замены/сопоставления строки

#if-statement #replace #match #xquery

Вопрос:

У меня есть строка, скажем, 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 .

Есть какие-нибудь идеи, пожалуйста?

Ответ №1:

Вы можете попробовать объединить then буквы s, чтобы

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

Это приведет к ожидаемому результату, по крайней мере, для строки в вашем вопросе.

Комментарии:

1. и этот ответ, и ответ @Michaelkay делают то, что я искал.

Ответ №2:

Попробуй:

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