Не удается рассчитать в XSLT после переключения языка PHP - PullRequest
1 голос
/ 15 ноября 2009

Чтобы получить "," вместо "." в качестве десятичной точки я устанавливаю локаль через setlocale ("de_DE");.

Когда я теперь преобразую таблицу стилей XSLT, которая содержит вычисления, подобные:

<xsl:variable name="a">
   <xsl:choose>
      <xsl:when test="$someboolean">
         <xsl:value-of select="0.5"/>
      </xsl:when>
      <xsl:otherwise>
         <xsl:value-of select="0"/>
      </xsl:otherwise>
   </xsl:choose>
</xsl:variable>
<xsl:value-of select="$a + 2"/>

возвращает NaN.

<xsl:value-of select="$a"/>

приносит мне "0,5", что хорошо. Но NaN в результате $ a + 2 - это не то, что я ожидал.

Почему $ превращается в текст? Я делаю расчет неправильно? Является ли это поведение ошибкой?


Чтобы я прояснил. Это правильное поведение XSLT?

<xsl:variable name="a"><xsl:value-of select="0.5"/></xsl:variable>
<xsl:value-of select="$a"/> <!-- gives 0,5 --> 
<xsl:value-of select="$a + 2"/> <!-- gives NaN --> 
<xsl:variable name="b" select="0.5"/> 
<xsl:value-of select="$b"/> <!-- gives 0,5 --> 
<xsl:value-of select="$b + 2"/> <!-- gives 2,5 -->

Полный код тестирования:

<?php
printf("%.1f",0.5);  // gives 0.5
setlocale (LC_ALL, 'de_DE.utf8', 'de_DE@euro', 'de_DE', 'deu_deu', 'deu', 'de', 'ge');
printf("%.1f",0.5);  // gives 0,5

$xml = new DOMDocument;
$xml->loadXML('<a>a</a>');

$xsl = new DOMDocument;
$xsl->substituteEntities = TRUE;
$xsl->loadXML('
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="/">
            <xsl:variable name="a"><xsl:value-of select="0.5"/></xsl:variable>
            <xsl:value-of select="$a"/>      <!-- gives 0,5 -->
            <xsl:value-of select="$a + 2"/>  <!-- gives NaN -->

            <xsl:variable name="b" select="0.5"/>
            <xsl:value-of select="$b"/>      <!-- gives 0,5 -->
            <xsl:value-of select="$b + 2"/>  <!-- gives 2,5 -->
        </xsl:template>
    </xsl:stylesheet>');

$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);

echo $proc->transformToXML($xml);

?>

Ответы [ 2 ]

1 голос
/ 15 ноября 2009

В XSLT предусмотрены конструкции для этого:

  1. Объявите десятичный формат с "," в качестве десятичного разделителя.
  2. Используйте функцию format-number и укажите объявленный десятичный формат .

Примечание: десятичный формат должен быть объявлен на верхнем уровне таблицы стилей.

<xsl:decimal-format name="european" decimal-separator=',' grouping-separator='.' />

Если вы хотите, чтобы ваши числа были отформатированы с помощью ",", используйте format-number с десятичным форматом :

<xsl:value-of select="format-number($a+2, '###.###,00', 'european')"/>
0 голосов
/ 15 ноября 2009

То, что вы смешиваете, это формат вывода и числовое значение. Выражения xsl не локализованы, поэтому десятичная запятая не рассматривается как допустимая часть значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...