问题:我有一个给定的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经验)。
我能想到的两种方法:
填充XML。
但我不知道如何做到这两种方法--最好能提供XSLT教程。
发布于 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”。
发布于 2020-02-13 11:00:10
为了给您一个示例,说明如何对XPath值进行操作,这些值在XPath 3.1数据模型中表示为映射和数组,您可以用属性名称(用于映射/对象)或索引(对于数组)调用这些函数,因为这里的参数是一个简单的XQuery 3.1代码,它直接填充您的XQuery(我只为几个值输入了XPath表达式,您应该能够填充其余的):
<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,类似于
{
"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就足够了。
https://stackoverflow.com/questions/60203794
复制相似问题