2017-01-17 1 views
0

XML 파일에서 xQuery 파일을 실행하려고합니다. 쿼리를 컴파일 할 때 다음 오류가 있습니다. 이 "컨텍스트 항목"오류를 이해하지 못합니다.XPTY0002 contextItem

CODE (예)

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

없는 시스템 ID와 모듈의 라인 (363)에 에러 : XPD Y0002 : '/'선행 '/'컨텍스트 항목을 포함하는 트리의 루트 노드를 선택할 수 없습니다. : 컨텍스트 항목이 정의되지 않았습니다. 스레드 "main"의 예외 net.sf.saxon.s9api.SaxonApiException : 선행 '/'는 선택할 수 없습니다. 컨텍스트 항목이 포함 된 트리의 루트 노드 : 컨텍스트 항목이 정의되지 않았습니다. net.sf.saxon.s9api.XQueryCompiler.compile에있는 (XQueryCompiler.java:504) at utils.xquery.essai.main (essai.java:92) 에 의해 발생 : net.sf.saxon.trans.XPathException : 선행 '/'컨텍스트 항목이 포함 된 트리의 루트 노드를 선택할 수 없습니다. 문맥 항목이 정의되지 않았습니다. at net.sf.saxon.expr.SingleNodeExpression.typeCheck (SingleNodeExpression.java:29) at net.sf.saxon.expr.parser.ExpressionVisitor.typeCheck (ExpressionVisitor.java:206)

이 문제를 해결할 수있는 코드를 설명해 주시겠습니까?
내 문제는 무엇입니까?

+0

363 번 라인을 살펴보고 알아낼 수 없다면 여기에서 공유하는 것이 어떻습니까? 또는 문제를 재현하고 전체 코드를 게시하려면 코드를 최소로 줄이는 것이 좋습니다. 그 코드가 함수 안에 있습니까? –

+0

은'기능을 지역 선언 checkRefTest를() XS로 : 문자열 { (: 텍스트와 해설을 여기에 :) 하자 $의 REFTEST을 :. =/D 가군/자손 :: REFTEST (=> 라인 363 여기) 반환 $ refTestKO하자 : = $ REFTEST의 $ item에 대해 [...] –

답변

1

https://www.w3.org/TR/xquery-30/#FunctionDeclns에 따르면 사용자 정의 함수의 경우 "해당 컨텍스트 항목 정적 유형 구성 요소가 없습니다". 그래서 귀하의 코드는 함수를 선언하지만 액세스하려는 경우 문맥 노드가 작동하지 않을 것이라고 가정하고 /을 호출하면 해당 함수의 매개 변수를 선언하고 함수를 호출 할 때 노드를 전달해야합니다. declare function local:checkRefTest($input) as xs:string { (:text and explication here. :) let $REFTEST := $input/dmodule/descendant::REFTEST.

+0

클라이언트의 파일을 수정할 수없는 경우 솔루션이 있습니까? 산업용 파일이므로 수정할 수 없습니다 :( –

+0

If 코드를 오류가 수정 될 필요가 있다고 생각합니다. 일부 도구에 의해 생성 된 다음 해당 도구를 수정해야합니다. 또는 좀 더 관대 한 XQuery 프로세서에 의해 실행되는 의미가 있지만 두렵습니다. 그 코드가 어떤 문맥에서 사용되어야 하는지를 안다. –