2017-01-17 2 views
0

Ich möchte eine xQuery-Datei in einer XML-Datei ausführen; Beim Kompilieren der Abfrage habe ich den folgenden Fehler. Ich verstehe diesen "Kontextelement" -Fehler nicht.XPTY0002 contextItem

CODE (Beispiel)

String xmlFileName = "D:/fichierContenu.XML"; 
FileInputStream XmlStream = new FileInputStream(xmlFileName); 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

DocumentBuilder builder = factory.newDocumentBuilder(); 

FileInputStream fis = new FileInputStream(xmlFileName); 
InputSource is = new InputSource(fis); 
Document doc = builder.parse(is); 

Element element = doc.getDocumentElement(); 

InputStream queryStream = queryStream = new FileInputStream("D:/TestsAuto.xq"); 
Processor proc = new Processor(false); 
XQueryCompiler comp = proc.newXQueryCompiler(); 
XQueryExecutable exp = comp.compile(queryStream); 

XQuery

declare function local:checkRefTest() as xs:string { 
    (:text and explication here. :) 
    let $REFTEST := /dmodule/descendant::REFTEST ***(=> line 363 HERE)*** 
    return 
     let $refTestKO := 
      for $item in $REFTEST 
      return 
       if(fn:string-length($item/@RefTest)= 13) then 
        let $RefTest := fn:substring($item/@RefTest, 1, 6) 
        return 
         if ($RefTest = "  ") then 
          if(fn:exists($item/@refval) and fn:exists($item/@refval2)) then 
           () 
          else 
           () 
         else 
          () 
       else 
        $item 
     return 
      if(fn:empty($refTestKO)) then 
       "OK" 
      else 
       fn:concat("NOK : test here ", "'",fn:string-join($refTestKO/@RefTest, "', '"),"'") 
}; 

ERROR

Fehler auf der Leitung 363 von Modul ohne systemId: XPD Y0002: Leading '/' kann nicht den Wurzelknoten des Baums auswählen, der das Kontextelement enthält: das Kontextelement ist undefiniert Ausnahme im Thread "main" net.sf.saxon.s9api.SaxonApiException: Leading '/' kann nicht auswählen Wurzelknoten des Baums, der das Kontextelement enthält: Das Kontextelement ist nicht definiert at net.sf.saxon.s9api.XQueryCompiler.compile (XQueryCompiler.java:504) bei utils.xquery.essai.main (essai.java:92) verursacht durch: net.sf.saxon.trans.XPathException: Leading '/' kann nicht den Wurzelknoten des Baums auswählen, der das Kontextelement enthält: Das Kontextelement ist nicht definiert at net.sf.saxon.expr.SingleNodeExpression.typeCheck (SingleNodeExpression.java:29) bei net.sf.saxon.expr.parser.ExpressionVisitor.typeCheck (ExpressionVisitor.java:206)

Können Sie mir einen Code erklären oder zeigen, mit dem ich dieses Problem lösen könnte?
Was ist mein Problem?

+0

Wie wäre es mit Blick auf Zeile 363 und teilen Sie es hier, wenn Sie es nicht herausfinden können? Oder versuchen Sie noch besser, den Code auf ein Minimum zu reduzieren, um das Problem zu reproduzieren und den vollständigen Code zu veröffentlichen. Ist dieser Code zum Beispiel eine Funktion? –

+0

'erklären Funktion local: checkRefTest() als xs: string { (: Text und explication hier :) let $ REFTEST:. =/Dmodule/Nachkomme :: REFTEST (=> Linie 363 hier) return lassen $ refTestKO : = für $ item in $ REFTEST' [...] –

Antwort

1

Laut https://www.w3.org/TR/xquery-30/#FunctionDeclns ist für eine benutzerdefinierte Funktion "die statische Komponente des Kontextelements nicht vorhanden". Ich denke also, dass Ihr Code eine Funktion deklariert, aber versucht, auf / zuzugreifen, unter der Annahme, dass ein Kontextknoten nicht funktioniert, müssten Sie einen Parameter für diese Funktion deklarieren und einen Knoten in den Aufruf der Funktion übergeben und z. declare function local:checkRefTest($input) as xs:string { (:text and explication here. :) let $REFTEST := $input/dmodule/descendant::REFTEST.

+0

Gibt es eine Lösung, wenn ich die Datei meines Clients nicht ändern kann? Es ist eine Datei aus einem industriellen und ich kann es nicht ändern :( –

+0

If der Code hat einen Fehler Ich denke, dass der Fehler behoben werden muss.Wenn es von einem Werkzeug erzeugt wird, dann muss dieses Werkzeug repariert werden.Es ist auch beabsichtigt, dass es von einem etwas milderen XQuery-Prozessor ausgeführt wird, aber ich fürchte, dass ich es nicht tue weiß, in welchem ​​Kontext dieser Code verwendet werden soll. –