XQuery: как правильно добавить, в for loop

Итак, у меня есть 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 ответов


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

в XQuery, похоже, много путаницы с переменными. Выражение let создает новую переменную каждый раз, когда она оценивается, поэтому "процедурные" подходы ниже не будут работать.

хотя решение для соединения строк является лучшим в вашем случае, правильный способ написать это "вручную" - с рекурсивной функцией:

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

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

Ok, что-то вроде этого должно возвращать первый элемент как есть, а остальные с добавлением","

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

Как насчет этого?

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