为啥 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(<number xmlns='http://www.w3.org/2005/xpath-functions'>1234567</number>, map 'number-formatter' : function($x) $x )
输出为1234567
。
@MichaelKay,Martin Honnen:非常好。答案已更新。谢谢你们!以上是关于为啥 xml-to-json 函数返回指数符号?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 numpy.power 为小指数返回 0 而 math.pow 返回正确答案?