使用 xslt 将 json 转换为 csv

Posted

技术标签:

【中文标题】使用 xslt 将 json 转换为 csv【英文标题】:json to csv using xslt 【发布时间】:2021-01-24 06:58:59 【问题描述】:

我是 xslt 的新手。

我正在尝试。

这是输入的json

[
    
        "id": "1",
        "name": "manu"
    ,
    
        "id": "2",
        "name": "vivek"
    
]

而 XSLT 是:-

我很确定我没有在 select 属性中进行正确的映射。

谁能帮我解决这个问题

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    extension-element-prefixes="math"
    xmlns:math="http://exslt.org/math" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="3.0" xmlns="http://www.w3.org/2005/xpath-functions"  xpath-default-namespace="http://www.w3.org/2005/xpath-functions" expand-text="yes" > 
    <xsl:param name="input"/> 
    <xsl:output method="text"/> 
    
    <xsl:template match="/">
    <xsl:apply-templates/>
    </xsl:template>

<xsl:template name="initial-template"> 
<xsl:variable name="input-as-xml" select="json-to-xml($input)"/> 
       
<xsl:for-each select="$input-as-xml//*">

            
    <xsl:variable name="eachData" select="."></xsl:variable>
    <xsl:choose>
        <xsl:when test="contains($eachData,',')">
            <xsl:value-of select="replace($eachData, ',', ' ')"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$eachData"/>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:if test="position() != last()">
        <xsl:value-of select="','"/>
    </xsl:if>

</xsl:for-each>
<xsl:text>&#10;</xsl:text>
</xsl:template>           
</xsl:stylesheet>

【问题讨论】:

【参考方案1】:

这个不用转成XML,可以直接把JSON转成CSV。

除了对逗号的特殊处理外,应该只是

<xsl:value-of select="
   parse-json($json-string) =>
   array:for-each(function($row)
      $row?id || ',' || $row?name
    =>
   string-join('&#xa;')
"/>

这假定名称“id”和“name”是预先知道的。如果不是,事情会变得有点复杂,因为 JSON 中的映射中条目的顺序应该没有意义。在 XSLT 3.0 中,当您将 JSON 解析为映射时,不会保留条目的原始顺序。如果您知道 JSON 中的条目顺序并希望保留它,那么通过 XML 可能是答案,因为 json-to-xml() 函数(与 parse-json() 不同)确实保留了条目的顺序。

【讨论】:

【参考方案2】:

如果你知道 JSON 的结构只是一个简单的对象数组,你可以使用

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    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"
    exclude-result-prefixes="#all"
    version="3.0">
    
  <xsl:param name="json-string" as="xs:string">[
    
        "id": "1",
        "name": "manu"
    ,
    
        "id": "2",
        "name": "vivek"
    
]</xsl:param>

  <xsl:param name="json-xml" select="json-to-xml($json-string)"/>

  <xsl:output method="text"/>

  <xsl:template match="/" name="xsl:initial-template">
    <xsl:value-of select="$json-xml/*/*!string-join(*, ',')" separator="&#10;"/>
  </xsl:template>
  
</xsl:stylesheet>

或者使用

  <xsl:template match="/" name="xsl:initial-template">
    <xsl:value-of select="$json-xml/*/(string-join(head(*)/*/@key, ','), *!string-join(*, ','))" separator="&#10;"/>
  </xsl:template>

如果你也想要一个标题行。

【讨论】:

马丁感谢您的宝贵时间。但是这里有一个问题..如果数据本身有逗号,那么它的处理方式。我的假设是,如果数据有逗号,那么它应该在双引号内。示例:- “vi,ek” 如果需要在 json 数据中有更多的深度,可以同样应用吗?喜欢:"datasheets": "result-sheet": "bank": 1,"balance-sheet": "credit": 2 @Toolbox,也许试一试,如果你不能让它工作,然后发布一个问题,显示你有什么输入,你想要什么结果,你有哪个 XSLT 以及如何它失败了。

以上是关于使用 xslt 将 json 转换为 csv的主要内容,如果未能解决你的问题,请参考以下文章

使用 SaxonEE 和 Python 使用 XSLT 转换 JSON

使用 XSLT 将 XML 转换为 CSV

使用 Python 或 XSLT 将复杂的 XML 转换为 CSV

使用 XSLT 将 XML 转换为 CSV,用于在单个标记中以空格分隔的多个记录

使用 XSLT 将 XML 转换为 CSV

使用 XSLT 将 XML 转换为多个 CSV