2015-01-02 116 views
0

我有一個XBL文件,我可以從我的形式傳遞一些參數,讓我們說:處理撒克遜:評估異常

<my-xbl arg1='' arg2=''> 
</my-xbl> 

<xf:input ref='@arg1'/> 
<xf:input ref='@arg2'/> 

然後,我有這樣的事情:

<xf:model> 
    <xf:action id="populate-data-binding">       
     <xf:action context="instance('sub')" 
        ev:event="xforms-submit-done" 
        ev:observer="my-submission">      
      <xf:action>   
       <xf:var as="xs:string" name="control-value" value="saxon:evaluate(instance('arg1'))"/> 
       <xf:var as="xs:string" name="control-name" value="saxon:evaluate(instance('arg2'))"/> 
       <xf:setvalue ref="xxf:instance('fr-form-instance')//*[name() = $control-name]" 
          value="$control-value"/> 
      </xf:action> 
    </xf:action> 
</xf:model> 

問題是當arg1是空字符串(這意味着在我的表單中,當我按Control設置和skipp arg1字段時,只是將它留空),然後我的表單崩潰。當我插入''或任何東西,但空字符串(asd,q,任何東西)作爲arg1一切都很好。所以現在我想這樣做

<xf:var as="xs:string" name=".." value="if(@arg1 ='null') then 'asd' 
else 'saxon:evaluate(instance('arg1'))'/> 

它不工作,顯然是因爲報價問題(條件必須爲''之間,我不能把任何引號內),可能別的東西。有人可以幫我解決這個問題嗎?提前致謝。

UPDATE:

我想我是有點unprecise。爲了清楚起見,arg1在我的表單中是xf:input的ID。當表單被加載時,我打電話給一個REST服務(你曾經幫我一次,Event xforms-model-construct-done behaviour),它會發回給我一些數據。現在我想填充數據到我的xf:輸入,上面的代碼很好。問題是,在我的XBL我有很多的參數,而不僅僅是arg1arg2,它看起來更像

<my-xbl arg1 = '' arg2 = '' ... arg19 = '' arg20 = ''/> 

現在,在我的形式,我去控制的基本設置,我必須填寫所有paraemters arg1...20 。我只想填寫我需要的,通常是3或4,並且讓其他人留空。問題是我不能這樣做,因爲這樣我的表單崩潰,這是因爲撒克遜:如果它的參數爲null,evalute會引發異常。

(另外提一下的一切,但我不認爲這是與此有關,但它可以幫助你理解我上面的代碼:真實,arg2xf:inputarg1的ID是一樣的東西在web服務資源的路徑,fe我有arg2 = "'firstname'"這是指我的xf:input和arg1 =" //CUSTOMER/FIRSTNAME"(不含引號),我的REST服務URL是http://www.thomas-bayer.com/sqlrest/CUSTOMER/2/。這樣我可以選擇下xf:input id 'firstname'我想只插入firstname我從webservice獲得的數據,然後再次,arg4將像'lastname'和arg3將是//CUSTOMER/LASTNAME等等。正如我所說,不認爲這裏有關)

這就是爲什麼我想檢查空值,我想你的代碼應該幫助我 - 不幸的是它不工作。我的表單不再崩潰,但數據也沒有填充到xf:inputs。也許是因爲這個誤解?謝謝。

+0

在這樣的抽象中弄清楚有點難。你能提供一個我可以研究的最小例子嗎? – ebruchez

+0

我實際上已經設法解決了這個問題,首先我想我需要一些額外的orbeon知識來解決這個問題,但是你的答案(以及之前的一些答案)幫助我解決了這個問題。謝謝 – pzeszko

+0

很高興你知道了! – ebruchez

回答

1
<xf:var 
    as="xs:string" 
    name="..." 
    value=" 
     if(@arg1 ='null') 
     then 'asd' 
     else 'saxon:evaluate(instance(''arg1''))"/> 

要測試空白字符串,最好使用normalize-space()。另外,我想這instance('arg1')是當值存儲在這兩種情況下:

<xf:var 
    as="xs:string" 
    name="..." 
    value=" 
     if (normalize-space(instance('arg1')) = '') 
     then 'asd' 
     else 'saxon:evaluate(instance(''arg1''))' 
"/> 

但我爲什麼你需要引用saxon:evaluate()呼叫有點不清楚。你想讓變量保持:

  1. 評估結果?
  2. 或XPath表達式?
+0

對不起,首先是非正式的 - 我已經更新了我的問題,你的代碼似乎很好,但不幸的是它不工作,可能是因爲這種誤解。 – pzeszko