Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用XSLT 3.0实现JSON到XML的转换_Java_Xml_Saxon_Xslt 3.0 - Fatal编程技术网

Java 使用XSLT 3.0实现JSON到XML的转换

Java 使用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" }

我正在使用Java1.8、SaxonHE9.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>
我们仍然可以在生成的输出中看到
元素和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>