如何停止 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 实现相同的结果。

因此,除非您愿意将&lt;number key="price"&gt;1234567&lt;/number&gt; 更改为&lt;string key="price"&gt;1234567&lt;/string&gt;(当然可以通过中间转换步骤来完成),否则我认为您无法使用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() 中出现错误“重复键值”

BizTalk 2020 XSLT 3.0 - 样式表编译期间报告错误

如何使用 XSLT 3.0 中的 xsl:stream、xsl:accumulator、xs:fork?