【问题标题】:After parsing JSON file data, add comments to result XML解析 JSON 文件数据后,在结果 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>

【问题讨论】:

    标签: json xml xslt xslt-2.0 xslt-3.0


    【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        • 2011-06-09
        • 2012-06-27
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 2012-08-15
        相关资源
        最近更新 更多