【问题标题】:Use output (returned value) of xquery function in same function在同一函数中使用 xquery 函数的输出(返回值)
【发布时间】:2015-04-13 16:03:47
【问题描述】:

我是 xquery 的新手,在这方面寻求您的快速帮助。非常感谢您调查我的问题。

我有一个要求,我需要用给定字符串中的实际值替换多个占位符,我尝试使用下面的 XQuery 函数来实现。

这个函数的问题是每次我得到一个单独的字符串时它都会替换所有占位符,例如for 循环的第一次执行替换了第一个占位符,第二次迭代替换了第二个占位符(但对于实际的输入字符串),我正在寻找一个解决方案,我可以将第一次迭代传递给第二次迭代的输入。

XQuery:

declare function functx:replace-place-holders-with-values (
  $MainString as xs:string? ,    
  $MappingList as node(), 
  $ActualValueList as node() )  as xs:string* 
  {
    let $MessageList:= 
      for $BalMapping at $counter
      in $MappingList//map:GetUSSDBalanceMappingRow
      let $BalanceBucket := $ActualValueList//bal:BalanceItems
        /bal:BalanceItem/bal:SubBalanceList
        /bal:SubBalanceItem
        [bal:SubBalanceType/text() = 
        $BalMapping//map:BalanceParamaterFlag/text()]
      return <MessageList>
      {
         replace($BalanceString ,
           ($BalMapping/map:BalanceParameter/text()),
            concat(
              $BalanceBucket/bal:SubBalanceValue/text(),
              '  ',
              $BalanceBucket/bal:SubBalanceUnit/text()))
      }
      </MessageList>    
      return $MessageList/text() 
  };

例如

输入字符串:

Your Total Balance is #BAL#, Saving Bal #SAV_BAL#, FD Balance #FD_BAL#, for more details loging to example.com

输出显示:

Your Total Balance is 205, Saving Bal #SAV_BAL#, FD Balance #FD_BAL#, for more details loging to example.com
Your Total Balance is #BAL#, Saving Bal 105, FD Balance #FD_BAL#, for more details loging to example.com
Your Total Balance is #BAL#, Saving Bal #SAV_BAL#, FD Balance 100, for more details loging to example.com

预期结果:

Your Total Balance is 205, Saving Bal 105, FD Balance 100, for more details loging to example.com

我很乐意提供更多详细信息,如果您需要更多详细信息,请告诉我。 如果您有任何其他使用 XQuery/XSLT 实现此目的的解决方案,请随意忽略上述查询。

期待很快收到回复。

【问题讨论】:

  • 欢迎来到 SO,我更改了您的代码布局以使其可读,如果您在此处发布问题,如果从一开始就这样做,将有助于快速获得答案;)
  • 感谢亚伯的帮助。

标签: function xslt xquery


【解决方案1】:

你需要使用递归。像这样的:

declare function local:r($in s xs:string, $markers as xs:string*, $replacements as xs:string*) {
 if (empty($markers)) 
 then $in
 else local:r(replace($in, head($markers), head($replacements)),
         tail($markers), tail($replacements))
}

(head 和 tail 是 XQ30 的函数,在 XQ10 中自己实现它们分别为 $seq[1] 和 remove($seq, 1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2013-03-01
    • 2021-07-09
    相关资源
    最近更新 更多