/ / Warum gibt mir Xquery einen Fehler in meiner Variablen? I - xml, xquery

Warum gibt Xquery einen Fehler bei meiner Variablen? I - xml, xquery

Ich bin sehr neu in XML und XQUERY und habe eineschreckliche Zeit beim Versuch zu validieren, was wahrscheinlich unglaublich einfacher Code ist. Der Validator sagt mir immer wieder, dass ich eine unbekannte Funktion oder einen unbekannten Ausdruck habe, aber um meine Variable herum anzuhalten scheint. Kann jemand helfen? Ich bin mir sicher, dass dies eine unglaublich einfache Frage ist, aber ich habe meinen Kopf gegen die Wand geschlagen, um herauszufinden, was ich falsch mache. Hier ist das XML:

<PurchaseOrders>
<PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
<Address Type="Shipping">
<Name>Ellen Adams</Name>
</Address>
<Address Type="Billing">
<Name>Tai Yee</Name>
</Address>
<Items>
<Item PartNumber="872-AA">
<ProductName>Lawnmower</ProductName>
</Item>
<Item PartNumber="926-AA">
<ProductName>Baby Monitor</ProductName>
</Item>
</Items>
</PurchaseOrder>
</PurchaseOrders>

meine Xquery:

for $x in doc/PurchaseOrders/PurchaseOrder
let $z := $x/Items/Item
let$n := count($z)
where $x/Address[@Type = "Shipping"] order by $x/Name ascending
return <Orders><Order><Name>{$x/Name}</Name><NoProducts>$n</NoProducts></Order></Orders>

Erwartete Ausgabe:

<Orders>
<Order>
<name>Ellen Adams</name>
<noProducts>2</noProducts>
</Order>
</Orders>

Was habe ich falsch gemacht? Ich weiß, dass dies grundlegend ist, aber ich würde gerne lernen! Vielen Dank!

Antworten:

0 für die Antwort № 1

Ich kann nicht mit dem sprechen, was du falsch gemacht hast (seit demDer in der Frage angegebene Fehler war nicht genau genug, und als ich dieselbe Abfrage selbst ausführte, erhielt ich ein leeres Ergebnis, aber auch keine Fehler. Ich kann jedoch eine Abfrage bereitstellen, die die erwartete Ausgabe generiert.

declare context item := document {
<PurchaseOrders>
<PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
<Address Type="Shipping">
<Name>Ellen Adams</Name>
</Address>
<Address Type="Billing">
<Name>Tai Yee</Name>
</Address>
<Items>
<Item PartNumber="872-AA">
<ProductName>Lawnmower</ProductName>
</Item>
<Item PartNumber="926-AA">
<ProductName>Baby Monitor</ProductName>
</Item>
</Items>
</PurchaseOrder>
</PurchaseOrders>
};

<Orders>{
for $purchaseOrder in /PurchaseOrders/PurchaseOrder[Address/@Type="Shipping"]
let $shippingAddress := $purchaseOrder/Address[@Type="Shipping"]
let $items := $purchaseOrder/Items/Item
let $itemCount := count($items)
order by $shippingAddress/Name ascending
return <Order>
<Name>{$shippingAddress/Name}</Name>
<PONum>{string($purchaseOrder/@PurchaseOrderNumber)}</PONum>
<NoProducts>{$itemCount}</NoProducts>
</Order>
}</Orders>

Beachten Sie, dass während zuvor $x auf eine Bestellung hingewiesen, hier ist der Schlüssel eine Lieferadresse - wichtig, weil sonst Ihre $x/Name keine Daten gefunden.