Xml 如果XSLT中的值超过两位数,则舍入值
如果XSLT中有两个以上的数字,我想对值进行舍入 输入Xml 如果XSLT中的值超过两位数,则舍入值,xml,xslt,Xml,Xslt,如果XSLT中有两个以上的数字,我想对值进行舍入 输入 3.310 3.245 3.882 1.091 输出应为: <ans> <rt>6.5</rt </ans> 6.5四舍五入=3 (0.51-0.495)*100=1.5 我得到的错误是: 未为类型(xs:string,xs:integer)的参数定义算术运算符。 我正在使用XSLT 2.0,请检查以下代码: <xsl:template match="table/tr">
3.310
3.245
3.882
1.091
输出应为:
<ans>
<rt>6.5</rt
</ans>
6.5四舍五入=3
(0.51-0.495)*100=1.5
我得到的错误是:
未为类型(xs:string,xs:integer)的参数定义算术运算符。
我正在使用XSLT 2.0,请检查以下代码:
<xsl:template match="table/tr">
<xsl:variable name="change" select="td[1]-td[2]"/>
<xsl:variable name="xxx" select="number(format-number($change * 100,'0.0'))"/>
<ans>
<rt>
<xsl:choose>
<xsl:when test="$change mod 1 eq 0">
<xsl:value-of select="round($xxx)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round($xxx)"/>
</xsl:otherwise>
</xsl:choose>
</rt>
</ans>
</xsl:template>
请检查以下代码:
<xsl:template match="table/tr">
<xsl:variable name="change" select="td[1]-td[2]"/>
<xsl:variable name="xxx" select="number(format-number($change * 100,'0.0'))"/>
<ans>
<rt>
<xsl:choose>
<xsl:when test="$change mod 1 eq 0">
<xsl:value-of select="round($xxx)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round($xxx)"/>
</xsl:otherwise>
</xsl:choose>
</rt>
</ans>
</xsl:template>
您遇到错误是因为您试图格式化一个已格式化的数字。格式化数字的结果是一个字符串 我不明白你为什么要把数字格式化两次。此外,如果要对数字进行四舍五入,应使用
round()
函数。格式化一个数字不是一回事。比如说,
round(0.5)
返回1,但是
format-number(0.5, '0')
返回0。由于试图格式化已格式化的数字,因此出现错误。格式化数字的结果是一个字符串 我不明白你为什么要把数字格式化两次。此外,如果要对数字进行四舍五入,应使用
round()
函数。格式化一个数字不是一回事。比如说,
round(0.5)
返回1,但是
format-number(0.5, '0')
返回0
逻辑:
如果有两位小数,则四舍五入为一位小数。例如:
(3.310-3.245)*100=6.5
(0.320-0.350)*100=2.95=>四舍五入=3
(0.51-0.495)*100=1.5
我正在使用XSLT2.0
这里有一个正确的解决方案:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="num/text()">
<xsl:value-of select="my:round-two-digits(xs:decimal(.)), '
'"/>
</xsl:template>
<xsl:function name="my:round-two-digits" as="xs:decimal">
<xsl:param name="pNum" as="xs:decimal"/>
<xsl:sequence select=
"if(floor($pNum * 10) eq ($pNum * 10))
then $pNum
else round($pNum)"/>
</xsl:function>
</xsl:stylesheet>
<nums>
<num>6.5</num>
<num>2.95</num>
<num>1.5</num>
</nums>
6.5
3
1.5
注意: 我个人更喜欢使用更紧凑的XPath表达式,因此可以将上述内容改写为:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="num/text()">
<xsl:value-of select="my:round-two-digits(xs:decimal(.)), '
'"/>
</xsl:template>
<xsl:function name="my:round-two-digits" as="xs:decimal">
<xsl:param name="pNum" as="xs:decimal"/>
<xsl:sequence select=
"($pNum[floor($pNum * 10) eq ($pNum * 10)],
round($pNum))
[1]"/>
</xsl:function>
</xsl:stylesheet>
逻辑:
如果有两位小数,则四舍五入为一位小数。例如:
(3.310-3.245)*100=6.5
(0.320-0.350)*100=2.95=>四舍五入=3
(0.51-0.495)*100=1.5
我正在使用XSLT2.0
这里有一个正确的解决方案:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="num/text()">
<xsl:value-of select="my:round-two-digits(xs:decimal(.)), '
'"/>
</xsl:template>
<xsl:function name="my:round-two-digits" as="xs:decimal">
<xsl:param name="pNum" as="xs:decimal"/>
<xsl:sequence select=
"if(floor($pNum * 10) eq ($pNum * 10))
then $pNum
else round($pNum)"/>
</xsl:function>
</xsl:stylesheet>
<nums>
<num>6.5</num>
<num>2.95</num>
<num>1.5</num>
</nums>
6.5
3
1.5
注意: 我个人更喜欢使用更紧凑的XPath表达式,因此可以将上述内容改写为:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="num/text()">
<xsl:value-of select="my:round-two-digits(xs:decimal(.)), '
'"/>
</xsl:template>
<xsl:function name="my:round-two-digits" as="xs:decimal">
<xsl:param name="pNum" as="xs:decimal"/>
<xsl:sequence select=
"($pNum[floor($pNum * 10) eq ($pNum * 10)],
round($pNum))
[1]"/>
</xsl:function>
</xsl:stylesheet>
这个问题有些问题。你说:“(0.320-0.350)*100=2.95=>四舍五入=3”,但是(0.320-0.350)是-0.03,整个表达式的计算结果是-3,而不是2.95这个问题有问题。你说:“(0.320-0.350)*100=2.95=>四舍五入=3”,但是(0.320-0.350)是-0.03,整个表达式的计算结果是-3,而不是2.95