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

我是 xslt 的新手。

我正在尝试使用 xslt 将 json 转换为 csv。

这是输入的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>

【问题讨论】:

    标签: json xml csv xslt


    【解决方案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 以及如何它失败了。
      猜你喜欢
      • 2019-02-02
      • 2017-05-23
      • 2011-10-28
      相关资源
      最近更新 更多