Пустые результаты при фильтрации по позиции в 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(...)
по мере необходимости, но я думаю, что это не даст результатов, которые вы ожидаете здесь).