【问题标题】:Empty results when filtering based on position in XQuery基于 XQuery 中的位置过滤时的空结果
【发布时间】:2015-10-07 12:41:58
【问题描述】:

我尝试打印目录中第 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 />

【问题讨论】:

  • 请阅读How to Ask,了解好问题中应包含的内容。特别是,“我遇到错误”根本就不是一个合理的问题描述。请提供有关错误和当前输出的详细信息。
  • 确定先生我做了更改..

标签: sql-server xml xquery flwor


【解决方案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>

每个&lt;product/&gt; 元素都是$prod[1]。试试:

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

相比,将返回完全相同的结果
for $prod in //product
return <item>{ $prod[2] }</item>

(或任何其他位置谓词)导致空的&lt;item/&gt; 节点。

最后,要只返回第三个和第四个产品,将位置谓词转移到for 循环参数中:

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

(并根据需要申请 data(...),但我猜它不会产生您期望的结果)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2013-01-14
    • 1970-01-01
    • 2019-01-23
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多