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

Я хочу вернуть CompanyName и CONTACTNAME ТОЛЬКО. Они должны быть легко преобразованы в формат таблицы, поэтому они структурированы в столбцах

+0

Спасибо, это действительно работает. Я надеялся, что все записи в макет в одной таблице будут совпадать с именем контакта и названием компании, имеющим свои собственные столбцы, вместо того, чтобы иметь отдельную таблицу для каждого названия компании и каждого имени контакта. –

+0

Не могли бы вы привести пример, как выглядит datasource (Customers.xml)? – tohuwawohu

+0

Я использую базу данных Northwind 2000, она содержит имя клиента, имя_компании, телефон, адрес и т. Д. Затем я преобразовал его в xml. Я в основном пытаюсь преобразовать код sql ВЫБРАТЬ имя пользователя, фирменное наименование от клиентов –

ответ

1

Основная модель данных XQuery - это sequence, а не таблица или relation. Это относится и к result XQuery. Таким образом, по умолчанию вы получите последовательность, возвращенную в предложении 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" 

EDIT: Некоторые процессоры XQuery также предлагают встроенную сериализацию CSV. Например, th Zorba XQuery processor включает в себя module to parse/serialize CSV.

+0

Спасибо, что так много, хорошо работал. –

Смежные вопросы