使用XSLT将XML转换为CSV时的格式异常问题求助
解决方案
你可以通过判断护照节点的位置来分别输出首行和后续行的内容,调整后的XSLT代码如下:
<xsl:for-each select="Data/Employee"> <!-- 提前提取员工固定字段,避免重复读取节点 --> <xsl:variable name="firstName" select="Name/FirstName"/> <xsl:variable name="lastName" select="Name/LastName"/> <xsl:variable name="dob" select="DOB"/> <xsl:for-each select="Passport"> <xsl:choose> <!-- 首条护照记录,输出完整字段+出生日期 --> <xsl:when test="position() = 1"> <xsl:value-of select="$firstName"/> <xsl:text>,</xsl:text> <xsl:value-of select="$lastName"/> <xsl:text>,</xsl:text> <xsl:value-of select="Country"/> <xsl:text>,</xsl:text> <xsl:value-of select="ID"/> <xsl:text>,</xsl:text> <xsl:value-of select="$dob"/> </xsl:when> <!-- 后续护照记录,前两列留空 --> <xsl:otherwise> <xsl:text>,,</xsl:text> <xsl:value-of select="Country"/> <xsl:text>,</xsl:text> <xsl:value-of select="ID"/> </xsl:otherwise> </xsl:choose> <!-- 统一添加换行符 --> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:for-each>
逻辑说明
- 把循环主体放在护照节点的遍历中,保证每一行对应一条护照记录
- 首条护照(
position()=1)完整输出姓名、护照信息,末尾拼接出生日期 - 后续护照仅输出护照信息,前两个位置用两个逗号占位,对应姓名两列的空值
- 统一在每次循环末尾添加换行符,避免格式错乱
内容的提问来源于stack exchange,提问作者mwisdom
相关产品推荐
相关产品推荐

