我有一个 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:input
但arg1
类似于 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
. 也许是因为这个误会?谢谢。