利用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个步骤:
- 把method改为text
- 使用xslt3.0 中的xml-to-json()方法
<?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() 中获取对象数组