将嵌套的 JSON 解析为 CSV

问题描述

我正在尝试使用 XSLT 转换将嵌套的 JSON 解析为 CSV。 在这种特殊情况下,每个子对象从“数据表”开始计数,例如“结果表”和“资产负债表”应分别以一个 CSV 文件输出)结束。然而,目前我只是在详细说明如何获得“结果表”。

我注意到数组的内容正在合并在一起。

数据:

<data>
{
  "datasheets": {
    "result-sheet": {"bank": [1,3],"credit": [2,6]},"balance-sheet": {"loans": [4,5],"inventory": [9,0]}
  }
}
</data>

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:array="http://www.w3.org/2005/xpath-functions/array"
  >

<xsl:output method="text" indent="yes"/>
<xsl:mode on-no-match="shallow-skip"/>

    <!-- Parse JSON to XML -->
    <xsl:template match="data">
          <xsl:apply-templates select="json-to-xml(.)"/>
    </xsl:template>

  <xsl:template match="*">
    <h2>Result sheet</h2>
    <xsl:text>&#xa;</xsl:text>
    <xsl:value-of select="*/(string-join(head(*)/*/@key,','),*!string-join(*,'))" separator="&#10;"/>
  </xsl:template>
</xsl:stylesheet>

结果:

Result sheet
bank,credit
13,26
45,90

想要的结果:

bank,credit
1,2,3,6

解决方法

我不太明白您想要在每一行中包含哪些数据,以下模板在两个 for-each-pair 子项中的每对 fn:number 元素上使用 fn:array 创建一行fn:map@keyresult-sheet

  <xsl:template match="*:map[@key = 'result-sheet']">
    <xsl:value-of select="for-each-pair(*:array[1]/*:number,*:array[2]/*:number,function($n1,$n2) { $n1 || ',' || $n2 })"
      separator="&#10;"/>
  </xsl:template>