2011-07-18 4 views
2

Orbeonフォーム(dev-post-3.7.1.200911140400)では、XPLにいくつかの計算を行うコードがあり、この計算の一部は結果を小数点以下2桁に丸めます。以下は、計算を行うために使用するコードの例です。OrbeonフォームのROUND関数の動作は何ですか?

<xsl:when test="$total_c_w != 0"> 
    <gpa><xsl:value-of select="(round(($total_p_c_w div $total_c_w) * 100) div 100)"/></gpa> 
</xsl:when> 

ROUND関数に関する標準的なXPATHのドキュメントによると、 x.5を正の無限大に向かって四捨五入して、数値を最も近い整数に丸めます。

しかしROUND関数が238ではなく237.5から237に丸められている場合があります。これは単なる例であり、x.5を含む同様の問題が発生している場合もあります。例えば、言及について

、計算の値は、次のとおり

$total_p_c_w = 7.6, $total_c_w = 3.2 

============================ ===========================

アレックス、 ガイダンスをありがとう。私はいくつかのデバッグを行い、最新のOrbeon Forms 3.9.0.201105152046 CEでテストした次のXSLコードを参照してください。

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xsl:template match="/"> 
    <main> 
     <xsl:variable name="tppcw" select="/root/studentpcw/total_p_c_w" as="xs:double"/> 
     <xsl:variable name="tccw" select="/root/studentpcw/total_c_w" as="xs:double"/>    
     <xsl:variable name="tpcw" select="sum(/root/studentpcw/total_p_c_w)"/> 
     <xsl:variable name="tcw" select="sum(/root/studentpcw/total_c_w)"/>   
     <xsl:variable name="total_p_c_w" select="7.6"/> 
     <xsl:variable name="total_c_w" select="3.2"/>  
    <var1><xsl:value-of select="sum(/root/studentpcw/total_p_c_w)"/></var1> 
    <var2><xsl:value-of select="sum(/root/studentpcw/total_c_w)"/></var2> 
    <var3><xsl:value-of select="$total_p_c_w"/></var3> 
    <var4><xsl:value-of select="$total_c_w"/></var4>   
    <result1> 

     <xsl:value-of select="round(($total_p_c_w div $total_c_w) * 100)"/> 
    </result1> 
    <result2> 

     <xsl:value-of select="round(($tppcw div $tccw) * 100)"/> 
    </result2> 
    </main> 
    </xsl:template> 
</xsl:transform> 

は、このサンプル文書で上記のコードを適用します。

<root> 
    <studentpcw> 
    <total_p_c_w>7.6</total_p_c_w> 
    <total_c_w>3.2</total_c_w> 
    </studentpcw> 
</root> 

結果は全く予想外です。

<main xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <var1>7.6</var1> 
    <var2>3.2</var2> 
    <var3>7.6</var3> 
    <var4>3.2</var4> 
    <result1>238</result1> 
    <result2>237</result2> 
</main> 

問題は、私は変数にリテラル数を割り当て、丸め関数でその変数を使用する場合、結果は私は予想通りであることです。ノードから値を選択して変数に代入し、その変数を丸め関数で使用すると、結果は間違っているか、予期しないものになります。

答えて

1

XSLTサンドボックス(Orbeonフォームがローカルにインストールされている場合は、http://localhost:8080/orbeon/sandbox-transformations/xslt/からアクセスできます)を使用して、夜間ビルドで次のスタイルシートを実行すると、238という結果が得られます。

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xsl:template match="/"> 
     <result> 
      <xsl:variable name="total_p_c_w" select="7.6"/> 
      <xsl:variable name="total_c_w" select="3.2"/> 
      <xsl:value-of select="round(($total_p_c_w div $total_c_w) * 100)"/> 
     </result> 
    </xsl:template> 
</xsl:transform> 

私は、これはあなたが期待した結果ですが、あなたが使用しているバージョンと別の何かを得るかもしれないと信じています。あなたは使用しているバージョンのXSLTサンドボックスで上記の例を試すことができますか? 238の代わりに237が表示されている場合、これはこの問題が修正されたという兆候です。新しいバージョンのOrbeon Forms(現在は3.9)にアップグレードすることをお勧めします。

は(これが最も可能性が高いそれ自体Orbeonフォームで何かではなく、XSLTの実装Orbeonフォームに優れSaxonある、使用することに注意してください。)

+0

アレックス、 あなたは上記の私の調査結果についてどう思いますか? Orbeon Formsが数値を選択し、それを後続の計算に使用する方法にバグのようです。 – Hoi

+1

Hoi、これは 'xs:double'と' xs:decimal'の違いです。 '$ tppcw div $ tccw'を実行すると、' 2.375'ではなく '2.3749999999999996'が得られます。これは' xs:double'を使っているためです。ほとんどの場合、あなたが望むことはしません。代わりに、 'xs:decimal'を使います。あなたのコードでは、 'as =" xs:double "を' as = "xs:decimal" 'で置き換えると、期待通りの結果が得られます。 – avernet

関連する問題