Skip to main content
 首页 » 编程设计

json之使用 XSLT 3.0 函数将 JSON 转换为 XML

2025年05月04日119lidabo

我是 XSLT 新手,我有一个简单的 JSON,我想使用 XSLT 3.0 将其转换为 XML。我按照 w3c 建议尝试了 parsejson 和 jsontoxml 函数,但生成的输出不是所需的格式。我正在使用 Saxonica 处理器来达到此目的。是否可以编写一个可在特定结构的任何给定 json 中使用的单个 xslt,而不管键名称如何。否则我如何使用 xslt 功能将 json 转换为所需的 xml

我尝试了答案中的示例:[ JSON to XML transformation in XSLT 3.0 ,但对我不起作用

输入 JSON

<data>{ 
 
      "Assets": [ 
  { "Asset": {         
        "Open": "25.15", 
        "High": "25.15", 
        "Low": "25.11", 
        "Close": "25.87" 
      }}, 
      { "Asset": {         
        "Open": "25.15", 
        "High": "25.15", 
        "Low": "25.11", 
        "Close": "25.87" 
      }}] 
 
} 
</data> 

预期输出

<data> 
   <Assets> 
      <Asset> 
         <Close>25.87</Close> 
         <High>25.15</High> 
         <Low>25.11</Low> 
         <Open>25.15</Open> 
      </Asset> 
      <Asset> 
         <Close>25.87</Close> 
         <High>25.15</High> 
         <Low>25.11</Low> 
         <Open>25.15</Open> 
      </Asset> 
   </Assets> 
</data> 

我使用 xslt 得到的实际输出

<?xml version="1.0" encoding="UTF-8"?> 
<map xmlns="http://www.w3.org/2005/xpath-functions"> 
   <array key="Assets"> 
      <map> 
         <map key="Asset"> 
            <string key="Open">25.15</string> 
            <string key="High">25.15</string> 
            <string key="Low">25.11</string> 
            <string key="Close">25.87</string> 
         </map> 
      </map> 
      <map> 
         <map key="Asset"> 
            <string key="Open">25.15</string> 
            <string key="High">25.15</string> 
            <string key="Low">25.11</string> 
            <string key="Close">25.87</string> 
         </map> 
      </map> 
   </array> 
</map> 

我的 XSLT 函数

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:xs="http://www.w3.org/2001/XMLSchema" 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> 
</xsl:stylesheet> 

下面是我使用 saxon 进行转换的示例代码

        var xslt = new FileInfo("myxslt.xslt"); 
        var input = new FileInfo("inputxml.xml"); 
 
        // Compile stylesheet 
        var processor = new Processor(true); 
        var compiler = processor.NewXsltCompiler(); 
        var executable = compiler.Compile(new Uri(xslt.FullName)); 
        Serializer serializer = processor.NewSerializer(); 
        serializer.SetOutputFile(txtOutput.Text); 
 
        // Do transformation to a destination 
        var destination = new XdmDestination(); 
        using (var inputStream = input.OpenRead()) 
        { 
            var transformer = executable.Load(); 
            transformer.SetInputStream(inputStream, new Uri(input.DirectoryName)); 
            transformer.Run(serializer); 
        } 

请您参考如下方法:

对于给定的输入解决这个问题很简单

<xsl:template match="data"> 
    <xsl:copy> 
        <xsl:apply-templates select="json-to-xml(.)/*"/> 
    </xsl:copy> 
</xsl:template> 
 
<xsl:template match="*[@key]" xpath-default-namespace="http://www.w3.org/2005/xpath-functions"> 
    <xsl:element name="{@key}"> 
        <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

但是,使用带有空格、冒号或 XML 元素名称中不允许的其他字符的 JSON 属性名称会很容易破坏该方法。