Java 使用XSLT 3.0实现JSON到XML的转换
我正在使用Java1.8、SaxonHE9.9.1-4版本和xslt3.0将JSON转换为XML 输入JSONJava 使用XSLT 3.0实现JSON到XML的转换,java,xml,saxon,xslt-3.0,Java,Xml,Saxon,Xslt 3.0,我正在使用Java1.8、SaxonHE9.9.1-4版本和xslt3.0将JSON转换为XML 输入JSON { "analystId": "Test", "jobId": "", "profileData": { "allAuthorCoverage": false, "assetClasses": [ { "code": "Test1" }
{
"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>
我们仍然可以在生成的输出中看到
元素和xmlns属性,我的要求是删除它们
请帮助我从生成的输出和xmlns属性中删除Map元素
此外,如果我用新属性扩展json结构,则不应再次添加这些映射元素和xmlns属性。如果您不使用您使用的标识模板,而只忽略它,则只需将带有
键的属性的元素转换为键的名称的元素,并且任何文本节点都将创建输出:
<?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>
您需要编辑您的问题,并向我们显示您想要输出的XML。首先,如果您不想从输入中复制节点,我只需从您显示的代码中删除xsl:template match=“@*|node()”
。[~Martin]为没有添加预期输出表示歉意。我已经为引用添加了预期的输出当我认为我的答案涵盖了这一点时,您只是在代码中添加了一个带有标识转换的模板,您应该忽略它。您预期的输出不是XML文件,而是可以作为片段包含的。你确定这就是你想要的吗?谢谢你的回答。成功了。我还有一个简单的问题。如果我将json转换为xslt中变量中的xml($jsonText)。如何从包含整个XML的变量中访问各个元素。您使用的是XSLT 3,在XSLT 3中,用于访问节点的选择语言(当然也包括XML文档中的元素)(无论是从JSON创建的)是XPath 3,因此您可以选择具有所需XPath 3表达式的元素。XML的格式如中所述,对于示例JSON,您可以通过输出
来查看它。元素位于命名空间http://www.w3.org/2005/xpath-functions
so声明,例如xmlns:fn=”http://www.w3.org/2005/xpath-functions“
并选择,例如,//fn:map[@key='profileData']
。感谢您的帮助@Martin honnen我还有一些其他问题,但请让我尝试解决,如果没有,我会在这里提出
<?xml version="1.0" encoding="UTF-8"?>
<analystId>Test</analystId>
<jobId />
<profileData>
<allAuthorCoverage>false</allAuthorCoverage>
<assetClasses>
<code>Test1</code>
</assetClasses>
</profileData>
<?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>