处理撒克逊:评估异常



我有一个 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是空字符串时(这意味着当我按控制设置并跳过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 服务(你曾经帮助过我,事件 xforms-model-construct-done 行为),它会向我发回一些数据。现在我想将数据填充到我的 xf:inputs 中,上面的代码做得很好。问题是在我的XBL中我有很多参数,而不仅仅是arg1arg2,它看起来更像

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

现在,当我在表单中转到控件的基本设置时,我必须arg1...20填充所有参数。我只想填写我需要的那些,通常是 3 或 4,而其他的留空。问题是我不能这样做,因为这样我的表单就会崩溃,这是因为 saxon:evalute 如果它的参数为 null,它会抛出异常。

(还要提到所有内容,但我认为它在这里无关紧要,但它可以帮助您理解我上面的代码:实际上,arg2xf:input 的 ID,但arg1类似于 Web 服务中资源的路径,例如我有arg2 = "'firstname'"指的是我的xf:input和arg1 =" //CUSTOMER/FIRSTNAME"(没有引号),我的REST服务URL是http://www.thomas-bayer.com/sqlrest/CUSTOMER/2/。这样,我可以选择在 id 的 xf:input'firstname'我只想插入我从 Web 服务获得的整个数据的名字。再说一次,arg4 就像 'lastname' 和 arg3 是//CUSTOMER/LASTNAME等等。正如我所说,不要认为这里无关紧要)

这就是为什么我想检查空值,我想你的代码应该对我有帮助 - 不幸的是它不起作用。我的表单不再崩溃,但数据也没有填充到xf:inputs中。也许是因为这个误会?谢谢。

<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 表达式?

最新更新