我有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
attribue的值应为52982。
请帮忙。
答案 0 :(得分: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只有一个数字类型,它是 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>
答案 1 :(得分:1)
尝试
<xsl:value-of select="format-number(Value*100, '#')"/>
您之前方法的问题在于您将Value
格式化为字符串,然后将其转换回数字并将其乘以100.您需要对原始数字进行乘法,然后格式化结果。
答案 2 :(得分: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>