Orbeon Forms中的ROUND函数行为是什么?

时间:2011-07-18 17:05:54

标签: orbeon

在Orbeon Forms(dev-post-3.7.1.200911140400)中,我们在XPL中有代码进行一些计算,并且这个计算的一部分是我们将结果ROUND到2个小数位。下面是我们用于计算的代码示例:

<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函数的舍入值为237.5到237,而不是238.这只是一个例子,还有其他一些情况,其中涉及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 个答案:

答案 0 :(得分:1)

我得到238通过XSLT沙箱在夜间构建中运行以下样式表的结果(如果您在本地安装了Orbeon Forms,则可以通过http://localhost:8080/orbeon/sandbox-transformations/xslt/访问)。

<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沙箱中尝试上面的例子吗?如果您收到的是237而不是238,则表明此问题已得到解决,我建议您升级到较新版本的Orbeon Forms(目前为3.9)。

(请注意,这很可能不是Orbeon Forms本身的东西,而是在Orbeon Forms使用的XSLT实现中,这是非常好的Saxon。)