我的 XForm 中有几个控件,我们只称它们为 x 和 y。
x 的值为 8;y 的值为 8.000 我将约束设置为:$x = $y
显然,XForms 不认为这些值是相等的,无论数据类型是双精度还是十进制。
一种解决方案是:$x - $y = 0
但是 XForms 会有舍入错误吗?所以现在它需要是这样的:abs($x - $y) < 0.00001
有绝对值函数吗?
对于应该很简单的事情来说,这似乎很混乱。有没有更简单的方法让 XForm 考虑 8 = 8.000?
我不知道那种语言,但在伪代码中:
设置一些非常小的 $epsilon := .00001
然后检查 $x - $y < $epsilon
这显然不会捕获所有舍入错误,但只要您的应用程序没有做任何太重要的事情(如果是的话,您无论如何都不应该使用浮点数)这应该认为 8 和 8.000 相同。
编辑:我注意到你已经想出了这个答案,所以忽略这个:)
您需要先转换该值,然后再进行比较。
<xforms:input
ref="foo"
xxforms:format="format-number(xs:integer(.), '###,##0')"/>
有关更多信息,请参阅此链接。
number() 解决了这个问题,也不需要定义数据类型。请参阅下面的简单代码。
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
xmlns:xforms="http://www.w3.org/2002/xforms">
<xhtml:head>
<xhtml:title>Xforms</xhtml:title>
<xforms:model>
<xforms:instance id="main-instance">
<form>
<nodes>
<x>8</x>
<y>8.00</y>
</nodes>
</form>
</xforms:instance>
<xforms:bind id="x" nodeset="instance('main-instance')/nodes/x" />
<xforms:bind id="y" nodeset="instance('main-instance')/nodes/y" />
</xforms:model>
</xhtml:head>
<xhtml:body>
<table>
<tr>
<td>
X is
<xforms:output bind="x">
<xforms:alert>Invalid</xforms:alert>
</xforms:output>
</td>
</tr>
<tr>
<td>
Y is
<xforms:output bind="y">
<xforms:alert>Invalid</xforms:alert>
</xforms:output>
</td>
</tr>
<tr>
<td>
<strong>X = Y ? </strong>
<xforms:output value="instance('main-instance')/nodes/x = instance('main-instance')/nodes/y">
<xforms:alert>Invalid</xforms:alert>
</xforms:output>
</td>
</tr>
<tr>
<td>
<strong>(using number function) X = Y ? </strong>
<xforms:output value="number(instance('main-instance')/nodes/x) = number(instance('main-instance')/nodes/y)">
<xforms:alert>Invalid</xforms:alert>
</xforms:output>
</td>
</tr>
</table>
</xhtml:body>
</xhtml:html>
但是,当我们将数据类型作为 xforms:decimal 给两个节点并且不使用 number 函数时,它将不起作用(条件返回 false)。