使用XSLT 3.0函数将JSON转换为XML [英] Convert JSON to XML using XSLT 3.0 functions

查看:159
本文介绍了使用XSLT 3.0函数将JSON转换为XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am new to XSLT, I have a simple JSON which I want to transform to an XML using XSLT 3.0. I tried parsejson and jsontoxml functions as per w3c recommendations, but produced output is not in desired format. I am using Saxonica processor for the purpose. Is it possible to write a single xslt which can be used in any given json of a particular structure irrespective of key names. Otherwise how can I approach to convert a json to desired xml using xslt features

我尝试了答案中的示例:[ XSLT 3.0中从JSON到XML的转换,但对我不起作用

I tried the example in the answer: [JSON to XML transformation in XSLT 3.0, but is not working for me

输入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);
        }

推荐答案

使用给定的输入来解决该问题很简单

It is trivial to solve that for your given input with

<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>

但是,将JSON属性名称与空格或冒号或XML元素名称中不允许使用的其他字符一起使用将很容易破坏该方法.

however using JSON property names with spaces or colons or other characters not allowed in XML element names would break that approach easily.

这篇关于使用XSLT 3.0函数将JSON转换为XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆