Xml 在XQuery/XSLT/XPath中格式化sum()函数的输出
我对XQuery/XSLT/XPath中的Xml 在XQuery/XSLT/XPath中格式化sum()函数的输出,xml,xslt,xpath,xquery,Xml,Xslt,Xpath,Xquery,我对XQuery/XSLT/XPath中的sum()函数的输出格式有一个问题。我有一个XSLT样式表和一个XQuery。我能够在XSLT中获得正确的格式,但在XQuery中不能 以下是一个示例输入文件: <userTotals> <user cost="138764.63" hours="1506.51"/> <user cost="329555.76" hours="3577.85"/> <user cost="213909.81" hou
sum()
函数的输出格式有一个问题。我有一个XSLT样式表和一个XQuery。我能够在XSLT中获得正确的格式,但在XQuery中不能
以下是一个示例输入文件:
<userTotals>
<user cost="138764.63" hours="1506.51"/>
<user cost="329555.76" hours="3577.85"/>
<user cost="213909.81" hours="2322.33"/>
<user cost="22684.85" hours="246.28"/>
<user cost="6147.42" hours="66.74"/>
<user cost="1269.27" hours="13.78"/>
<user cost="181.45" hours="1.97"/>
<user cost="755.30" hours="8.2"/>
</userTotals>
下面是一个示例样式表:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/userTotals">
<results>
<cost><xsl:value-of select="sum(user/@cost)"/></cost>
<hours><xsl:value-of select="sum(user/@hours)"/></hours>
<hours-formatted>
<xsl:value-of select="format-number(sum(user/@hours),'###.##')"/>
</hours-formatted>
</results>
</xsl:template>
</xsl:stylesheet>
以下是输出:
<results>
<cost>713268.49</cost>
<hours>7743.659999999999</hours>
<hours-formatted>7743.66</hours-formatted>
</results>
713268.49
7743.659999999999
7743.66
注意
和
的输出。
的内容是sum()
的未修改/未格式化输出。
的内容是我希望在XSLT和XQuery中格式化数字的方式
问题是在XQuery中,format-number()
不可用。如何在XSLT和XQuery中以相同的方式格式化sum()
的结果,使结果看起来像
我是否需要创建一个函数,将sum()
的输出作为字符串,并自己处理十进制数?在这种情况下,我需要将.659
四舍五入到.66
。我希望有一个更好的方法来做到这一点(也许把结果转换成不同的类型,然后??)
感谢您提供的任何信息/指导。此XQuery表达式:
let $sum := string(ceiling(sum(/*/user/@hours) * 100)),
$length := string-length($sum)
return
concat(
substring($sum, 1, $length - 2),
'.',
substring($sum, $length - 1)
)
输出:
7743.66
此XQuery表达式:
let $sum := string(ceiling(sum(/*/user/@hours) * 100)),
$length := string-length($sum)
return
concat(
substring($sum, 1, $length - 2),
'.',
substring($sum, $length - 1)
)
输出:
7743.66
Saxon PE及以上版本在XQuery中提供format-number()作为扩展函数(或通过启用XQuery 3.0支持)
但是,使用round-half-to-even()函数可能可以实现您想要的功能。Saxon PE及以上在XQuery中提供format-number()作为扩展函数(或通过启用XQuery 3.0支持)
但是,使用round-half-to-even()函数可能可以实现您想要的功能。我还应该注意,我使用的是Saxon 9处理器。我还应该注意,我使用的是Saxon 9处理器。我认为您需要
round
而不是天花
?Mousio是对的。7743.99455的输出为7744.00。将天花板正确地改为圆形会得到7743.99。@DevNull:不客气。我原以为问题出在格式上(保留两个小数位数),但如果这不重要(1.50
与1.5
),你应该按照凯博士的回答使用。我认为你需要圆形
而不是天花板
?穆西奥是对的。7743.99455的输出为7744.00。将天花板正确地改为圆形会得到7743.99。@DevNull:不客气。我原以为问题出在格式上(保留两个小数位数),但如果这不重要(1.50
与1.5
),您应该使用KayRound博士回答的-half-to-even()有一个(可选)精度参数;除此之外,它的舍入方式也不同于round():将半个偶数舍入为最接近的偶数。小时数已经以所需的精度提供,因此我认为在实践中,所有内部表示错误总计达到该精度的一半的可能性确实很小,更不用说超过一半…+1,因为如果没有有效数字是可选的,这是自然的答案。Round-half-to-even()有一个(可选)精度参数;除此之外,它的舍入方式也不同于round():将半个偶数舍入为最接近的偶数。小时数已经以所需的精度提供,因此我认为在实践中,所有内部表示错误总计达到该精度的一半的可能性确实很小,更不用说超过一半…+1,因为如果不选择有效数字,这是自然的答案。