首页 > 解决方案 > XSLT:Json 到给定的 xml 格式

问题描述

问题:我有一个给定的 JSON 输出,需要将其转换为具有给定格式的 xml 以将其用于另一个输入。

JSON 文档: report.json

 {
  "Diagnostic Cycle" : "2019-02-13T08:19:44ZZ",
    "01 Tester" : {
      "01 Name"              : "IPTester",
      "02 Operating System"  : "Linux",
      "03 Node Name"         : "tester15",
      "04 Release Level"     : "5.4.7",
      "06 Machine"           : "i686",
      "07 Domain Name"       : "(none)" 
    } 
,
    "02 Device Name" : 
{

      "SampleECU":
      {
      "01 Diagnostic"        : "OK",
      "02 CAN Id"            : "(none)",
      "02 DoIP Id"           : "00FFh 124Ah 85B1h",
      "03 VIN original"      : "BZ7282399843",
      "04 VIN current"       : "ERROR 11",
      "05 HW Part No"        : "887895414",
      "06 DTC Status 01"     : 1,
      "10 Hardware Year"     : 2020,
      "11 Hardware Week"     : 08,
      "12 Hardware Patch"    : 0,
      "20 Software Year"     : 2020,
      "21 Software Week"     : 08,
      "22 Software Patch"    : 0,
      "30 Bootware"          : "ERROR 11"
    }
}

XML 输出的外观:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="./My_Stylesheet.xsl"?>
<VehicleReport xsi:schemaLocation="http://www.w3.org/xsd/vdx30 VDX.3.2.1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VDXVersion="3.2.1" xmlns="http://www.w3.org/xsd/vdx30">
    <ServiceTool>
        <Name>IPTester</Name>
        <Version>5.4.7</Version>
        <UserID>tester15</UserID>
        <ExecutionTime>2019-02-13T08:19:44ZZ</ExecutionTime>
    </ServiceTool>
    <VehicleInformation>
        <IdentificationNumberValue>BZ7282399843</IdentificationNumberValue>
    </VehicleInformation>
    <ComponentList>
        <Component>
            <ECUShortName>SampleECU</ECUShortName>
            <DiagnosticInfo>
                <DiagnosticInfoValue>1</DiagnosticInfoValue>
            </DiagnosticInfo>
            <SWHWInformation>
                <Software>
                    <Version>
                        <VersionValue>20/08/00</VersionValue>
                    </Version>
                </Software>
                <Hardware>
                    <PartNumber>
                        <PartNumberValue>887895414</PartNumberValue>
                    </PartNumber>
                    <Version>
                        <VersionValue>20/08/00</VersionValue>
                    </Version>
                </Hardware>
            </SWHWInformation>
        </Component>
      </ComponentList>
</VehicleReport>

我听说我应该使用 Saxon XSLT 处理器进行 XSLT 转换,但我不知道如何(没有 XSLT 经验)。

我能想到的两种方式:

  1. 首先使用 json-to-xml() 然后使用 XSLT 转换 xml
  2. 使用 JSON 值直接填充 XML(因为简单所以首选)

但我不知道如何做到这两点 - XSLT 教程将不胜感激。

标签: jsonxmlxsltsaxonsaxon-c

解决方案


这两种方法都是可能的。Martin 向您说明了第一种方法(使用 json-doc() 或 parse-json() 将 JSON 转换为映射和数组,然后通过选择这些映射和数组来填充 XML 文档。另一种方法是转换为“通用”XML,然后使用模板规则转换通用 XML。

转换(无论是 XML 到 XML 还是 JSON 到 XML)通常要么是输入驱动的,要么是输出驱动的。在像您这样的示例中,输出的结构与输入的结构几乎没有关系,您需要输出驱动:也就是说,样式表将采用“通过从 /a/b/c 中获取 /a/b/c 来生成 XXX”的形式输入,然后通过从输入中获取 /p/q/r 来生成 YYY”。这是使用马丁提出的解决方案风格的一个强有力的指标。

另一种风格,您将 JSON 转换为通用 XML,然后将模板应用于通用 XML 以生成您的特定 XML,可能更适合“输入驱动”转换,它采用典型的形式“看看接下来会发生什么”输入,并根据您的发现在输出中生成 X 或 Y 或 Z”。


推荐阅读