【问题标题】:Convert JSON to XML using XSLT 3.0 functions使用 XSLT 3.0 函数将 JSON 转换为 XML
【发布时间】:2017-12-01 09:15:11
【问题描述】:

我是 XSLT 的新手,我有一个简单的 JSON,我想使用 XSLT 3.0 将其转换为 XML。我按照 w3c 的建议尝试了 parsejson 和 jsontoxml 函数,但生成的输出不是所需的格式。我为此目的使用 Saxonica 处理器。是否可以编写单个 xslt,该 xslt 可用于特定结构的任何给定 json,而与键名无关。否则我该如何使用 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);
        }

【问题讨论】:

  • 好吧,问题是 {"key 1" : 1} 作为 JSON 与您想要的格式会导致元素名称 key 1 这是不允许的名称。这就是json-to-xml 函数返回的格式将 JSON 属性名称放入属性的原因。因此,在编写从您当前获得的 XML 到您想要的转换的转换时,对于您呈现的输入来说是微不足道的,但通常不清楚您想要什么结果。
  • @MartinHonnen:感谢您的回答和关于键空间的说明。我想我必须在将 json 传递给 xslt 处理器之前处理这个问题。我说的对吗?

标签: json xml xslt xpath saxon


【解决方案1】:

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

<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 属性名称会很容易破坏这种方法。

【讨论】:

  • 非常感谢。这正是我想要的。我想将 JSON 转换为 xml 并应用进一步的 xslt 函数来操作数据以创建平面 xml。
  • 您可能需要额外的规则,例如,处理嵌套数组:关键是在 XML 中表示此类结构没有单一的通用方式,因此您必须做出自己的选择。跨度>
猜你喜欢
  • 2019-12-28
  • 1970-01-01
  • 2018-08-03
  • 2020-01-26
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
相关资源
最近更新 更多