Пустые результаты при фильтрации по позиции в XQuery

Я пытался напечатать детали 3-го и 4-го продуктов в каталоге, но я получаю пустые результаты.

XML вход:

<catalog>
  <product dept="WMN">
    <number>557</number>
    <name language="en">Fleece Pullover</name>
    <colorChoices>navy black</colorChoices>
  </product>
  <product dept="ACC">
    <number>563</number>
    <name language="en">Floppy Sun Hat</name>
  </product>
  <product dept="ACC">
    <number>443</number>
    <name language="en">Deluxe Travel Bag</name>
  </product>
  <product dept="MEN">
    <number>784</number>
    <name language="en">Cotton Dress Shirt</name>
    <colorChoices>white gray</colorChoices>
    <desc>Our <i>favorite</i> shirt!</desc>
  </product>
</catalog>

что я пробовал:

SELECT xDoc.query('  for $prod in //product
let $x:=$prod
return (<Item>{data($x[3])}{data($x[4])}</Item>)') 
FROM  AdminDocs
where  id=6

Выводится вывод:

<Item />
<Item />
<Item />
<Item />

1 ответ

Решение

Это определяет цикл по всем продуктам:

for $prod in //product

Для каждого из этих продуктов вы возвращаете третий и четвертый узел из последовательности одного продукта, что, очевидно, приведет к пустым узлам:

let $x:=$prod
return (<Item>{data($x[3])}{data($x[4])}</Item>)

Для лучшего понимания каждый раз возвращайте весь узел продукта:

for $prod in //product
return <item>{ $prod }</item>

Что приведет к чему-то вроде этого:

<item>
  <product dept="WMN">
    <number>557</number>
    <name language="en">Fleece Pullover</name>
    <colorChoices>navy black</colorChoices>
  </product>
</item>
<item>
  <product dept="ACC">
    <number>563</number>
    <name language="en">Floppy Sun Hat</name>
  </product>
</item>
<item>
  <product dept="ACC">
    <number>443</number>
    <name language="en">Deluxe Travel Bag</name>
  </product>
</item>
<item>
  <product dept="MEN">
    <number>784</number>
    <name language="en">Cotton Dress Shirt</name>
    <colorChoices>white gray</colorChoices>
    <desc>Our <i>favorite</i> shirt!</desc>
  </product>
</item>

И каждый из них <product/> элементы, являющиеся $prod[1], Пытаться:

for $prod in //product
return <item>{ $prod[1] }</item>

который вернет точно такой же результат, по сравнению с

for $prod in //product
return <item>{ $prod[2] }</item>

(или любой другой позиционный предикат), приводящий к пустому <item/> узлы.

Наконец, чтобы вернуть только третий и четвертый продукты, сдвиньте позиционный предикат в for Аргумент цикла:

for $prod in //product[position() = 3 or position() = 4]
return <item>{ $prod }</item>

(и применить data(...) по мере необходимости, но я думаю, что это не даст результатов, которые вы ожидаете здесь).

Другие вопросы по тегам