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是空字符串(这意味着在我的表单中,当我按下控制设置和跳过arg1字段时,只是将其留空)然后我的表单崩溃。当我插入''或除空字符串(asd、q、任何内容)之外的任何内容时,arg1一切正常。所以现在我想做类似的事情

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

它不起作用,显然是因为引号问题(条件必须介于两者之间'',我不能在里面加上任何引号),可能还有其他问题。有人可以帮我解决这个问题吗?提前致谢。

更新 :

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

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

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

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

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

4

1 回答 1

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 表达式?
于 2015-01-03T00:35:34.230 回答