XQuery: как правильно добавить цикл for - PullRequest
7 голосов
/ 16 ноября 2009

Таким образом, у меня есть данные 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 ]

12 голосов
/ 16 ноября 2009
<PhoneNumberList>
{
    string-join($c//PhoneNumber, ", ")
}
</PhoneNumberList>
1 голос
/ 24 ноября 2009

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

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

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

<PhoneNumberList>
{
  local:joinNumbers($c//PhoneNumber)
}
</PhoneNumberList>
0 голосов
/ 16 ноября 2009

Хорошо, что-то вроде этого должно вернуть первый элемент, как есть, а остальные с префиксом ","

<PhoneNumberList>
{
  for $phone in $c//PhoneNumber[0]
  return $phone
  for $phone in $c//PhoneNumber[position()>0]
  return concat(", ", $phone)
}
</PhoneNumberList>
0 голосов
/ 16 ноября 2009

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

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