我们正在尝试使用XSLT将XML转换为CSV。我试过这个链接XML to CSV Using XSLT和Converting XML to CSV (using XSLT)。
所述。
Eg:-项目和评级标签包含由空格分隔的多个记录。
输入XML:
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" version="2.0" href = "csvconverted.xsl"?>
<TestData>
<project>Project-1 Project-2 Project-3</project>
<rating>2 3 5</rating>
<date>21-12-2018 21-06-2020 21-12-20</date>
</TestData>XSL:-
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:param name="delim" select="','" />
<xsl:param name="quote" select="'"'" />
<xsl:param name="break" select="'
'" />
<xsl:template match="/">
<xsl:apply-templates select="TestData" />
</xsl:template>
<xsl:template match="TestData">
<xsl:apply-templates />
<xsl:if test="following-sibling::*">
<xsl:value-of select="$break" />
</xsl:if>
</xsl:template>
<xsl:template match="*">
<!-- remove normalize-space() if you want keep white-space at it is -->
<xsl:value-of select="concat($quote, normalize-space(), $quote)" />
<xsl:if test="following-sibling::*">
<xsl:value-of select="$delim" />
</xsl:if>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>预期输出:
project,rating,date
Project-1,2,21-12-2018
Project-2,3,21-06-2020
Project-3,5,21-12-20使用上述代码的实际输出:-
"Project-1 Project-2 Project-3","2 3 5","21-12-2018 21-06-2020 21-12-20"如果你能进一步指导我,我将不胜感激。
发布于 2021-02-09 09:27:04
我将假设您使用的是XSLT1.0处理器,不支持扩展。
我还假设输入XML的结构是预先知道的,唯一变化的是3个空格分隔字符串中的值数。
XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/TestData">
<!-- header -->
<xsl:text>project,rating,date </xsl:text>
<xsl:call-template name="generate-rows">
<xsl:with-param name="project" select="project"/>
<xsl:with-param name="rating" select="rating"/>
<xsl:with-param name="date" select="date"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="generate-rows">
<xsl:param name="project"/>
<xsl:param name="rating"/>
<xsl:param name="date"/>
<xsl:param name="delimiter" select="' '"/>
<!-- generate row -->
<xsl:value-of select="substring-before(concat($project, $delimiter), $delimiter)" />
<xsl:text>,</xsl:text>
<xsl:value-of select="substring-before(concat($rating, $delimiter), $delimiter)" />
<xsl:text>,</xsl:text>
<xsl:value-of select="substring-before(concat($date, $delimiter), $delimiter)" />
<xsl:text> </xsl:text>
<xsl:if test="contains($project, $delimiter)">
<!-- recursive call -->
<xsl:call-template name="generate-rows">
<xsl:with-param name="project" select="substring-after($project, $delimiter)"/>
<xsl:with-param name="rating" select="substring-after($rating, $delimiter)"/>
<xsl:with-param name="date" select="substring-after($date, $delimiter)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/66113171
复制相似问题