使用Java:数字格式问题的XSL转换



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

此处Amount属性的值应为52982。请帮助。

使用

<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只有单个数字类型,它是 double 类型。

与任何浮点类型一样,有精度错误。

在XPATH 2.0/XSLT 2.0中,一个人可以使用xs:decimal类型,以便消除任何精度错误 - 当然,xs:decimal类型具有定义的最大数字数量。


供参考,这是使用xs:decimal的相应XSLT 2.0转换:

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

尝试

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

您以前的方法的问题是您将Value格式化为字符串,然后将其转换回一个数字并将其乘以100。您需要对原始数字进行乘法,然后将结果格式化。

您可以使用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>

相关内容

  • 没有找到相关文章

最新更新