解析 JSON 文件数据后,在结果 XML 中添加注释

Posted

技术标签:

【中文标题】解析 JSON 文件数据后,在结果 XML 中添加注释【英文标题】:After parsing JSON file data, add comments to result XML 【发布时间】:2021-08-07 18:56:36 【问题描述】:

由于将解析的 JSON 数据展平,我需要添加一些 cmets 作为标题和代码行分隔符,以便更好地了解 XML 结果。注释字段中的文本可以来自 JSON 中的高级键,也可以只是在创建 cmets 时手动添加。

我尝试在 XSL 中添加创建 cmets 的标准方法,但由于我使用的模板匹配多个节点,结果是 cmets 出现在每个转换后的元素之上的迭代。

如果推荐,也可以通过单独的模板添加 cmets。

您可以在此处找到代码:https://xsltfiddle.liberty-development.net/gVAkJ3X/4

以下是代码的摘录:

JSON 数据:

<data>


  "ix_hidden": [
    
    "CompanyName": "Link Inc",
    "OrganisationNumber": "123"
    
  ],

  "other": [
    
      "SomethingElse": "Juice"
    
  ]



</data>

XSL:

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="3.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xbrli="http://www.example.com/1"
  xmlns:rot="http://www.example.com/2"
  >

  <xsl:output method="xml" indent="yes"/>

<!-- Parse JSON to XML -->

  <xsl:template match="data">
  <report>
    <xsl:apply-templates select="json-to-xml(.)/*"/>
  </report>
</xsl:template>


<!-- Flatten data, exlude high-level key names-->

<xsl:template match="*[@key and not(*)]">
  <xsl:element name="@key">
    <xsl:value-of select="."/>
  </xsl:element>

<!-- Add comments equal as the key values from parsed JSON-->

<!-- Add comment for "ix_hidden" -->
<xsl:comment>Group:ix_hidden</xsl:comment>

<!-- Add comment for "other" -->
<xsl:comment>Group:other</xsl:comment>

</xsl:template>

</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<report xmlns:xbrli="http://www.example.com/1" xmlns:rot="http://www.example.com/2">
   <CompanyName>Link Inc</CompanyName>
   <!--Group:ix_hidden-->
   <!--Group:other-->
   <OrganisationNumber>123</OrganisationNumber>
   <!--Group:ix_hidden-->
   <!--Group:other-->
   <SomethingElse>Juice</SomethingElse>
   <!--Group:ix_hidden-->
   <!--Group:other-->
</report>

想要的结果

<?xml version="1.0" encoding="UTF-8"?>
<report xmlns:xbrli="http://www.example.com/1" xmlns:rot="http://www.example.com/2">
   <!--Group:ix_hidden-->
   <CompanyName>Link Inc</CompanyName>
   <OrganisationNumber>123</OrganisationNumber>
   <!--Group:other-->
   <SomethingElse>Juice</SomethingElse>
</report>

【问题讨论】:

【参考方案1】:

匹配数组并输出注释,然后应用模板:

<!-- Add comments equal as the key values from parsed JSON-->

<xsl:template match="*:map/*:array[@key]">
  <xsl:comment expand-text="yes">Group:@key</xsl:comment>
  <xsl:apply-templates/>
</xsl:template>

【讨论】:

【参考方案2】:

似乎添加带有单独模板的 cmets 效果很好。 https://xsltfiddle.liberty-development.net/gVAkJ3X/5

使用此 XSL 将使 cmets 就位。请注意,注释值是硬编码的,不是从 JSON 解析中获取的。首选的解决方案是将 JSON 键值作为 cmets 重用。

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="3.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  >

  <xsl:output method="xml" indent="yes"/>

<!-- Parse JSON to XML -->

  <xsl:template match="data">
  <report>
    <xsl:apply-templates select="json-to-xml(.)/*"/>
  </report>
</xsl:template>


<!-- Flatten data, exlude high-level key names-->

<xsl:template match="*[@key and not(*)]">
  <xsl:element name="@key">
    <xsl:value-of select="."/>
  </xsl:element>
</xsl:template>

<!-- Add comments equal as the key values from parsed JSON-->

<xsl:template match="fn:array[@key = 'ix_hidden']">
  <xsl:text>&#xa;&#xa;</xsl:text>
  <xsl:comment>ix_hidden</xsl:comment>
  <xsl:text>&#xa;&#xa;</xsl:text>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="fn:array[@key = 'other']">
  <xsl:text>&#xa;&#xa;</xsl:text>
  <xsl:comment>certifications</xsl:comment>
  <xsl:text>&#xa;&#xa;</xsl:text>
  <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>

【讨论】:

以上是关于解析 JSON 文件数据后,在结果 XML 中添加注释的主要内容,如果未能解决你的问题,请参考以下文章

结果文件显示不属于元素匹配的值

引入 jackson-dataformat-xml 后,默认响应结果是 json 还是 xml?

引入 jackson-dataformat-xml 后,默认响应结果是 json 还是 xml?

将 XML 数据解析为 JSON

使用 fs 读取文件后解析 Json

xml解析——增删改查操作后将其修改结果保存