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

Posted

技术标签:

【中文标题】xslt 3.0 json-to-xml 和 xml-to-json 转换【英文标题】:xslt 3.0 json-to-xml and xml-to-json conversion 【发布时间】:2018-08-03 12:15:55 【问题描述】:

目前我需要使用 XSLT 3.0 和 Saxon-HE 将 json 转换为 xml 并将 xml 转换为 json,反之亦然。

下面是我的 json abc.xml 文件

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <data>
        "cars" : [
        "doors" : "4","price" : "6L",
        "doors" : "5","price" : "13L"
        ]
        
    </data>
</root>

下面是xsl文件xyz.xsl

<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"
exclude-result-prefixes="xs math"
version="3.0">

<xsl:output indent="yes"/>

<xsl:template match="data">
    <xsl:copy-of select="json-to-xml(.)"/>
</xsl:template>

下面是输出xml

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
    <array key="cars">
        <map>
            <string key="doors">4</string>
            <string key="price">6L</string>
        </map>
        <map>
            <string key="doors">5</string>
            <string key="price">13L</string>
        </map>
    </array>
</map>

现在我的问题是 如何从 output.xml 中取回相同的 json? 我正在尝试使用 xslt 函数 xml-to-json() 但是输出格式看起来不正确。下面是得到的 xsl 和输出 m。

123.xsl

    <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"
    exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:output indent="yes"/>

    <xsl:template match="data">
        <xsl:copy-of select="xml-to-json(.)"/>
    </xsl:template>


</xsl:stylesheet>

输出 JSON

在这里试试这个例子https://xsltfiddle.liberty-development.net/3NzcBsQ

在 xsl 中,我选择了错误的名为 data 的模板。因为数据模板不在 output.xml 中。我不知道我应该在这里写什么。

<xsl:template match="data">

【问题讨论】:

请向我们展示一个最小但完整的 XSLT 示例,当我尝试使用 xsltfiddle.liberty-development.net/b4GWVd 时,它基本上对您的 XML 执行 &lt;xsl:value-of select="xml-to-json(.)"/&gt;,输出为 "cars":["doors":"4","price":"6L","doors":"5","price":"13L"] 如果您在不调用 xml-to-json() 的情况下输出 XML,则您的输出看起来像预期的那样。你做错了什么,但是如果没有看到调用 xml-to-json() 的代码,我们就看不到什么。 【参考方案1】:

你需要匹配/,如

<?xml version="1.0" encoding="UTF-8"?>
<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(.)"/>
  </xsl:template>

</xsl:stylesheet>

那么结果就是

"cars":["doors":"4","price":"6L","doors":"5","price":"13L"]

  <xsl:template match="/">
      <xsl:value-of select="xml-to-json(., map  'indent' : true() )"/>
  </xsl:template>

尽管撒克逊人在那里做得不好,但你会得到缩进:

   "cars" : 
    [ 
       "doors" : "4",
        "price" : "6L" ,

       "doors" : "5",
        "price" : "13L"  ] 

https://xsltfiddle.liberty-development.net/b4GWVd/1

【讨论】:

以上是关于xslt 3.0 json-to-xml 和 xml-to-json 转换的主要内容,如果未能解决你的问题,请参考以下文章

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

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

如何在 Java 应用程序中使用 XSLT 3.0?

如何修复 XSLT 3.0 地图问题?

Marklogic xml 转换中的 XSLT 3.0 支持

BizTalk Server 2016 映射中是不是支持 XSLT 2.0 或 3.0?