2016-05-23 8 views
0

Ich bin derzeit versucht, eine XQuery-Datei über Java auszuführen. Da ich neu bei XQuery bin, bin ich mir nicht sicher, wie ich es debuggen soll. Wenn ich das XQ ausführe, erhalte ich den folgenden Fehler:Debuggen von XQuery - XPTY0019 Fehler

XQuery-Prozessor Ausnahme: Ausnahme beim Aufrufen von Saxon: Erforderlicher Elementtyp des ersten Operanden von '/' ist node(); Der angegebene Wert hat den Elementtyp xs: anyAtomicType; SystemID:; Zeilen #: 301; Spalte #: -1; Ursache: Fehler in Zeile 301 XPTY0019: Erforderlicher Elementtyp des ersten Operanden von '/' ist node(); gelieferte Wert xs Elementtyp: anyAtomicType

Jetzt möchte ich wissen, wie ich die Linie zeigen Sie Stift, der den Fehler wirft?

EDIT:

if ($ipItems) then (
    for $item in $ipItems 
     let $ipAddress := data ($item/nc:IpAddressList/nc:ipAddress) 

Nach numurous Versuche ich endlich die Wurzel casue auf den Befehl LET aufgezeigt, wenn ich es entfernen, wird der Code in Ordnung. Kannst du mich bitte wissen lassen, was ich dort falsch gemacht habe?

Antwort

2

Das Problem ist mit ziemlicher Sicherheit dieser Weg Ausdruck $item/nc:IpAddressList. Das Problem ist, dass $item an einen Wert von xs:anyAtomicType bindet, während Pfadausdrücke nur auf Knoten arbeiten. Sie sollten einige Debugging durchführen, um zu sehen, was der Wert von $item zur Laufzeit ist.

1

Ich habe Probleme genau zu verstehen, warum Sie mit diesem zu kämpfen haben. Das Codefragment, das Sie uns gezeigt haben, ist vermutlich irgendwo in Zeile 301 der Abfrage. Die Fehlermeldung bezieht sich auf den Operator "/", und in Ihrer Abfrage gibt es nur zwei "/" -Operatoren. Der erste Operand des ersten "/" Operators (A) ist $item, und der erste Operand des zweiten "/" Operators (B) ist $item/nc:IpAddressList. Wenn B irgendetwas zurückgibt, kann es nur Knoten zurückgeben, daher ist der statische Typ node() *, also ist B nicht das Problem. So muss das Problem A. sein Der Artikeltyp $item ist das gleiche wie der Artikeltyp $ipItems, so dass die Fehlermeldung Dir sagt, dass $ipItems atomare Werte enthält, anstatt Knoten. Saxon kann Ihnen diesen Fehler zur Kompilierzeit geben, wenn es sich herausstellen kann, dass der Wert $ipItems immer atomare Werte enthält, oder es kann Ihnen den Fehler zur Laufzeit geben, wenn der Laufzeitwert atomar ist. In diesem Fall vermute ich, dass es sich um einen Kompilierungsfehler handelt, da die Nachricht für einen Laufzeitfehler spezifischer ist, z. es würde Ihnen sagen, dass $ item ein xs:decimal, vielleicht, oder ein xs:date ist.

In diesem Stadium können wir Ihnen nicht mehr helfen, weil wir sehen müssen, wie $ipItems initialisiert wird. Wahrscheinlichkeiten sind, es wird auf einen Wert initialisiert, der immer nur atomar sein kann: ein Beispiel könnte let $ipItems := distinct-values(xx/yy/zz) sein. Ein atomarer Wert kann kein untergeordnetes Element mit dem Namen nc:IpAddressList haben, daher kann dies niemals sinnvoll sein.

+0

Danke für die Eingaben, Michael und Adam. Beide Ihre Eingaben wiesen mich in die richtige Richtung. Es war die Art, wie ich das Schema sozusagen durchquerte. Ein Spring Chicken in XQ zu sein ist wirklich schwer! –