Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在XQuery/XSLT/XPath中格式化sum()函数的输出_Xml_Xslt_Xpath_Xquery - Fatal编程技术网

Xml 在XQuery/XSLT/XPath中格式化sum()函数的输出

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

我对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" 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,因为如果不选择有效数字,这是自然的答案。