如何停止xslt3.0的xml-to-json()函数将数字转换为指数表示法

时间:2018-04-22 14:13:05

标签: numbers xslt-3.0

我正在使用Saxon 9.8 HE使用xslt 3.0的xml-to-json()函数将xml转换为json。我得到的问题是我的数字值被转换为指数(科学记数法)。我想输出与输入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 个答案:

答案 0 :(得分:3)

结果如https://www.w3.org/TR/xpath-functions/#func-xml-to-json中所述

  

$ E命名数字元素导致字符串结果的输出   of 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