【问题标题】: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。

标签: json xml xslt xslt-3.0 xml-to-json


【解决方案1】:

XPath 3.1 (当前)

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

17.5.4 fn:xml-to-json

规则

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

  1. 一个元素$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:非常好。答案已更新。谢谢你们!
猜你喜欢
  • 2011-01-04
  • 2010-12-09
  • 1970-01-01
  • 2020-07-06
  • 2017-07-16
  • 2019-02-27
  • 2020-10-01
  • 1970-01-01
  • 2015-08-10
相关资源
最近更新 更多