我有一个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中我有很多参数,而不仅仅是arg1
,arg2
,它看起来更像是
<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'
。也许是因为这种误解?感谢。
答案 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()
电话。你想要变量保持: