2010-12-06 11 views
3

私のXMLに-1.8959581529998104E-4という値があります。私はこれを-0.000189595815299981を与えるためにXSLを使用するべき正確な数字にフォーマットしたいと思う。xslでの科学数表現の書式設定

フォーマット番号(-1.8959581529998104E-4、 '0.000000; -0.000000')は私にNaNを与えます。

アイデア?

乾杯

Andez

答えて

14

XSLT 1.0は、科学的表記法をサポートしていません。

この:number('-1.8959581529998104E-4') 結果:NaN

この:number('-0.000189595815299981') 結果:-0.000189595815299981

XSLT 2.0は、科学表記

をサポートしていますこの:number('-1.8959581529998104E-4') 結果:-0.000189595815299981

EDIT:非常に単純なXSLT 1.0の回避策:この入力で

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="number[substring-after(.,'E')]"> 
     <xsl:variable name="vExponent" select="substring-after(.,'E')"/> 
     <xsl:variable name="vMantissa" select="substring-before(.,'E')"/> 
     <xsl:variable name="vFactor" 
      select="substring('100000000000000000000000000000000000000000000', 
           1, substring($vExponent,2) + 1)"/> 
     <xsl:choose> 
      <xsl:when test="starts-with($vExponent,'-')"> 
       <xsl:value-of select="$vMantissa div $vFactor"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$vMantissa * $vFactor"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

<number>-1.8959581529998104E-4</number> 

出力:

-0.00018959581529998104 
+0

@Alejandro、おかげで再び!私はIDEでVS2008を使用して動作するように私の変換を取得しようとしています。 xslにバージョン2.0を使用させるために何かする必要がありますか? Ie ? – Andez

+0

MSDNフォーラムを見て、バージョン2.0はVS2008ではサポートされていません。 :-( – Andez

+0

@Andez:XSLT 2.0の実装を使用できるように見えますが、VSとリンクすることはできません。リンク:http://stackoverflow.com/questions/4099051/saxon-with-visual-studio- 2010-is-there-a-way-to-use-the-debugger –

0

ちょうどバージョン1.1にlibxslt1.1を使ってxsltprocのでこれを試してみました.24 Linuxの下で:

XSLT 1.1は指数関数的に/特別なテンプレートがなくても科学的なフォーマットになっても、それは単純にうまくいくようです:-))

3

これはuser357812答えに基づいています。これは、科学的表記法と小数点以下の値の組み合わせを処理する必要があります

<xsl:template match="X"> 
    <X> 
     <xsl:call-template name="convertSciToNumString"> 
      <xsl:with-param name="inputVal" select="text()"/> 
     </xsl:call-template> 
    </X>  
</xsl:template> 

:しかし、私はそれが

<xsl:template name="convertSciToNumString" > 
    <xsl:param name="inputVal" select="0"/> 
    <xsl:variable name="vExponent" select="substring-after($inputVal,'E')"/> 
    <xsl:variable name="vMantissa" select="substring-before($inputVal,'E')"/> 
    <xsl:variable name="vFactor" 
     select="substring('100000000000000000000000000000000000000000000', 
          1, substring($vExponent,2) + 1)"/> 
    <xsl:choose> 
     <xsl:when test="number($inputVal)=$inputVal"> 
      <xsl:value-of select="$inputVal"/> 
     </xsl:when> 
     <xsl:when test="starts-with($vExponent,'-')"> 
      <xsl:value-of select="format-number($vMantissa div $vFactor, '#0.#############')"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="format-number($vMantissa * $vFactor, '#0.#############')"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

使用法を関数のように機能し、非科学的な表記法を処理しました。テンプレートなしの

1

もう一つの可能​​な回避策:

<xsl:stylesheet version="1.0" ... xmlns:java="http://xml.apache.org/xslt/java"> 
... 
<xsl:value-of select="format-number(java:java.lang.Double.parseDouble('1E-6'), '0.000')"/>