2017-02-19 2 views
1

Ich habe eine XQUERY 3.0 wie folgt auf eine XML-Datei mit 3 Bestellung recs mit 5 Artikeln:XQUERY 3.0 Multi-Level-SORT/ORDER BY

for $PurchaseOrder in doc("C:\Users\thebluephantom\Desktop\order.xml")//PurchaseOrder 
    order by xs:integer($PurchaseOrder/Item/Quantity) ascending 
    return $PurchaseOrder/Items/Item/Quantity 

, die die Ergebnisse nicht zurück, wie ich will. Es hat eine typische verschachtelte Struktur, z.

<PurchaseOrders> 
    <PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20"> 
    <Address Type="Shipping"> 
     <Name>Ellen Adams</Name> 
     ... 
    </Address> 
     <Address Type="Billing"> 
     <Name>Tai Yee</Name> 
     <Street>8 Oak Avenue</Street> 
     ... 
    </Address> 
    <DeliveryNotes>Please leave packages in shed by driveway. </DeliveryNotes> 
    <Items> 
     <Item PartNumber="872-AA"> 
     <ProductName>Lawnmower</ProductName> 
     <Quantity>100</Quantity> 
     <USPrice>148.95</USPrice> 
    <Comment>Confirm this is electric</Comment> 
    </Item> 
    <Item PartNumber="926-AA"> 
     <ProductName>Baby Monitor</ProductName> 
     <Quantity>20</Quantity> 
     <USPrice>39.98</USPrice> 
     <ShipDate>1999-05-21</ShipDate> 
    </Item> 
</Items> 
</PurchaseOrder> 
<PurchaseOrder PurchaseOrderNumber="99505" OrderDate="1999-10-22"> 
    ... 

ich das Ergebnis auf 3 POs und 5 Auftragspositionen:

<Quantity>100</Quantity> 
<Quantity>20</Quantity> 
<Quantity>1</Quantity> 
<Quantity>1000</Quantity> 
<Quantity>1</Quantity> 

bei einer Reihe von Tutorials Blick auf Gruppierungen usw. ich nicht in der Lage bin, um herauszufinden, ob dies tatsächlich möglich ist.

Antwort

1

Der XPath in Ihrer Order By fehlt die Items Achse, so dass es nichts auswählt und Sie erhalten Ihre Ergebnisse in der Reihenfolge der Dokumente. Wenn Sie den XPath korrigieren, wird eine Reihe von Werten im Aufruf xs:integer() ausgewählt und ein Fehler ausgegeben.

Man könnte es umschreiben wie folgt aus:

for $quantity in 
     doc("C:\Users\thebluephantom\Desktop\order.xml")/PurchaseOrders/PurchaseOrder/Items/Item/Quantity 
order by xs:integer($quantity) ascending 
return $quantity 
+0

1) Leider, das nicht funktioniert, eine optimierte Abfrage erhalten mit BaseX als() – thebluephantom

+0

2) xs: integer werfen einen Fehler -> kam nie über in jedem Tutorial – thebluephantom

+0

Whoops, ich hatte eine lokale Variable verwendet, um den Inhalt anstelle von 'doc()' zu laden und hatte den XPath durcheinander gebracht. Nur hinzugefügt '/ PurchaseOrders' –