使用 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> </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('
')
"/>
这假定名称“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=" "/>
</xsl:template>
</xsl:stylesheet>
或者使用
<xsl:template match="/" name="xsl:initial-template">
<xsl:value-of select="$json-xml/*/(string-join(head(*)/*/@key, ','), *!string-join(*, ','))" separator=" "/>
</xsl:template>
如果你也想要一个标题行。
【讨论】:
马丁感谢您的宝贵时间。但是这里有一个问题..如果数据本身有逗号,那么它的处理方式。我的假设是,如果数据有逗号,那么它应该在双引号内。示例:- “vi,ek” 如果需要在 json 数据中有更多的深度,可以同样应用吗?喜欢:"datasheets": "result-sheet": "bank": 1,"balance-sheet": "credit": 2 @Toolbox,也许试一试,如果你不能让它工作,然后发布一个问题,显示你有什么输入,你想要什么结果,你有哪个 XSLT 以及如何它失败了。以上是关于使用 xslt 将 json 转换为 csv的主要内容,如果未能解决你的问题,请参考以下文章
使用 SaxonEE 和 Python 使用 XSLT 转换 JSON
使用 Python 或 XSLT 将复杂的 XML 转换为 CSV