JSON 到 XML 使用 XSLT 3.0 的转换
JSON to XML Transformation using XSLT 3.0
我正在使用 Java 1.8,Saxon-HE 版本 9.9.1-4 和 xslt3.0 将 JSON 转换为 XML。
输入JSON
{
"analystId": "Test",
"jobId": "",
"profileData": {
"allAuthorCoverage": false,
"assetClasses": [
{
"code": "Test1"
}
]
}
}
XSLT3.0
<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="jsonText"/>
<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($jsonText)"/>
</xsl:template>
<xsl:template match="*[@key]" >
<xsl:element name="{@key}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出XML生成
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<analystId xmlns="">Test</analystId>
<jobId xmlns=""/>
<profileData xmlns="">
<allAuthorCoverage>false</allAuthorCoverage>
<assetClasses>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<code xmlns="">Test1</code>
</map>
</assetClasses>
</profileData>
</map>
输出XML 预期
<?xml version="1.0" encoding="UTF-8"?>
<analystId>Test</analystId>
<jobId />
<profileData>
<allAuthorCoverage>false</allAuthorCoverage>
<assetClasses>
<code>Test1</code>
</assetClasses>
</profileData>
我们仍然可以在生成的输出中看到 <map>
元素和 xmlns 属性,我的要求是删除它们。
请帮我从生成的输出和 xmlns 属性中删除 Map 元素。
此外,如果我用新属性扩展我的 json 结构,这些 map 元素和 xmlns 属性不应再次添加回来。
如果您不使用您使用过的标识模板,而是仅省略它,您的模板将具有 key
属性的元素转换为具有 key
值和任何名称的元素文本节点将创建输出:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all">
<xsl:param name="jsonText" as="xs:string"><![CDATA[{
"analystId": "Test",
"jobId": "",
"profileData": {
"allAuthorCoverage": false,
"assetClasses": [
{
"code": "Test1"
}
]
}
}]]></xsl:param>
<xsl:output indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template name="xsl:initial-template">
<xsl:apply-templates select="json-to-xml($jsonText)"/>
</xsl:template>
<xsl:template match="*[@key]" >
<xsl:element name="{@key}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我正在使用 Java 1.8,Saxon-HE 版本 9.9.1-4 和 xslt3.0 将 JSON 转换为 XML。
输入JSON
{
"analystId": "Test",
"jobId": "",
"profileData": {
"allAuthorCoverage": false,
"assetClasses": [
{
"code": "Test1"
}
]
}
}
XSLT3.0
<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="jsonText"/>
<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($jsonText)"/>
</xsl:template>
<xsl:template match="*[@key]" >
<xsl:element name="{@key}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出XML生成
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<analystId xmlns="">Test</analystId>
<jobId xmlns=""/>
<profileData xmlns="">
<allAuthorCoverage>false</allAuthorCoverage>
<assetClasses>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<code xmlns="">Test1</code>
</map>
</assetClasses>
</profileData>
</map>
输出XML 预期
<?xml version="1.0" encoding="UTF-8"?>
<analystId>Test</analystId>
<jobId />
<profileData>
<allAuthorCoverage>false</allAuthorCoverage>
<assetClasses>
<code>Test1</code>
</assetClasses>
</profileData>
我们仍然可以在生成的输出中看到 <map>
元素和 xmlns 属性,我的要求是删除它们。
请帮我从生成的输出和 xmlns 属性中删除 Map 元素。
此外,如果我用新属性扩展我的 json 结构,这些 map 元素和 xmlns 属性不应再次添加回来。
如果您不使用您使用过的标识模板,而是仅省略它,您的模板将具有 key
属性的元素转换为具有 key
值和任何名称的元素文本节点将创建输出:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all">
<xsl:param name="jsonText" as="xs:string"><![CDATA[{
"analystId": "Test",
"jobId": "",
"profileData": {
"allAuthorCoverage": false,
"assetClasses": [
{
"code": "Test1"
}
]
}
}]]></xsl:param>
<xsl:output indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template name="xsl:initial-template">
<xsl:apply-templates select="json-to-xml($jsonText)"/>
</xsl:template>
<xsl:template match="*[@key]" >
<xsl:element name="{@key}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>