9

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

4 回答 4

13
<PhoneNumberList>
{
    string-join($c//PhoneNumber, ", ")
}
</PhoneNumberList>
于 2009-11-16T12:32:57.253 回答
1

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

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

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

<PhoneNumberList>
{
  local:joinNumbers($c//PhoneNumber)
}
</PhoneNumberList>
于 2009-11-23T22:36:05.617 回答
0

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

<PhoneNumberList>
{
  for $phone in $c//PhoneNumber[0]
  return $phone
  for $phone in $c//PhoneNumber[position()>0]
  return concat(", ", $phone)
}
</PhoneNumberList>
于 2009-11-16T01:05:22.657 回答
-1

那这个呢?

let $phoneStr := ""
<PhoneNumberList>
{
  for $phone in $c//PhoneNumber
  let $result = concat($phoneStr, $phone)
  let $phoneStr = ", "
  return $result 
}
</PhoneNumberList>
于 2009-11-16T00:41:50.170 回答