2012-04-09 70 views
0

考慮XML文件:XQuery返回多個值,而不是一個

注:有可能是上述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

作爲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() 
    

    這意味着你抓住每一個項目在其供應商名稱等於給定供應商名稱的輸入中,並且獲得這些(過濾)項目的名稱。

就是這樣。希望我有些道理!

+0

非常感謝您的回覆。我正在使用氧氣,似乎「group by」沒有在那裏定義。 (http://www.w3schools.com/xpath/xpath_functions.asp)有什麼建議嗎? – 2012-04-10 13:34:21

+0

@PiotrL。哦,是的,這是XQuery 3.0中額外定義的一個很好的小東西。看來你的XQuery處理器還不支持它。我更新了我的答案,以便它不使用此功能。 – 2012-04-10 15:48:26

相關問題