利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)

Posted muzizongheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)相关的知识,希望对你有一定的参考价值。

最近在做Abp升级到abp vnext的时候, 发现旧版abp的本地化资源是xml, 新版abp vnext是json。 好吧, 得写个xslt来转换下。  然后就发现这个事情没那么容易。   

xslt默认的output的method没有json。


<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
        结论:  如果我们需要xml转为json的话, 我们需要做2个步骤:
  1. 把method改为text
  2. 使用xslt3.0 中的xml-to-json()方法
    这其中需要注意的是xmltojson的方法只支持特定的xml格式,即以map为根节点,各种原生类型为子节点,每个子节点带key属性,每个子节点的text为value。 比如:
<?xml version="1.0" encoding="gb2312"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
       <string key="Sunday">和呵呵呵爱的色放啊阿斯顿发射点阿斯顿发射点阿斯顿发1</string>
       <string key="Monday">阿斯蒂芬阿斯蒂芬阿斯蒂芬阿斯顿发射点2</string>
</map>

 

当你的xml是上述格式时, 才可以用下面的xslt转换xml为json 具体xslt如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:math="http://www.w3.org/2005/xpath-functions/math"  xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"  xmlns:emp="http://www.semanticalllc.com/ns/employees#"  xmlns:h="http://www.w3.org/1999/xhtml"  xmlns:fn="http://www.w3.org/2005/xpath-functions"  xmlns:j="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xs math  xd h emp" version="3.0" expand-text="yes">
       <xsl:output method="text" indent="yes" encoding="GB2312"  media-type="text/json" omit-xml-declaration="yes"/>
       <xsl:template match="/">
              <xsl:value-of select="xml-to-json(., map  'indent' : true())"/>
       </xsl:template>
</xsl:stylesheet>

 

  上面xslt需要关系的由3点:1. version为3; 2.output 的method,并且encoding为GB2312, 原因是我发现encoding设为utf-8时生成的text为乱码; 3.是调用xml-to-json方法。 最终转换的json如下;

   "Sunday": "和呵呵呵爱的色放啊阿斯顿发射点阿斯顿发射点阿斯顿发1",
   "Monday": "阿斯蒂芬阿斯蒂芬阿斯蒂芬阿斯顿发射点2"

 

  有些人说, 如果我们的xml不是上述的<map>的样子了? 是不是就不能用xml to json了? 那岂不是这个xslt 3.0自带的这个很鸡肋? 其实我们只要多做一步即可, 即我们再写一个xslt, 把自己的初始xml转换为xmltojson要求的json即可。   比如我的原始xml为:
<?xml version="1.0" encoding="UTF-8"?>
<lib>
       <text key="Definition" value="管理"/>
</lib>

 

那我首先写一个中间转换的xslt,如下:
<?altova_samplexml rvs.resource.xml?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:fn="http://www.w3.org/2005/xpath-functions"  xmlns:math="http://www.w3.org/2005/xpath-functions/math"  xmlns:array="http://www.w3.org/2005/xpath-functions/array"  xmlns:map="http://www.w3.org/2005/xpath-functions/map"  xmlns:xhtml="http://www.w3.org/1999/xhtml"  xmlns:err="http://www.w3.org/2005/xqt-errors" exclude-result-prefixes="array fn  map math xhtml xs err" version="3.0">
       <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
       <xsl:template match="/lib">
              <map xmlns="http://www.w3.org/2005/xpath-functions">
              
                     <xsl:for-each select="./text">
                           <string>
                                  <xsl:attribute name="key"><xsl:value-of  select="./@key"></xsl:value-of></xsl:attribute>
                                  <xsl:value-of select="./@value"/>
                           </string>
                     </xsl:for-each>
              </map>
       </xsl:template>
</xsl:stylesheet>

 

转换后的xml如下;
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
       <string key="Definition">管理</string>
</map>

 

  最后再调用我们上面转换的xslt得到结果为:

   "Definition": "管理"

 

  参考: https://www.w3school.com.cn/xsl/el_output.asp https://stackoverflow.com/questions/48947872/xslt-3-0-json-to-xml-and-xml-to-json-conversion

以上是关于利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)的主要内容,如果未能解决你的问题,请参考以下文章

利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)

利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)

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

XSLT 3.0 - 无法在 XSLT 3.0 xml-to-json() 中获取对象数组

XSLT 3.0 - 在 XSLT 3.0 xml-to-json() 中出现错误“重复键值”

xslt 3.0 json-to-xml 和 xml-to-json 转换