2012-02-27 116 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

相关问题