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

发布于 2024-11-05 17:08:13 字数 2018 浏览 5 评论 0原文

我有一个关于格式化 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>

注意 的输出。 的内容是 sum() 未修改/未格式化的输出。 的内容是我希望在 XSLT 和 XQuery 中格式化数字的方式。

问题是在 XQuery 中,format-number() 不可用。如何在 XSLT 和 XQuery 中以相同的方式格式化 sum() 的结果,以便结果显示为

我是否需要创建一个函数,将 sum() 的输出作为字符串并自己处理小数?在这种情况下,我需要将 .659 舍入为 .66。我希望有更好的方法来做到这一点(也许将结果转换为不同的类型,然后??)。

感谢您提供的任何信息/指导。

I have a question about formatting the output of the sum() function in XQuery/XSLT/XPath. I have both an XSLT stylesheet and also an XQuery. I'm able to get the correct formatting in the XSLT, but not in the XQuery.

Here is an example input file:

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

Here is an example stylesheet:

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

Here is the output:

<results>
   <cost>713268.49</cost>
   <hours>7743.659999999999</hours>
   <hours-formatted>7743.66</hours-formatted>
</results>

Notice the output of <hours> and <hours-formatted>. The content of <hours> is the unmodified/unformatted output of sum(). The content of <hours-formatted> is the way I want the number formatted in both the XSLT and the XQuery.

The problem is that in XQuery, format-number() is not available. How can I format the results of sum() the same way in both XSLT and XQuery so that the results will appear like <hours-formatted>?

Will I need to create a function that takes the output of sum() as a string and process the decimal myself? In this case I would need to round .659 to .66. I'm hoping there is a better way to do this (maybe cast the results as a different type and then ??).

Thank you for any info/guidance you can provide.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

怪我闹别瞎闹 2024-11-12 17:08:13

Saxon-PE 及更高版本在 XQuery 中提供 format-number() 作为扩展函数(或通过启用 XQuery 3.0 支持)。

但是您可能可以使用 round-half-toeven() 函数来实现您想要的目的。

Saxon-PE and upwards offers format-number() in XQuery as an extension function (or by enabling XQuery 3.0 support).

But you can probably achieve what you want using the round-half-to-even() function.

挽清梦 2024-11-12 17:08:13

此 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

This XQuery expression:

let $sum := string(ceiling(sum(/*/user/@hours) * 100)),
    $length := string-length($sum)
return
  concat(
     substring($sum, 1, $length - 2),
     '.',
     substring($sum, $length - 1)
  )

Output:

7743.66
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文