0

私の XForm には 2 つのコントロールがあります。それらを x と y と呼びましょう。

x の値は 8 です。y の値は 8.000 です。制約を次のように設定します: $x = $y

どうやら、XForms は、データ型が double であるか decimal であるかに関係なく、これらの値が等しいとは見なしません。

1 つの解決策は次のとおりです: $x - $y = 0

しかし、XForms には丸め誤差がありますか? したがって、次のようにする必要があります: abs($x - $y) < 0.00001

絶対値関数はありますか?

これは、単純であるべきものにとっては面倒に思えます。XForms で 8 = 8.000 を考慮する簡単な方法はありますか?

4

3 に答える 3

1

値を比較する前に、まず値をキャストする必要があります。

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

詳細については、このリンクを参照してください。

于 2012-08-09T20:19:56.603 に答える
1

私はその言語を知りませんが、疑似コードで:

非常に小さい $epsilon := .00001 を設定します

次に、$x - $y < $epsilon かどうかを確認します

これは明らかにすべての丸めエラーをキャッチするわけではありませんが、アプリケーションが重要なことを何も行っていない限り (そして、とにかく float を使用するべきではありません)、これは 8 と 8.000 を同じと見なす必要があります。

編集:あなたはすでにこの答えを思いついていることに気づいたので、これは無視してください:)

于 2012-08-09T20:11:50.473 に答える
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 として指定すると、機能しません (条件が false を返す)。

于 2012-08-13T05:32:47.220 に答える