处理撒克逊人:评估异常

时间:2015-01-02 19:06:09

标签: exception orbeon xbl

我有一个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为空字符串时(这意味着当我按下控制设置和skipp arg1字段时,在我的表单中,只是将其留空)然后我的表单崩溃了。当我插入''或任何空字符串(asd,q,任何东西)作为arg1时,一切正常。所以现在我想做一些像

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

它不起作用,显然是因为引号问题(条件必须在''和我之间不能放任何引号)和其他可能的东西。有人可以帮我解决这个问题吗?提前谢谢。

更新:

我想我有点不高兴。为清楚起见,arg1在我的表单中是xf:input的ID。当表单被加载时,我调用了一个REST服务(你曾经帮助过我一次,Event xforms-model-construct-done behaviour)并向我发送了一些数据。现在我想将数据填充到我的xf:输入,上面的代码做得很好。问题是在我的XBL中我有很多参数,而不仅仅是arg1arg2,它看起来更像是

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

现在,在我的表单中,我将控制基本设置,我必须填写所有参与者arg1...20。我想只填写我需要的东西,通常是3或4,其他人留空。问题是我无法做到这一点,因为我的表单崩溃了,因为saxon:evalute如果其参数为null则抛出异常。

(另外要提及所有内容,但我不认为它与此相关,但它可以帮助您理解我的上述代码:实际上,arg2是{{1}的ID但是xf:input类似于webservice中资源的路径,我有arg1引用我的xf:input和arg2 = "'firstname'"(没有引号),我的REST服务URL是{ {1}}。这样我可以在id arg1 =" //CUSTOMER/FIRSTNAME" xf:input 下选择,我只想插入从webservice获得的整个数据的名字。然后,arg4将是比如http://www.thomas-bayer.com/sqlrest/CUSTOMER/2/和arg3就是'firstname'等等。正如我所说,不要认为它与此相关)

这就是我想检查空值的原因,我猜你的代码应该对我有所帮助 - 不幸的是它无法正常工作。我的表单不再崩溃,但数据也没有填入'lastname'。也许是因为这种误解?感谢。

1 个答案:

答案 0 :(得分: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表达式?