【问题标题】:XQuery: how to properly append , in for loopXQuery:如何在 for 循环中正确追加
【发布时间】:2010-12-16 21:42:31
【问题描述】:

所以我有这样的xml数据:

  <PhoneNumber>213-512-7457</PhoneNumber>
  <PhoneNumber>213-512-7465</PhoneNumber>

使用这个 XQuery:

<PhoneNumberList>
{
  for $phone in $c//PhoneNumber
  let $phoneStr := ""
  return concat($phoneStr, $phone) 
}
</PhoneNumberList>

我明白了:

<PhoneNumberList>213-512-7457213-512-7465</PhoneNumberList>

但我真的想要:

<PhoneNumberList>213-512-7457, 213-512-7465</PhoneNumberList>

有人能解释一下如何做到这一点吗?

【问题讨论】:

    标签: xquery


    【解决方案1】:
    <PhoneNumberList>
    {
        string-join($c//PhoneNumber, ", ")
    }
    </PhoneNumberList>
    

    【讨论】:

      【解决方案2】:

      XQuery 中的变量似乎有很多混淆。 let 表达式每次求值时都会创建一个新变量,因此下面的“过程”方法将不起作用。

      虽然字符串连接解决方​​案在您的情况下是最好的,但“手动”编写此方法的正确方法是使用递归函数:

      declare function local:join-numbers($numbers)
      {
        concat($numbers[1], ", ", local:join-numbers(substring($numbers,2)))
      };
      
      <PhoneNumberList>
      {
        local:joinNumbers($c//PhoneNumber)
      }
      </PhoneNumberList>
      

      【讨论】:

        【解决方案3】:

        好的,这样的事情应该返回第一个元素,其余的都带有前置“,”

        <PhoneNumberList>
        {
          for $phone in $c//PhoneNumber[0]
          return $phone
          for $phone in $c//PhoneNumber[position()>0]
          return concat(", ", $phone)
        }
        </PhoneNumberList>
        

        【讨论】:

        • 您需要在两个 flwor 表达式之间添加一个 ,,因为这些是值,所以会自动插入一个空格。让这些 flwor 表达式返回文本节点,你就应该在那里,虽然它不是一个特别明确的解决方案。
        【解决方案4】:

        这个怎么样?

        let $phoneStr := ""
        <PhoneNumberList>
        {
          for $phone in $c//PhoneNumber
          let $result = concat($phoneStr, $phone)
          let $phoneStr = ", "
          return $result 
        }
        </PhoneNumberList>
        

        【讨论】:

        • 我尝试运行它,但它仍然没有添加 , ...多么奇怪。
        • 是的,我忘了 XQuery 中的变量不能修改。
        猜你喜欢
        • 1970-01-01
        • 2018-10-04
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-03
        • 1970-01-01
        相关资源
        最近更新 更多