我正在尝试使用XSLT将XML转换为CSV,正在获取记录,但是我需要CSV文件中的标题。
例如:
Name EmailAddress
Gaurav Gaur@yopmail.com
Satya Satya@yopmail.com
XML
<?xml version="1.0"?>
<SearchResults>
<Columns>
<Column Label="Name">Name</Column>
<Column Label="Email Addresses">EmailAddress</Column>
</Columns>
<Rows>
<Row>
<Name>Gaurav Joshi</Name>
<EmailAddress>ybenipohe-3888@yopmail.com</EmailAddress>
</Row>
<Row>
<Name>Satya</Name>
<EmailAddress>eqaddoxoqu-8703@yopmail.com</EmailAddress>
</Row>
XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<!-- This transform is used to generate a CSV file.-->
<xsl:output method="text" indent="no" />
<xsl:template match="/">
<xsl:apply-templates select="/SearchResults/Rows/Row" />
</xsl:template>
<xsl:template match="/SearchResults/Rows/Row">
<xsl:text>"</xsl:text>
<xsl:value-of select="position()" />
<xsl:text>"</xsl:text>
<xsl:for-each select="*">
<xsl:text>,"</xsl:text>
<xsl:value-of select="." />
<xsl:text>"</xsl:text>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="/SearchResults/Columns" />
</xsl:stylesheet>
答案 0 :(得分:1)
您当前有一个与/SearchResults/Columns
匹配的模板,由于您没有任何明确选择这些模板的模板,因此此刻实际上是多余的(由于您做了<xsl:apply-templates select="/SearchResults/Rows/Row" />
)。
但是您可以轻松地对其进行调整以输出标题,然后只需使用xsl:apply-templates
即可选择它。
尝试使用此XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<!-- This transform is used to generate a CSV file.-->
<xsl:output method="text" indent="no" />
<xsl:template match="/">
<xsl:apply-templates select="/SearchResults/Columns" />
<xsl:apply-templates select="/SearchResults/Rows/Row" />
</xsl:template>
<xsl:template match="Row">
<xsl:text>"</xsl:text>
<xsl:value-of select="position()" />
<xsl:text>"</xsl:text>
<xsl:for-each select="*">
<xsl:text>,"</xsl:text>
<xsl:value-of select="." />
<xsl:text>"</xsl:text>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="Columns">
<xsl:text>"Row"</xsl:text>
<xsl:for-each select="Column">
<xsl:text>,"</xsl:text>
<xsl:value-of select="@Label" />
<xsl:text>"</xsl:text>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
但这(大)假设是每个Row
的子节点与相关Column
节点的顺序相同。如果不是这种情况,则您有工作要做。尝试将与此匹配的模板Row
替换为该模板
<xsl:template match="Row">
<xsl:text>"</xsl:text>
<xsl:value-of select="position()" />
<xsl:text>"</xsl:text>
<xsl:variable name="Row" select="." />
<xsl:for-each select="/SearchResults/Columns/Column">
<xsl:text>,"</xsl:text>
<xsl:value-of select="$Row/*[name() = current()]" />
<xsl:text>"</xsl:text>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:template>