使用 XSLT 格式问题将 XML 转换为 CSV

Posted

技术标签:

【中文标题】使用 XSLT 格式问题将 XML 转换为 CSV【英文标题】:Converting XML to CSV using XSLT Formatting Issue 【发布时间】:2022-01-05 20:11:46 【问题描述】:

我有以下 XML

<Data>
    <Employee>
        <Name>
            <FirstName>John</FirstName>
            <LastName>Snow</LastName>
        </Name>
        <DOB>1990-01-01</DOB>
        <Passport>
            <Country>United Kingdom</Country>
            <ID>12345678</ID>
        </Passport>
        <Passport>
            <Country>United States of America</Country>
            <ID>789101112</ID>
        </Passport>
    </Employee>
</Data>

我正在转换它,如下所示:

<xsl:for-each select="Data/Employee">            
            <xsl:value-of select="Name/FirstName"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="Name/LastName"/>
            <xsl:text>,</xsl:text>
            <xsl:for-each select="Passport">
                <xsl:value-of select="Country"/>
                <xsl:text>,</xsl:text>
                <xsl:value-of select="ID"/>                
                <xsl:text>&#xd;</xsl:text>
            </xsl:for-each>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="DOB"/>
        </xsl:for-each>    

我得到的输出是:

John,Snow,United Kingdom,12345678
United States of America,789101112
,1990-01-01

但我要求将护照信息填写在彼此下方,然后将出生日期显示在顶行,如下所示:

John,Snow,United Kingdom,12345678,1990-01-01
,,United States of America,789101112

任何帮助将不胜感激

【问题讨论】:

您确定这是您想要的结果吗?我本来希望每个护照都有一个名称和 DOB 值重复的“平面”文件。 另外,您的处理器支持哪个版本的 XSLT? 不,我不想在每一行上复制相同的信息。我希望顶行保存整个数据记录,而下面的行仅保存其他护照信息。 支持 XSLT 3.0 【参考方案1】:

大概是这样的:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/Data">
    <xsl:for-each select="Employee">
        <xsl:for-each select="Passport">
            <xsl:choose>
                <xsl:when test="position()=1">
                    <xsl:value-of select="../Name/(FirstName, LastName), Country,ID, ../DOB" separator=","/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="'', '', Country,ID, ''" separator=","/>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>
  
</xsl:stylesheet>

请注意,我在“缺失”的 DOB 处添加了一个尾随逗号。

【讨论】:

这是我可以工作的东西。如果我在 XML 中有许多多实例项怎么办?以上将适用于其中之一。 这取决于输入的具体内容以及您期望的结果。我建议您针对您的新要求发布一个新问题。 是的,所以说输出还包括多个地址(工作/家庭)。相同的输出,第一个地址在第一行,第二个地址在第二行 抱歉,cmets 不是讨论这个问题的好地方。如果您只有多个地址,那么您可以像处理护照一样处理地址。如果您有多个护照多个地址,那么我需要在回答之前查看预期结果(并了解其逻辑)。发布一个新问题。

以上是关于使用 XSLT 格式问题将 XML 转换为 CSV的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 将 XML 转换为 CSV

使用 Python 或 XSLT 将复杂的 XML 转换为 CSV

使用 XSLT 将 XML 转换为 CSV

使用 XSLT 将 XML 转换为多个 CSV

使用 XSLT 将 XML 转换为 CSV,用于在单个标记中以空格分隔的多个记录

如何编写 XSLT 将 XML 转换为 CSV?