2011-07-18 55 views
2

在Orbeon Forms(dev-post-3.7.1.200911140400)中,我們在XPL中有代碼進行一些計算,並且計算的一部分是我們將結果返回到2個小數位。以下是我們用來計算的代碼示例:Orbeon Forms中的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函數將237.5變爲237而不是238的情況。這僅僅是一個示例,還有其他情況下涉及x.5的類似問題正在發生。

例如提及,在計算中的值是:

$total_p_c_w = 7.6, $total_c_w = 3.2 

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

Alex, 感謝您的指導。我做了一些更多的調試並發現了一些奇怪的東西,請參考我在最新的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

我得到238的結果,通過XSLT沙盒(如果您有本地安裝的Orbeon表單,您可以通過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形式本身,而是在XSLT實現Orbeon形式使用,這是極好的Saxon。)

+0

亞歷克斯, 你怎麼看待我的發現上面?就像Orbeon Forms處理選擇數字值的方式看起來像一個錯誤,然後用它來進行後續計算。 – Hoi

+1

Hoi,這是'xs:double'和'xs:decimal'之間的區別。如果你只是運行'$ tppcw div $ tccw',你會得到'2.3749999999999996',而不是'2.375',這是因爲你使用了'xs:double',在大多數情況下它不會做你想要的。相反,請使用'xs:decimal'。在你的代碼中,用'as =「xs:decimal」'替換'as =「xs:double」',你會得到預期的結果。 – avernet

相關問題