如何停止 xslt3.0 的 xml-to-json() 函数将数字转换为指数表示法
Posted
技术标签:
【中文标题】如何停止 xslt3.0 的 xml-to-json() 函数将数字转换为指数表示法【英文标题】:How to stop xml-to-json() function of xslt3.0 to convert number to exponent notation 【发布时间】:2018-10-02 15:52:12 【问题描述】:我正在使用 Saxon 9.8 HE 使用 xslt 3.0 的 xml-to-json() 函数将 xml 转换为 json。我遇到的问题是我的 Number 值正在转换为指数(科学记数法)。我希望输出与我在输入 xml 中传递的相同。
xsltfiddle 链接 https://xsltfiddle.liberty-development.net/94hvTyT
输入xml
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<map key="Request">
<number key="price">1234567</number>
</map>
</map>
请注意,此 xml 也是使用 xslt 3.0 的 json-to-xml() 函数生成的
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="xml-to-json(., map 'indent' : true() )"/>
</xsl:template>
</xsl:stylesheet>
输出
"Request" :
"price" : 1.234567E6
期望的输出
"Request" :
"price" : 1234567
任何解决方案/建议对我来说都会有很大帮助。
【问题讨论】:
【参考方案1】:结果如https://www.w3.org/TR/xpath-functions/#func-xml-to-json 中指定的那样
一个名为数字的元素 $E 导致字符串结果的输出 xs:string(xs:double(fn:string($E)))
您将获得与其他 XPath/XQuery 3.1 实现或 XSLT 3.0 实现相同的结果。
因此,除非您愿意将<number key="price">1234567</number>
更改为<string key="price">1234567</string>
(当然可以通过中间转换步骤来完成),否则我认为您无法使用xml-to-json
阻止大数的指数格式。
【讨论】:
感谢马丁的回复。你是对的,按照规范不能避免指数数字格式。我用中间步骤用字符串替换数字并得到相同的字符串结果。以上是关于如何停止 xslt3.0 的 xml-to-json() 函数将数字转换为指数表示法的主要内容,如果未能解决你的问题,请参考以下文章
使用 XSLT 3.0 的 JSON 到 XML - 如何加载 JSON 源并调用 json-to-xml 函数?
Marklogic xml 转换中的 XSLT 3.0 支持
XSLT 3.0 - 无法在 XSLT 3.0 xml-to-json() 中获取对象数组
XSLT 3.0 - 在 XSLT 3.0 xml-to-json() 中出现错误“重复键值”