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

发布于 2024-08-11 09:32:20 字数 599 浏览 1 评论 0原文

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

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

So I have xml data like this:

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

and with this XQuery:

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

I get:

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

But I actually want:

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

Could someone shed some light on how to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

梦纸 2024-08-18 09:32:20
<PhoneNumberList>
{
    string-join($c//PhoneNumber, ", ")
}
</PhoneNumberList>
<PhoneNumberList>
{
    string-join($c//PhoneNumber, ", ")
}
</PhoneNumberList>
哆啦不做梦 2024-08-18 09:32:20

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

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

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

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

There seems to be a lot of confusion with variables in XQuery. A let expression creates a new variable each time it is evaluated, so the "procedural" approaches below will not work.

Whilst the string-join solution is the best in your case, the correct way to write this "manually" is with a recursive function:

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

<PhoneNumberList>
{
  local:joinNumbers($c//PhoneNumber)
}
</PhoneNumberList>
z祗昰~ 2024-08-18 09:32:20

好的,像这样的东西应该按原样返回第一个元素,其余元素前面加上“,”

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

Ok, something like this should return the first element as-is and the rest with prepended ", "

<PhoneNumberList>
{
  for $phone in $c//PhoneNumber[0]
  return $phone
  for $phone in $c//PhoneNumber[position()>0]
  return concat(", ", $phone)
}
</PhoneNumberList>
渡你暖光 2024-08-18 09:32:20

这又如何呢?

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

What about this?

let $phoneStr := ""
<PhoneNumberList>
{
  for $phone in $c//PhoneNumber
  let $result = concat($phoneStr, $phone)
  let $phoneStr = ", "
  return $result 
}
</PhoneNumberList>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文