繁体   English   中英

json 至 csv 使用 xslt

[英]json to csv using xslt

我是 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>

无需将其转换为 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 中的 map 中的条目顺序应该没有意义。 在 XSLT 3.0 中,将 JSON 解析为 map 时,不会保留条目的原始顺序。 如果您知道 JSON 中条目的顺序并想保留它,那么通过 XML 可能是答案,因为json-to-xml() function(与parse-json()不同)确实保留了条目的顺序。

如果您知道 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>

如果您还想要 header 线路。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM