PHP yerel geçtikten sonra XSLT'de hesaplamak mümkün değildir

2 Cevap php

"," Yerine almak için "." ondalık noktası olarak, ben setlocale ("de_DE") aracılığıyla yerel ayarı;.

Ben şimdi böyle bir hesaplamayı içeren bir XSLT stil dönüşümü zaman:

<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 döndürür.

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

bana iyi bir "0,5", getiriyor. Ama $ a +2 sonucu NaN beklediğim değildir.

Neden $ a metin contverted mi? Ben hesaplama yanlış yapıyorum? Bu davranış, bir hata mı?


Anlatabildim için. Bu XSLT'dan doğru bir davranış mı?

<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 -->


Komple test kodu:

<?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 Cevap

Bunu yapmak için XSLT'de sağlanan yapıları vardır:

  1. Bir decimal-format "," ondalık ayırıcı olarak ile bildirin.
  2. Kullanarak format-number function and specify the declared decimal-format.

Note: decimal-format stylesheet üst düzeyde beyan edilmelidir.

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

Eğer numaraları ile biçimlendirilmiş istediğinizde "," format-number ile kullanmak decimal-format:

<xsl:value-of select="format-number($a+2, '###.###,00', 'european')"/>

Ne karıştırma çıkış biçimi ve sayısal bir değerdir. Xsl ifadeler nedenle ondalık virgül değerinin geçerli bir parçası olarak görmedim, lokalize değildir.