首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT: Json到给定的xml格式

XSLT: Json到给定的xml格式
EN

Stack Overflow用户
提问于 2020-02-13 08:55:24
回答 2查看 232关注 0票数 1

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

的JSON-文档: report.json

代码语言:javascript
复制
 {
  "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输出应该是什么样子:

代码语言:javascript
复制
<?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经验)。

我能想到的两种方法:

  1. 首先使用json-to- xml (),然后使用XSLT
  2. 转换XML,直接用JSON-value(首选)

填充XML。

但我不知道如何做到这两种方法--最好能提供XSLT教程。

EN

回答 2

Stack Overflow用户

发布于 2020-02-13 11:36:34

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

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

另一种样式是将JSON转换为泛型XML,然后将模板应用于泛型XML以生成特定的XML,它可能更适合于“输入驱动”转换,这种转换的典型形式是“查看输入中接下来的内容,并根据输出中的内容生成X或Y或Z”。

票数 1
EN

Stack Overflow用户

发布于 2020-02-13 11:00:10

为了给您一个示例,说明如何对XPath值进行操作,这些值在XPath 3.1数据模型中表示为映射和数组,您可以用属性名称(用于映射/对象)或索引(对于数组)调用这些函数,因为这里的参数是一个简单的XQuery 3.1代码,它直接填充您的XQuery(我只为几个值输入了XPath表达式,您应该能够填充其余的):

代码语言:javascript
复制
<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>{.("01 Tester")("01 Name")}</Name>
        <Version>{.("01 Tester")("04 Release Level")}</Version>
        <UserID>{.("01 Tester")("03 Node Name")}</UserID>
        <ExecutionTime>{.("Diagnostic Cycle")}</ExecutionTime>
    </ServiceTool>
    <VehicleInformation>
        <IdentificationNumberValue>{.("02 Device Name")("SampleECU")("03 VIN original")}</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>

这假设JSON是有效的JSON,类似于

代码语言:javascript
复制
{
  "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"     : 8,
      "12 Hardware Patch"    : 0,
      "20 Software Year"     : 2020,
      "21 Software Week"     : 8,
      "22 Software Patch"    : 0,
      "30 Bootware"          : "ERROR 11"
    }
}
}

并在XQuery中作为上下文项提供,例如与declare context item := json-doc('file.json');一起提供。

Saxon 9支持XQuery 3.1和XSLT3,因此,只要您有要填充的简单XQuery文档,使用XQuery似乎要比使用XSLT容易一些,因为模板没有样板。

在线例子是在https://xqueryfiddle.liberty-development.net/bFDbxkV

因此,需要了解的主要问题是,JSON对象{ "foo" : 1, "bar": "value" }表示为映射,这也是可以使用属性名称(例如.("foo").("bar"))调用以选择属性的函数。对于包含空格的JSON属性名称,这似乎是可行的方法,对于我所展示的简单示例,?foo?bar就足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60203794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档