Построение последовательности узлов

#xquery

#xquery

Вопрос:

Есть ли более простой способ сделать это

 <Elements>
{
    for $i in ("a", "b", "c")
    return <Element name="{$i}"/>
}
</Elements>
  

в xquery?

Комментарии:

1. Я тоже не понимаю этот вопрос (см. Ответ Оливера ниже). Запрос, который вы нам предоставили, достаточно прост и отлично работает для любой последовательности. Вероятно, вам следует предоставить нам более подробную информацию о вашем реальном варианте использования.

2. @Scheklein Я подумал, что, возможно, такой запрос можно написать без использования FLOWR. Возможно, с помощью какой-то однострочной строки, подобной показанной пользователем 457056.

Ответ №1:

Вы можете использовать fn:map() поддерживает ли ваш процессор XQuery XQuery 3.0:

fn:map(функция($e){ <Имя элемента=»{$e}» /> }, $sequence)

Комментарии:

1. Это интересно. Но, насколько я вижу, XQuery 3.0 находится только на стадии предварительного просмотра.

Ответ №2:

Я не совсем понимаю ваш вопрос. Что вы подразумеваете под «проще»?

Как насчет:

 <Elements>
  <Element name="a" />
  <Element name="b" />
  <Element name="c" />
</Elements>
  

Комментарии:

1. Под «проще» я подразумеваю меньше кода. Я просто использовал abc-последовательность в качестве примера. Последовательность может содержать гораздо больше элементов.

Ответ №3:

Мне также интересно, что вы подразумеваете под «проще».

Имейте все элементы в переменной $seq и используйте:

 for $i in 1 to count($seq)
 return <Element name="{$seq[$i]}"/>
  

Вот целая программа XQuery:

    let $seq := 1 to 15
    return
        for $i in 1 to count($seq)
          return <Element name="a{$seq[$i]}"/>
  

и это выдает правильный, желаемый результат:

 <Element name="a1"/>
<Element name="a2"/>
<Element name="a3"/>
<Element name="a4"/>
<Element name="a5"/>
<Element name="a6"/>
<Element name="a7"/>
<Element name="a8"/>
<Element name="a9"/>
<Element name="a10"/>
<Element name="a11"/>
<Element name="a12"/>
<Element name="a13"/>
<Element name="a14"/>
<Element name="a15"/>