[英]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> </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('
')
"/>
这假定名称“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=" "/>
</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>
如果您还想要 header 线路。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.