为什么 xml-to-json 函数返回指数表示法?

问题描述

我的所有 XSLT 在使用 xml-to-json() 函数时都可以正常工作,除了这一部分,

<number key="send_at">
    <xsl:text>1615842000</xsl:text>
</number>

哪个返回

"send_at":1.615842E9

当我打算得到这个结果时:

"send_at":1615842000

解决方法

XPath 3.1 (当前)

根据规范 (XPath and XQuery Functions and Operators 3.1),将数字转换为指数表示法是正确的:

17.5.4 fn:xml-to-json

规则

输入树中的节点通过应用以下规则进行处理, 递归。

  1. 一个名为 number 的元素 $E 导致输出 xs:string(xs:double(fn:string($E))) 的字符串结果

fn:xml-to-json 函数确实允许使用 $options 参数,它为依赖于实现的扩展提供了一种方法。 Saxon 10.5 已经利用这种机制来支持传递值,而不考虑 JSON 有效性:1

map{'number-formatter':function($x){$x}}

XPath 4 (即将推出)

格式化程序是 fn:xml-to-json planned for XPath 4 的官方支持选项:2

number-formatter:确定数值的格式。

  • 输入(function(xs:string) as xs:string)?
  • 默认()

1 感谢 Michael Kay 注意到这个机制(并预见到它的需要(并且已经在 Saxon 10.5 中实现了它))。
2 感谢 Martin Honnen 注意到此 XPath 4 更新。