【问题标题】:JSON to XML Transformation using XSLT 3.0使用 XSLT 3.0 将 JSON 转换为 XML
【发布时间】:2019-12-28 20:52:31
【问题描述】:

我正在使用 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>

我们仍然可以在生成的输出中看到 &lt;map&gt; 元素和 xmlns 属性,我的要求是删除它们。

请帮我从生成的输出和 xmlns 属性中删除 Map 元素。

如果我用新属性扩展我的 json 结构,这些 map 元素和 xmlns 属性不应再次添加回来。

【问题讨论】:

  • 您需要编辑您的问题并向我们展示您想要输出的 XML。
  • 首先,如果您不想从输入中复制节点,我只需从您显示的代码中删除 xsl:template match="@* | node()"
  • [~Martin] 很抱歉没有添加预期的输出。我已经为参考添加了预期的输出
  • 那么我认为我的回答涵盖了这一点,你只是在你的代码中放置了一个带有身份转换的模板,你应该省略。
  • @JineshParikh 感谢您分享这个主题,我正在编写类似的代码,您能否与我分享一个 java 代码 sn-p,关于您如何将 jsonText 参数传递给 XSL样式表?或任何有助于理解转换流程的代码示例。谢谢。

标签: java xml saxon xslt-3.0


【解决方案1】:

如果您不使用已使用的标识模板,而仅省略它,则仅将具有 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>

【讨论】:

  • 感谢您的回答。有效 。我还有一个简单的问题。如果我将 json-to-xml($jsonText) 放在 xslt 的变量中。如何从具有整个 XML 的变量中访问各个元素。
  • 您正在使用 XSLT 3,其中访问节点的选择语言通常或当然还有 XML 文档中的元素(无论它是否是从 JSON 创建的)是 XPath 3,因此您选择具有您需要的任何 XPath 3 表达式的元素。 XML 的格式在 w3.org/TR/xslt-30/#json-to-xml-mapping 中进行了描述,对于您的示例 JSON,您可以通过输出 &lt;xsl:sequence select="json-to-xml($jsonText)"/&gt; 来查看它。
  • 元素位于命名空间http://www.w3.org/2005/xpath-functions 中,因此使用例如声明xmlns:fn="http://www.w3.org/2005/xpath-functions" 并选择例如//fn:map[@key = 'profileData'].
  • 感谢@Martin honnen 的帮助我还有其他一些问题,但让我尝试解决它,如果没有,我会在这里提出来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2020-01-26
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多