使用XSLT进行XML到CSV的转换



我正在尝试将我的xml输入转换为csv输出,如下所示详细信息

INPUT文件:

<Customer>
<item>
<CustomerID>100000069</CustomerID>
<CustomerGroup>EX</CustomerGroup>
<CustomerName>Test Mehmet</CustomerName>
<CustomerStreet>Street</CustomerStreet>
<HouseNumber>123</HouseNumber>
<CustomerCity>Ismaning</CustomerCity>
<CustomerZip></CustomerZip>
<CustomerCountry>DE</CustomerCountry>
</item>
</Customer>

XSL:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name='newline'>
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:template match="/Customer">
<xsl:value-of select="concat('&quot;CustomerID&quot;;&quot;CustomerGroup&quot;;&quot;CustomerName&quot;;&quot;CustomerStreet&quot;;&quot;HouseNumber&quot;;&quot;CustomerCity&quot;;&quot;CustomerZIP&quot;;&quot;CustomerCountry&quot;',$newline)"/>
<xsl:for-each select="./item">
<xsl:value-of select="concat('&quot;',./CustomerID,'&quot;;&quot;',./CustomerGroup,'&quot;;&quot;',./CustomerName,'&quot;;&quot;',./CustomerStreet,'&quot;;&quot;',./HouseNumber,'&quot;;&quot;',./CustomerCity,'&quot;;&quot;',./CustomerZIP,'&quot;;&quot;',./CustomerCountry,'&quot;',$newline)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

我的原始输出:

"CustomerID"CustomerGroup"客户名称"CustomerStreet"HouseNumber"客户城市"CustomerZIP"客户国家;"100000069"EX"Test Mehmet"街道"123〃"Ismaning"quot"DE";

预期输出:

我需要通过"null"更改所有空值。下面是我的预期输出。

"CustomerID"CustomerGroup"客户名称"CustomerStreet"HouseNumber"客户城市"CustomerZIP"客户国家;"100000069"EX"Test Mehmet"街道"123〃"Ismaning";;空"DE";

请建议对我的代码进行所需的额外更改,以便在"处填充null"来了。

假设您仅限于XSLT1.0,我建议您这样做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/Customer">
<!-- header row -->
<xsl:text>"CustomerID";"CustomerGroup";"CustomerName";"CustomerStreet";"HouseNumber";"CustomerCity";"CustomerZIP";"CustomerCountry"&#10;</xsl:text>
<!-- data rows -->
<xsl:for-each select="item">
<xsl:call-template name="cell">
<xsl:with-param name="data" select="CustomerID"/>
</xsl:call-template>
<xsl:text>;</xsl:text>
<xsl:call-template name="cell">
<xsl:with-param name="data" select="CustomerGroup"/>
</xsl:call-template>
<xsl:text>;</xsl:text>
<xsl:call-template name="cell">
<xsl:with-param name="data" select="CustomerName"/>
</xsl:call-template>
<xsl:text>;</xsl:text>
<xsl:call-template name="cell">
<xsl:with-param name="data" select="CustomerStreet"/>
</xsl:call-template>
<xsl:text>;</xsl:text>
<xsl:call-template name="cell">
<xsl:with-param name="data" select="HouseNumber"/>
</xsl:call-template>
<xsl:text>;</xsl:text>
<xsl:call-template name="cell">
<xsl:with-param name="data" select="CustomerCity"/>
</xsl:call-template>
<xsl:text>;</xsl:text>
<xsl:call-template name="cell">
<xsl:with-param name="data" select="CustomerZip"/>
</xsl:call-template>
<xsl:text>;</xsl:text>
<xsl:call-template name="cell">
<xsl:with-param name="data" select="CustomerCountry"/>
</xsl:call-template>
<xsl:text>&#10;</xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template name="cell">
<xsl:param name="data"/>
<xsl:choose>
<xsl:when test="string($data)">
<xsl:text>"</xsl:text>
<xsl:value-of select="$data"/>
<xsl:text>"</xsl:text>
</xsl:when>
<xsl:otherwise>null</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

这有点冗长,但避免了代码重复。

然而,如果你可以确定所有元素都将始终在那里,按照相同的顺序,即使有些元素可能是空的,你也可以将其缩短为:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/Customer">
<!-- header row -->
<xsl:text>"CustomerID";"CustomerGroup";"CustomerName";"CustomerStreet";"HouseNumber";"CustomerCity";"CustomerZIP";"CustomerCountry"&#10;</xsl:text>
<!-- data rows -->
<xsl:for-each select="item">
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="string(.)">
<xsl:text>"</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
</xsl:when>
<xsl:otherwise>null</xsl:otherwise>
</xsl:choose>
<xsl:if test="position()!=last()">;</xsl:if>
</xsl:for-each>
<xsl:text>&#10;</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新