将嵌套 JSON 解析为 CSV
Parsing nested JSON to CSV
我正在尝试使用 XSLT 转换将嵌套 JSON 解析为 CSV。
在这种特殊情况下,每个子对象都从“datasheet”开始计数,例如“result-sheet”和“balance-sheet”应该分别以一个 CSV 文件(输出)结束。然而,目前我只是在阐述如何只输出“result-sheet”。
我注意到数组的内容正在合并在一起。
数据:
<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>
</xsl:text>
<xsl:value-of select="*/(string-join(head(*)/*/@key, ','), *!string-join(*, ','))" separator=" "/>
</xsl:template>
</xsl:stylesheet>
结果:
Result sheet
bank,credit
13,26
45,90
想要的结果:
bank,credit
1, 2,
3, 6
我不太明白你想在每一行中包含哪些数据,以下模板在两个 [=13= 中的每对 fn:number
元素上使用 for-each-pair
创建一行] fn:map
的 children,@key
为 result-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=" "/>
</xsl:template>
我正在尝试使用 XSLT 转换将嵌套 JSON 解析为 CSV。 在这种特殊情况下,每个子对象都从“datasheet”开始计数,例如“result-sheet”和“balance-sheet”应该分别以一个 CSV 文件(输出)结束。然而,目前我只是在阐述如何只输出“result-sheet”。
我注意到数组的内容正在合并在一起。
数据:
<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>
</xsl:text>
<xsl:value-of select="*/(string-join(head(*)/*/@key, ','), *!string-join(*, ','))" separator=" "/>
</xsl:template>
</xsl:stylesheet>
结果:
Result sheet
bank,credit
13,26
45,90
想要的结果:
bank,credit
1, 2,
3, 6
我不太明白你想在每一行中包含哪些数据,以下模板在两个 [=13= 中的每对 fn:number
元素上使用 for-each-pair
创建一行] fn:map
的 children,@key
为 result-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=" "/>
</xsl:template>