2015-01-02 85 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