2014-06-12 92 views
1

我有以下模塊傳遞一個地圖外部函數

xquery version "1.0-ml"; 

declare variable $datasets as map:map external; 

... 

我想打電話給這個讓我做一個xdmp:invoke這樣

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

$map的類型是地圖:地圖。

運行這給了我下面的錯誤

[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 map: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是空序列時,<options/>元素將變爲$datasets param的值,該值是外部變量的無效值。

更新:Doh! @ mblakele的評論下面解釋錯誤條件...

TL; DR:()不是map:map的實例。

+0

是的,'$ map'是空的。但是爲了狡辯,這並不能使第二和第三個論點變得平庸。每個論點仍然是分開的。發生了什麼事是第二個參數本身是'fn:QName(「,」datasets「)。 'xdmp:invoke'序列必須是QName和item的偶數序列,所以'xdmp:invoke'會拋出'XMDP-ARG'錯誤。 – mblakele

+0

防止這種情況的一種方法是明確檢查變量類型:例如'(xs:QName(「datasets」),$ map視爲map:map)'。另一種方法是使用強類型進行綁定:'讓$ map作爲map:map:= ...'。使用這些表單中的任何一個或兩個都應該使錯誤消息更易於理解。例如'treat as'拋出'XDMP-TREAT:無效的treat:()視爲map:map'。 – mblakele