2012-02-27 18 views
1

XQuery腳本需要顯示xml文件中的所有公司名稱和聯繫人姓名。同一個xml文件的多個屬性

這是我有: -

for $x in doc("Customers.xml")/dataroot/Customers return $x/CompanyName $x/ContactName

示例XML

<dataroot> 
    <Customers> 
     <CustomerID>ALFKI</CustomerID> 
     <CompanyName>Alfreds Futterkiste</CompanyName> 
     <ContactName>Maria Anders</ContactName> 
     <ContactTitle>Sales Representative</ContactTitle> 
     <Address>Obere Str. 57</Address> 
     <City>Berlin</City> 
     <PostalCode>12209</PostalCode> 
     <Country>Germany</Country> 
     <Phone>030-0074321</Phone> 
     <Fax>030-0076545</Fax> 
    </Customers> 
    <Customers> 
     <CustomerID>ANATR</CustomerID> 
     <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> 
     <ContactName>Ana Trujillo</ContactName> 
     <ContactTitle>Owner</ContactTitle> 
     <Address>Avda. de la Constitución 2222</Address> 
     <City>México D.F.</City> 
     <PostalCode>05021</PostalCode> 
     <Country>Mexico</Country> 
     <Phone>(5) 555-4729</Phone> 
     <Fax>(5) 555-3745</Fax> 
    </Customers> 
    <Customers> 
     <CustomerID>ANTON</CustomerID> 
     <CompanyName>Antonio Moreno Taquería</CompanyName> 
     <ContactName>Antonio Moreno</ContactName> 
     <ContactTitle>Owner</ContactTitle> 
     <Address>Mataderos 2312</Address> 
     <City>México D.F.</City> 
     <PostalCode>05023</PostalCode> 
     <Country>Mexico</Country> 
     <Phone>(5) 555-3932</Phone> 
    </Customers> 
    <Customers> 
     <CustomerID>AROUT</CustomerID> 
     <CompanyName>Around the Horn</CompanyName> 
     <ContactName>Thomas Hardy</ContactName> 
     <ContactTitle>Sales Representative</ContactTitle> 
     <Address>120 Hanover Sq.</Address> 
     <City>London</City> 
     <PostalCode>WA1 1DP</PostalCode> 
     <Country>UK</Country> 
     <Phone>(171) 555-7788</Phone> 
     <Fax>(171) 555-6750</Fax> 
    </Customers> 
    <Customers> 
     <CustomerID>BERGS</CustomerID> 
     <CompanyName>Berglunds snabbköp</CompanyName> 
     <ContactName>Christina Berglund</ContactName> 
     <ContactTitle>Order Administrator</ContactTitle> 
     <Address>Berguvsvägen 8</Address> 
     <City>Luleå</City> 
     <PostalCode>S-958 22</PostalCode> 
     <Country>Sweden</Country> 
     <Phone>0921-12 34 65</Phone> 
     <Fax>0921-12 34 67</Fax> 
    </Customers> 

我想回到公司名稱和聯繫人姓名ONLY。這些必須能夠很容易地轉換成表格格式,因此它被構造成列

+0

謝謝,它確實有效。我希望所有條目能夠在單個表格中進行佈局,聯繫人名稱和公司名稱都有自己的列,而不是爲每個公司名稱和每個聯繫人名稱都設置單獨的表格。 – 2012-02-27 10:35:13

+0

您能舉一個例子說明數據源(Customers.xml)的外觀嗎? – tohuwawohu 2012-02-27 10:47:35

+0

我使用northwind 2000數據庫,它包含customerName,companyName,電話,地址等,然後將其轉換爲xml。 我基本上試圖轉換sql代碼 SELECT customername,companyname from Customers – 2012-02-27 11:00:47

回答

1

XQuery的基本數據模型是sequence,而不是表格或relation。這也適用於XQuery的result。因此,默認情況下,您將收到return條款返回的序列。默認情況下,沒有「列」或「表」可以返回。如果你需要一個不同的或「更深層次結構」的返回結構,那麼你必須自己添加它。

獲得結構化結果的最簡單方法是創建XML輸出。因此,大多數XQuery教程首先返回XML,而不是純文本或其他任何東西。

如果你需要一個「表結構」作爲輸出,你有不同的選擇:

  • 輸出XML並將其導入到另一個應用程序;
  • 輸出(X)帶HTML表格的HTML;
  • 輸出CSV並導入/解析它首選的電子表格軟件。

輸出XML,你可以使用以下命令:

xquery version "1.0"; 
<table> 
{ 
    for $cust in fn:doc("Customers.xml")/dataroot/Customers 
    return 
     <row> 
     { 
      $cust/CompanyName, $cust/ContactName 
     } 
     </row> 
} 
</table> 

它會返回類似:

<table> 
    <row> 
     <CompanyName>Alfreds Futterkiste</CompanyName> 
     <ContactName>Maria Anders</ContactName> 
    </row> 
    <row> 
     <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> 
     <ContactName>Ana Trujillo</ContactName> 
    </row> 
    <row> 
     <CompanyName>Antonio Moreno Taquería</CompanyName> 
     <ContactName>Antonio Moreno</ContactName> 
    </row> 
    <row> 
     <CompanyName>Around the Horn</CompanyName> 
     <ContactName>Thomas Hardy</ContactName> 
    </row> 
    <row> 
     <CompanyName>Berglunds snabbköp</CompanyName> 
     <ContactName>Christina Berglund</ContactName> 
    </row> 
</table> 

對於CSV輸出(更準確地說:CSV-序列像字符串),你可以使用

xquery version "1.0"; 
for $cust in fn:doc("Customers.xml")/dataroot/Customers 
return 
concat('"', $cust/CompanyName, '"', ',', '"', $cust/ContactName, '"') 

得到類似的東西

"Alfreds Futterkiste","Maria Anders" 
"Ana Trujillo Emparedados y helados","Ana Trujillo" 
"Antonio Moreno Taquería","Antonio Moreno" 
"Around the Horn","Thomas Hardy" 
"Berglunds snabbköp","Christina Berglund" 

編輯:一些XQuery處理器也提供了內置的CSV序列化。例如,第Zorba XQuery processor包括module to parse/serialize CSV

+0

非常感謝你,工作得很好。 – 2012-03-01 01:21:01

相關問題