Xquery返回多个值而不是一个

时间:2012-04-09 22:39:52

标签: xquery

考虑xml文件:

<warehouse>
- may be some tag on upper level of dep present, may be not
<dep no ="2">
    <item>
        <itemName> Item 1  </itemName>
        <supplier> Supp1 </supplier>
        <supplier> Supp2 </supplier>
    </item>
</dep>
<dep no ="1">
    <item>
        <itemName> Item 2  </itemName>
        <supplier> Supp1 </supplier>
        <supplier> Supp3 </supplier>
    </item>
</dep>
.......
</warehouse>

注意:dep标签上方可能有一些标签,或者它们可能丢失。

我需要在列表中显示供应商列表,他们生成的项目名称以及每个项目的部门名称前面,例如

Supp2
 Item1, 2
Supp1
 Item1, 2
 Item2, 1

这是我的代码:

<ul>
{
for $sup in distinct-values(doc("warehouse.xml")//supplier)
for $item in doc("warehouse.xml")//item[supplier = $sup]

return <li>{data($sup)} <ul> {
let $n:= $item/itemName
let $y:= doc("warehouse.xml")//dep[//itemName=$n]/@no 
for $n1 in $n return <li>{data($n1), data($y)} </li>} </ul> </li>
}
</ul>

我面临两个问题。首先是y显示所有部门编号,从1开始。另一个是如果我有1个供应商生产两个项目,而不是

Supp1
 Item1, 2
 Item2, 3

我得到了

Supp1
 Item1, 1,2, ...
Supp1
 Item2, 1,2, ...

请问您可能会出现什么问题?我深表感激。

1 个答案:

答案 0 :(得分:1)

作为XQuery的新手,我可以写下以下内容。

输入:

<warehouse>
  <something/>
  <dep no ="2">
    <item>
      <itemName>Item1</itemName>
      <supplier>Supp1</supplier>
      <supplier>Supp2</supplier>
    </item>
  </dep>
  <anything/>
  <dep no ="1">
    <item>
      <itemName>Item2</itemName>
      <supplier>Supp1</supplier>
      <supplier>Supp3</supplier>
    </item>
  </dep>
  <whatever/>
</warehouse>

查询:

<ul>{
(: the ../text() can be dropped from everywhere :)
let $doc := doc("input.xml")    
for $supplier in distinct-values($doc//supplier/text())
let $items := $doc//item[supplier/text() = $supplier]/itemName/text()
return <li>{$supplier}: {string-join($items, ", ")}</li>
}</ul>

输出:

<ul>
  <li>Supp1: Item1, Item2</li>
  <li>Supp2: Item1</li>
  <li>Supp3: Item2</li>
</ul>

查询背后的理论如下。

  • 因为您想列出每个供应商的项目名称,您基本上想要按供应商分组。为此,您必须遍历输入中存在的每个唯一供应商:

    distinct-values($doc//supplier/text())
    
  • 在此之后,您要列出与给定供应商关联的每个项目:

    $doc//item[supplier/text() = $supplier]/itemName/text()
    

    表示您获取输入中的每个项目,其中供应商名称等于给定供应商的名称,而不是您获得这些(已过滤)项目的名称。

就是这样。希望我有所作为!