У меня есть XML-документ, который содержит список клиентов, их заказов и позиций в этих заказах. Я хочу получить список, содержащий различные значения клиентов. Идентификатор клиента является атрибутом «Имя». Пример XML:
<customerunion>
<Customer Name="c2">
<Order OrderNumber="o1">
<Item Description="xyz">i10</Item>
</Order>
</Customer>
<Customer Name="c3">
<Order OrderNumber="o1">
<Item Description="qwe">i11</Item>
<Item Description="mnb">i12</Item>
</Order>
<Order OrderNumber="o2">
<Item Description="cfg">i5</Item>
</Order>
</Customer>
<Customer Name="c1">
<Order OrderNumber="o1">
<Item Description="abc">i1</Item>
<Item Description="def">i2</Item>
</Order>
</Customer>
<Customer Name="c4">
<Order OrderNumber="o1">
<Item Description="abc">i1</Item>
</Order>
<Order OrderNumber="o2">
<Item Description="def">i2</Item>
</Order>
</Customer>
<Customer Name="c2">
<Order OrderNumber="o1">
<Item Description="milk"/>
</Order>
</Customer>
<Customer Name="c10">
<Order OrderNumber="o1">
<Item Description="chips greek yogort avacado"/>
</Order>
</Customer>
<Customer Name="c4">
<Order OrderNumber="o1">
<Item Description="tea bags cheese"/>
</Order>
</Customer>
<Customer Name="c11">
<Order OrderNumber="o1">
<Item Description=" milk sushi Notebook "/>
</Order>
</Customer>
<Customer Name="c11">
<Order OrderNumber="o2">
<Item Description="grape tomato"/>
</Order>
</Customer>
<Customer Name="c12">
<Order OrderNumber="o1">
<Item Description="bread"/>
</Order>
</Customer>
</customerunion>
и ниже результат, который я хочу получить:
<customerlib>
<Customer Name="c1">
<Order OrderNumber="o1">
<Item Description="abc">i1</Item>
<Item Description="def">i2</Item>
</Order>
</Customer>
<Customer Name="c2">
<Order OrderNumber="o1">
<Item Description="xyz">i10</Item>
</Order>
</Customer>
<Customer Name="c3">
<Order OrderNumber="o1">
<Item Description="qwe">i11</Item>
<Item Description="mnb">i12</Item>
</Order>
<Order OrderNumber="o2">
<Item Description="cfg">i5</Item>
</Order>
</Customer>
<Customer Name="c4">
<Order OrderNumber="o1">
<Item Description="abc">i1</Item>
</Order>
<Order OrderNumber="o2">
<Item Description="def">i2</Item>
</Order>
</Customer>
<Customer Name="c10">
<Order OrderNumber="o1">
<Item Description="chips">i1</Item>
<Item Description="greek yogort">i2</Item>
<Item Description="avacado">i3</Item>
</Order>
</Customer>
<Customer Name="c11">
<Order OrderNumber="o1">
<Item Description="milk">i1</Item>
<Item Description="sushi">i2</Item>
<Item Description="Notebook">i3</Item>
</Order>
<Order OrderNumber="o2">
<Item Description="grape tomato">i1</Item>
</Order>
</Customer>
<Customer Name="c12">
<Order OrderNumber="o1">
<Item Description="bread">i1</Item>
</Order>
</Customer>
</customerlib>
Я использовал следующий XQuery:
let $customer := doc("customerunion.xml")/customerunion/Customer
let $allcustomername := doc("customerunion.xml")/Customer/@Name
for $uniquecustomer in distinct-values($customer/@Name)
let $order := distinct-values($customer[Name=$uniquecustomer]/Order)
let $item := distinct-values($customer[Name=$uniquecustomer]/Order/Item)
where $uniquecustomer = $allcustomername
return
<customerlib>
{$uniquecustomer/..}
{
for $o in $order
return $o
}
{
for $i in $item
return $i
}
</customerlib>
Однако я не получил результатов от выполнения запроса. Можете ли вы помочь мне изменить XQuery, чтобы получить желаемый результат?
/customerunion/
, тогда как XML имеет<customersunion>
: в середине имени элемента естьs
. Ваше второе утверждениеlet
полностью исключает/customersunion/
. По этим причинам ваши первые две переменные ничего не содержат. - person LarsH   schedule 30.09.2014fn:trace()
, которую вы можете использовать для отладки. - person dirkk   schedule 30.09.2014