2

私はJDK6を持っており、変換にJAXPを使用しています。私はXSLTの初心者です。

ソースXML:

<Number>
    <Value>529.82</Value>
</Number>

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="Number">
        <xsl:element name="Result">
            <xsl:element name="Total">
                <xsl:attribute name="Amount">
                    <xsl:value-of select="format-number(Value, '#.00')*100"/>
                </xsl:attribute>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

出力XML:

<?xml version="1.0" encoding="UTF-8"?>
<Result>
     <Total Amount="52982.00000000001"/>
</Result>

ここでは、属性の値はAmount52982である必要があります。助けてください。

4

3 に答える 3

3

使用:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="Number">
     <Result>
      <Total amount="{round(format-number(Value, '#.00')*100)}"/>
     </Result>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<Number>
    <Value>529.82</Value>
</Number>

必要な正しい結果が生成されます。

<Result>
   <Total amount="52982"/>
</Result>

説明:

XSLT 1.0 には数値型が 1 つだけあり、それはdouble型です。

他の浮動小数点型と同様に、精度エラーがあります。

XPath 2.0 / XSLT 2.0 では、xs:decimal型を使用できるため、精度エラーがなくなります。もちろん、xs:decimal型には最大桁数が定義されています。


参考までに、 を使用した対応する XSLT 2.0 変換を次に示しますxs:decimal

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="Number">
     <Result>
      <Total amount="{xs:decimal(format-number(Value, '#.00'))*100}"/>
     </Result>
 </xsl:template>
</xsl:stylesheet>

結果:

<Result>
   <Total amount="52982"/>
</Result>

またはさらに単純です(なしformat-number()):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="Number">
     <Result>
      <Total amount="{xs:decimal(Value)*100}"/>
     </Result>
 </xsl:template>
</xsl:stylesheet>
于 2012-10-30T14:41:55.127 に答える
1

機能を使用できますround()format-number()呼び出しをラップするだけです。次のスタイルシートはトリックを行います:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="Number">
        <xsl:element name="Result">
            <xsl:element name="Total">
                <xsl:attribute name="Amount">
                    <xsl:value-of select="round(format-number(Value, '#.00')*100)"/>
                </xsl:attribute>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
于 2012-10-30T14:41:39.203 に答える
1

試す

<xsl:value-of select="format-number(Value*100, '#')"/>

以前のアプローチの問題は、Valueを文字列にフォーマットし、それを数値に変換して 100 倍することです。元の数値に乗算を行い、結果をフォーマットする必要があります。

于 2012-10-30T14:41:13.197 に答える