0

我的 XForm 中有几个控件,我们只称它们为 x 和 y。

x 的值为 8;y 的值为 8.000 我将约束设置为:$x = $y

显然,XForms 不认为这些值是相等的,无论数据类型是双精度还是十进制。

一种解决方案是:$x - $y = 0

但是 XForms 会有舍入错误吗?所以现在它需要是这样的:abs($x - $y) < 0.00001

有绝对值函数吗?

对于应该很简单的事情来说,这似乎很混乱。有没有更简单的方法让 XForm 考虑 8 = 8.000?

4

3 回答 3

1

我不知道那种语言,但在伪代码中:

设置一些非常小的 $epsilon := .00001

然后检查 $x - $y < $epsilon

这显然不会捕获所有舍入错误,但只要您的应用程序没有做任何太重要的事情(如果是的话,您无论如何都不应该使用浮点数)这应该认为 8 和 8.000 相同。

编辑:我注意到你已经想出了这个答案,所以忽略这个:)

于 2012-08-09T20:11:50.473 回答
1

您需要先转换该值,然后再进行比较。

<xforms:input
  ref="foo"
  xxforms:format="format-number(xs:integer(.), '###,##0')"/>

有关更多信息,请参阅此链接

于 2012-08-09T20:19:56.603 回答
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)。

于 2012-08-13T05:32:47.220 回答