2014-06-12 2 views
1

에지도를 통과 내가이 전화를 할 다음과 같은 모듈을외부 기능

xquery version "1.0-ml"; 

declare variable $datasets as map:map external; 

... 

을하는 것은 그래서 내가이

... 
let $update := xdmp:invoke("/app/lib/my-module.xqy", (xs:QName("datasets"), $map), <options xmlns="xdmp:eval"> 
       <modules>{xdmp:modules-database()}</modules> 
      </options>) 
... 

$map 같은 xdmp:invoke는 형태 맵이다 :지도.

이 나에게 다음과 같은 오류

[1.0-ml] XDMP-ARG: xdmp:invoke("/app/lib/20140527-0916-copy-y-axis-labels-from-chart-to-dataset-...", fn:QName("", "datasets"), <options xmlns="xdmp:eval"><modules>0</modules></options>) -- Invalid argument 

이유는 무엇입니까 부여합니다 실행?

+0

위 코드 조각과 일치하는 최소한의 테스트 케이스를 만들었고 제대로 작동했습니다. 전체 모듈을 게시 할 수 있습니까? – joemfb

+1

확실하십니까 $ map은'map : map'은 시퀀스가 ​​아닌 싱글 톤입니까? 아니면 XML로 직렬화 된지도가 아닙니까? '$ map instance of map : map'을 실행 해보십시오. – wst

답변

2

그것은 당신이 게시 한 제한된 코드 샘플에서 확실히 알고 어렵다,하지만 난 당신의 $map 변수가 빈 시퀀스 (XPath에 /는 XQuery에서 null의 거친 아날로그)에 바인딩되어 있다고 생각합니다.

단순히 외부 변수 $datasets 반환하는 다음과 같은 주요 모듈을 만들었습니다 제대로 작품을 다음과 같이 호출

xquery version "1.0-ml"; 
declare variable $datasets as map:map external; 
$datasets 

을 :

let $map := map:entry("key", "value") 
return 
    xdmp:invoke("/test.xqy", 
    (xs:QName("datasets"), $map), 
     <options xmlns="xdmp:eval"> 
     <modules>{xdmp:modules-database()}</modules> 
     </options>) 

이것은 "잘못된 인수"결과 오류 :

let $map :=() 
return 
    xdmp:invoke("/test.xqy", 
    (xs:QName("datasets"), $map), 
     <options xmlns="xdmp:eval"> 
     <modules>{xdmp:modules-database()}</modules> 
     </options>) 

XQuery 플랫 시퀀스 s- 표현식과 같이 중첩) 이므로 $map이 빈 시퀀스 인 경우 요소는 외부 변수에 대해 유효하지 않은 값인 $datasets 매개 변수의 값이됩니다.

업데이트 : Doh! 아래의 @ mblakele의 의견은 오류 조건을 설명합니다 ...

TL : ()map:map의 인스턴스가 아닙니다.

+0

예, '$ map'은 비어 있습니다. 그러나 두 번째와 세 번째 논점을 평평하게하지는 않습니다. 각 인수는 여전히 분리되어 있습니다. 두 번째 인수는'fn : QName ("", "datasets")'자체였습니다. 'xdmp : invoke' 시퀀스는 QName과 item의 짝수 번째 시퀀스 여야합니다. 그래서'xdmp : invoke'는'XMDP-ARG' 에러를 던집니다. – mblakele

+0

이것을 방지하는 한 가지 방법은 변수 유형을 명시 적으로 확인하는 것입니다. 예를 들어'(xs : QName ("datasets"), $ map map : map)'과 같이. 다른 하나는 강한 타이핑을 사용하여 바인딩하는 것입니다 :'let $ map as map : map : = ...'. 이러한 양식 중 하나 또는 모두를 사용하면 오류 메시지를보다 쉽게 ​​이해할 수 있습니다. 예를 들어'treat as'는'XDMP-TREAT : Do not invalid treat :() as map : map'을 던집니다. – mblakele