首页 > 解决方案 > xslt 转换(json 到 csv)

问题描述

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

这是我的 XSLT 样式表。

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

当数据本身有逗号时,意味着特定数据应包含在双引号内。

例子:-

[
    {
        "id": "1",
        "name": "ma,nu"
    },
    {
        "id": "2",
        "name": "vivek"
    }
]

电流输出:-

1,ma,nu
2,vivek

例外输出:-

1,"ma,nu"
2,vivek

如何修改上面的xslt?

提前致谢

标签: jsonxslt

解决方案


替换string-join(*, ',')string-join(*!f:escape(.), ',')并编写一个函数

<xsl:function name="f:escape" as="xs:string" expand-text="yes">
  <xsl:param name="in" as="xs:string"/>
  <xsl:choose>
    <xsl:when test="contains($in, ',')">"{$in}"</xsl:when>
    <xsl:otherwise>{$in}</xsl:otherwise>
  </xsl:choose>
</xsl:function>

(但是如果值也包含引号怎么办?此时,CSV 的方言开始做自己的事情......)


推荐阅读