根据 XQuery 中的位置过滤时的空结果
Empty results when filtering based on position in 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 />
这定义了所有产品的循环:
for $prod in //product
对于这些产品中的每一个,您 return 是 单个 产品序列中的第三个和第四个节点,这显然会产生空节点:
let $x:=$prod
return (<Item>{data($x[3])}{data($x[4])}</Item>)
为了更好的理解,return整个产品节点每次:
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>
这将 return 与
完全相同的结果
for $prod in //product
return <item>{ $prod[2] }</item>
(或任何其他位置谓词)导致空 <item/>
节点。
最后,对return只有第三和第四个产品,将位置谓词移入for
循环参数:
for $prod in //product[position() = 3 or position() = 4]
return <item>{ $prod }</item>
(并根据需要应用 data(...)
,但我猜它不会产生您期望的结果)。
我尝试打印目录中第 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 />
这定义了所有产品的循环:
for $prod in //product
对于这些产品中的每一个,您 return 是 单个 产品序列中的第三个和第四个节点,这显然会产生空节点:
let $x:=$prod
return (<Item>{data($x[3])}{data($x[4])}</Item>)
为了更好的理解,return整个产品节点每次:
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>
这将 return 与
完全相同的结果for $prod in //product
return <item>{ $prod[2] }</item>
(或任何其他位置谓词)导致空 <item/>
节点。
最后,对return只有第三和第四个产品,将位置谓词移入for
循环参数:
for $prod in //product[position() = 3 or position() = 4]
return <item>{ $prod }</item>
(并根据需要应用 data(...)
,但我猜它不会产生您期望的结果)。