为啥 xml-to-json 函数返回指数符号?

Posted

技术标签:

【中文标题】为啥 xml-to-json 函数返回指数符号?【英文标题】:Why is xml-to-json function returning exponential notation?为什么 xml-to-json 函数返回指数符号? 【发布时间】:2021-07-10 00:18:20 【问题描述】:

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

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

返回

"send_at":1.615842E9

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

"send_at":1615842000

【问题讨论】:

谢谢@jag959。 【参考方案1】:

XPath 3.1 (当前)

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

17.5.4 fn:xml-to-json

规则

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

    一个元素$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 更新。

【讨论】:

或者您将不得不等待 XPath 4,其中 qt4cg.org/branch/master/xpath-functions-40/… 建议您可以插入自己的 number-formatter 以“确定数值的格式:”Type: (function(xs:string) as xs:string)? 事实上,Saxon 10.5 实现了这个提议的扩展,尽管它还没有进入文档。例如,您可以使用map'number-formatter':function($x)$x,它将输出以 XML 形式写入的值(无论它在 JSON 中是否有效)。 @kjhughes “对于特定于实现的选项似乎没有任何余地”。其实是有的。 F+O 规范的第 1.5 节说“如果选项映射包含名称与本规范中描述的名称不同的选项,这不是错误。实现可能会为这些条目附加一个·实现定义的含义……”跨度> @MichaelKay,这很酷,即使是 Saxon HE 10.5 似乎也将xml-to-json(&lt;number xmlns='http://www.w3.org/2005/xpath-functions'&gt;1234567&lt;/number&gt;, map 'number-formatter' : function($x) $x ) 输出为1234567 @MichaelKay,Martin Honnen:非常好。答案已更新。谢谢你们!

以上是关于为啥 xml-to-json 函数返回指数符号?的主要内容,如果未能解决你的问题,请参考以下文章

为啥函数返回的值总是 null 或 undefined?

为啥 numpy.power 为小指数返回 0 而 math.pow 返回正确答案?

指数函数底数为啥不能是负数,如果是负数会怎样

为啥我的基本指数函数不起作用? [关闭]

XSLT 3.0 - 无法在 XSLT 3.0 xml-to-json() 中获取对象数组

第九十四章 SQL函数 %MINUS