2009-01-27 71 views

回答

9

是的,這裏是從XQuery specan example:。

「連接,結合來自多個來源的數據到一個結果,是查詢的一個非常重要的類型在本節中,我們將說明如何將幾個類型的連接都可以在XQuery中表示,我們將立足於以下三個文件我們的例子:

  1. 名爲parts.xml包含許多part內容的文件;反過來每個part元素包含partnodescription子元素。
  2. 一個名爲suppliers.xml的文檔,其中包含許多supplier元素;每個supplier元素又包含suppnosuppname子元素。
  3. 一個名爲catalog.xml的文檔,其中包含有關供應商和零件之間關係的信息。目錄文件包含許多item元素,每個元素又包含partno,suppnoprice子元素。

傳統(「內部」)連接返回來自兩個或多個相關源的信息,如以下示例所示,該示例組合來自三個文檔的信息。該示例生成從目錄文檔派生的「描述性目錄」,但包含部分描述而不是部件號和供應商名稱,而不是供應商編號。新目錄是由部分描述其次是由供應商名稱的字母順序排列。*

<descriptive-catalog> 
    { 
    for $i in fn:doc("catalog.xml")/items/item, 
     $p in fn:doc("parts.xml")/parts/part[partno = $i/partno], 
     $s in fn:doc("suppliers.xml")/suppliers 
        /supplier[suppno = $i/suppno] 
    order by $p/description, $s/suppname 
    return 
     <item> 
      { 
      $p/description, 
      $s/suppname, 
      $i/price 
      } 
     </item> 
    } 
</descriptive-catalog> 

前面的查詢只返回大約有供應商和有零部件供應商的零部件信息。 外連接是保留來自一個或多個參與源的信息的連接,包括其他源中沒有匹配元素的元素。例如,留下的供應商和零件之間的外部聯接可能返回有關沒有匹配的零部件供應商的信息。」

請注意,XQuery不具有標準的文件()函數(它是一個XSLT function)而是有doc()功能,這是對「XQuery 1.0 and XPath 2.0 Functions and Operators」部分

有克里斯是在至少回答兩個錯誤:

  1. XQuery is case sensitive - 在Chris示例中使用的大寫關鍵字不會被符合規範的XQuery處理器所允許。
  2. 像doc()這樣的標準函數沒有必要加前綴,我只是引用了XQuery規範,它有前綴。否則,在我自己的代碼中,我會忽略「fn」前綴。
  3. 函數document()不是標準的XQuery/XPath函數。應該使用doc()函數。
0

在XQuery中,如果你寫的東西像下面這樣:

for $x in doc('doc1.xml')//a 
for $y in doc('doc2.xml')//a 
where $x/@name = $y/@name 
return $x 

那麼你的XQuery處理器應該足夠聰明地發現,這是一個連接。

你永遠不會在XQuery中顯式指定某件事是連接。 XQuery的常見主題是你的程序說你想要什麼信息,而不是如何來計算它。

儘管它看起來像是在實踐中循環遍歷第二個文檔,但真正的XQuery處理器會更智能地執行此操作,大致類似於以下SQL語句(我的SQL非常生鏽,所以如果此語法完全致謝,我表示歉意錯)

SELECT doc1.a 
FROM doc1 INNER JOIN doc2 
WHERE doc1.name = doc2.name 

XMark基準包含幾個示例查詢,這些都是非常值得一看。特別是查詢9到12執行連接。

0

它是比這更容易(至少使用SAXON):

let $items := (
    doc("file1.xml") , 
    doc("file2.xml") , 
    doc("file3.xml") 
) 

for $x in $items ... 
+1

這可能是一個錯字,但你打開`file1.xml` 3倍。 – 2012-10-25 17:40:05