JSON 到 XML 使用 XSLT 3.0 进行对话
JSON to XML conversing USING XSLT 3.0
我使用 Windows 和 SAXON 9.9(HE).
我的JSON代码是:
{"analystId": "Test","jobId": "","profileData":{"allAuthorCoverage": false,"abc":"xyz","assetClasses":[{"status": "Test1"}]}}
我的 XSLT 代码是:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:param name="input" select="'simple3.json'"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template name="init">
<xsl:apply-templates select="json-to-xml(unparsed-text($input))" mode="copy"/>
</xsl:template>
<xsl:template match="node() | @*" mode="copy">
<xsl:copy>
<xsl:apply-templates select="node() | @*" mode="copy"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我需要的输出 XML 是:
<root>
<analystId>Test</analystId>
<jobId></jobId>
<profileData>
<allAuthorCoverage>false</allAuthorCoverage>
<abc>xyz</abc>
</profileData>
</root>
如何做到这一点?
在 XSLT 3.0 中有多种方法可以实现这种转换。
一种方法是使用json-to-xml()
,然后转换结果XML。结果 XML 是
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<string key="analystId">Test</string>
<string key="jobId"/>
<map key="profileData">
<boolean key="allAuthorCoverage">false</boolean>
<string key="abc">xyz</string>
<array key="assetClasses">
<map>
<string key="status">Test1</string>
</map>
</array>
</map>
</map>
并且您可以使用
等通用规则对其进行转换
<xsl:template match="*[@key]">
<xsl:element name="{@key}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
或使用特定规则,例如:
<xsl:template match="fn:string[@key='analystId']>
<analystId>{.}</analystId>
</xsl:template>
或两者的某种组合。
第二种方法是为所需的输出编写一个模板 XML,然后深入解析 JSON 以在需要的地方提取特定值:
<xsl:template name="xsl:initial-template">
<xsl:variable name="json" select="parse-json(....)"/>
<root>
<analystId>{$json?analystId}</analystId>
<jobId>{$json?jobId}</jobId>
<profileData>
<allAuthorCoverage>{$json?profileData?allAuthorCoverage}</allAuthorCoverage>
<abc>{$json?profileData?abc}</abc>
</profileData>
</root>
</xsl:template>
对于这个简单的示例,第二种方法可能是最简单的,但我怀疑第一种方法可以更好地扩展到更复杂的实际用例。
我使用 Windows 和 SAXON 9.9(HE).
我的JSON代码是:
{"analystId": "Test","jobId": "","profileData":{"allAuthorCoverage": false,"abc":"xyz","assetClasses":[{"status": "Test1"}]}}
我的 XSLT 代码是:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:param name="input" select="'simple3.json'"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template name="init">
<xsl:apply-templates select="json-to-xml(unparsed-text($input))" mode="copy"/>
</xsl:template>
<xsl:template match="node() | @*" mode="copy">
<xsl:copy>
<xsl:apply-templates select="node() | @*" mode="copy"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我需要的输出 XML 是:
<root>
<analystId>Test</analystId>
<jobId></jobId>
<profileData>
<allAuthorCoverage>false</allAuthorCoverage>
<abc>xyz</abc>
</profileData>
</root>
如何做到这一点?
在 XSLT 3.0 中有多种方法可以实现这种转换。
一种方法是使用json-to-xml()
,然后转换结果XML。结果 XML 是
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<string key="analystId">Test</string>
<string key="jobId"/>
<map key="profileData">
<boolean key="allAuthorCoverage">false</boolean>
<string key="abc">xyz</string>
<array key="assetClasses">
<map>
<string key="status">Test1</string>
</map>
</array>
</map>
</map>
并且您可以使用
等通用规则对其进行转换<xsl:template match="*[@key]">
<xsl:element name="{@key}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
或使用特定规则,例如:
<xsl:template match="fn:string[@key='analystId']>
<analystId>{.}</analystId>
</xsl:template>
或两者的某种组合。
第二种方法是为所需的输出编写一个模板 XML,然后深入解析 JSON 以在需要的地方提取特定值:
<xsl:template name="xsl:initial-template">
<xsl:variable name="json" select="parse-json(....)"/>
<root>
<analystId>{$json?analystId}</analystId>
<jobId>{$json?jobId}</jobId>
<profileData>
<allAuthorCoverage>{$json?profileData?allAuthorCoverage}</allAuthorCoverage>
<abc>{$json?profileData?abc}</abc>
</profileData>
</root>
</xsl:template>
对于这个简单的示例,第二种方法可能是最简单的,但我怀疑第一种方法可以更好地扩展到更复杂的实际用例。