使用 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>
</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> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
请注意,我在“缺失”的 DOB 处添加了一个尾随逗号。
【讨论】:
这是我可以工作的东西。如果我在 XML 中有许多多实例项怎么办?以上将适用于其中之一。 这取决于输入的具体内容以及您期望的结果。我建议您针对您的新要求发布一个新问题。 是的,所以说输出还包括多个地址(工作/家庭)。相同的输出,第一个地址在第一行,第二个地址在第二行 抱歉,cmets 不是讨论这个问题的好地方。如果您只有多个地址,那么您可以像处理护照一样处理地址。如果您有多个护照和多个地址,那么我需要在回答之前查看预期结果(并了解其逻辑)。发布一个新问题。以上是关于使用 XSLT 格式问题将 XML 转换为 CSV的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python 或 XSLT 将复杂的 XML 转换为 CSV