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 ответов
в 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>