Каково поведение функции ROUND в Orbeon Forms? - PullRequest
2 голосов
/ 18 июля 2011

В Orbeon Forms (dev-post-3.7.1.200911140400) у нас есть код в XPL, который выполняет некоторые вычисления, и часть этого вычисления заключается в том, что мы округляем результат до 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>

В соответствии со стандартной документацией XPATH о функции ROUND; Округляет числовое значение до ближайшего целого числа, округляя x.5 до положительной бесконечности.

Но мы сталкиваемся со случаем, когда функция ROUND округляет 237,5 до 237 вместо 238. Это всего лишь пример, есть другие случаи, когда возникает аналогичная проблема, связанная с x.5.

Например, упомяните, значения в расчете:

$total_p_c_w = 7.6, $total_c_w = 3.2

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

Alex, Спасибо за руководство. Я сделал еще несколько отладок и обнаружил что-то странное, пожалуйста, обратитесь к следующему коду XSL, который я тестировал на последних версиях Orbeon Forms 3.9.0.201105152046 CE.

<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 Ответ

1 голос
/ 18 июля 2011

Я получаю результат 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 как таковых, а в реализации XSLT, которую использует Orbeon Forms, что является отличным Saxon .)

...