XQuery:如何在for循环中正确追加

时间:2009-11-16 00:32:34

标签: xquery

所以我有这样的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>

有人可以说明如何做到这一点吗?

4 个答案:

答案 0 :(得分:12)

<PhoneNumberList>
{
    string-join($c//PhoneNumber, ", ")
}
</PhoneNumberList>

答案 1 :(得分:1)

XQuery中的变量似乎有很多混淆。每次计算时,let表达式都会创建一个新变量,因此下面的“程序”方法将无效。

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

declare function local:join-numbers($numbers)
{
  concat($numbers[1], ", ", local:join-numbers(substring($numbers,2)))
};

<PhoneNumberList>
{
  local:joinNumbers($c//PhoneNumber)
}
</PhoneNumberList>

答案 2 :(得分:0)

好的,像这样的东西应该按原样返回第一个元素,其余部分带有前置的“,”

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

答案 3 :(得分:-1)

这个怎么样?

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