You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用XSLT将XML转换为Excel仅显示表头,无数据输出

XSLT转Excel只显示表头?看这里搞定!

你现在遇到的问题是用XSLT把XML转成Excel时,只有表头显示,项目数据出不来对吧?我看了你的代码,发现XSL模板里有几个关键的小错误,导致数据没被正确遍历和输出。先把你的相关文件贴出来方便对照:

示例XML(example.xml)

<?xml version="1.0"?>
<projects>
<project>
<name>Shock</name>
<language>Ruby</language>
<owner>Brian May</owner>
<state>New</state>
<Date>31/10/2008 0:00:00</Date>
</project>
<project>
<name>Shock1</name>
<language>Ruby1</language>
<owner>Brian May1</owner>
<state>New1</state>
<Date>30/10/2008 0:00:00</Date>
</project>
</projects>

原XSL模板的问题点

我帮你梳理了三个核心错误:

  1. 遍历路径错误:嵌套的<xsl:for-each select="/project">用了绝对路径,但此时上下文已经在/projects节点下,应该用相对路径select="project",不然找不到对应的项目节点。
  2. 行索引重复覆盖:每个数据行都设置了ss:Index="1",会强制把所有数据行都放到第1行,直接覆盖表头,这肯定不对。
  3. 列索引错误:所有<Cell>都加了ss:Index="2",意味着所有数据都往第二列塞,不仅会覆盖内容,还会让其他列空着。

修改后的XSL模板(test.xsl)

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>
<xsl:stylesheet version="1.0" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<xsl:template match="/">
<Workbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom" />
<Borders />
<Font />
<Interior />
<NumberFormat />
<Protection />
</Style>
<Style ss:ID="s21">
<Font ss:Size="22" ss:Bold="1" />
</Style>
<Style ss:ID="s22">
<Font ss:Size="14" ss:Bold="1" />
</Style>
<Style ss:ID="s23">
<Font ss:Size="12" ss:Bold="1" />
</Style>
<Style ss:ID="s24">
<Font ss:Size="10" ss:Bold="1" />
</Style>
</Styles>
<Worksheet ss:Name="Page1">
<Table>
<xsl:call-template name="XMLToXSL" />
</Table>
</Worksheet>
</Workbook>
</xsl:template>
<xsl:template name="XMLToXSL">
<Row ss:Index="1" >
<Cell>
<Data ss:Type="String">name</Data>
</Cell>
<Cell>
<Data ss:Type="String">language</Data>
</Cell>
<Cell>
<Data ss:Type="String">owner</Data>
</Cell>
<Cell>
<Data ss:Type="String">state</Data>
</Cell>
<Cell>
<Data ss:Type="String">Date</Data>
</Cell>
</Row>
<!-- 简化遍历逻辑,直接定位到所有project节点 -->
<xsl:for-each select="/projects/project">
<Row>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="name" />
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="language" />
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="owner" />
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="state" />
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="Date" />
</Data>
</Cell>
</Row>
</xsl:for-each>
</xsl:template>
<xsl:template match="DataList">
</xsl:template>
</xsl:stylesheet>

关键修改说明

  • 把原来嵌套的两层for-each改成直接遍历/projects/project,简化结构同时避免路径错误
  • 去掉了数据行的ss:Index属性,让Excel自动按顺序生成行
  • 删除了所有Cell的ss:Index="2",确保每个Cell对应正确的列位置

验证效果

修改后再用你的C#代码执行转换,生成的Excel就能正常显示所有项目数据了,和你期望的输出一致:

| name   | language | owner       | state | Date                  |
------------------------------------------------------------------
| Shock  | Ruby     | Brian May   | New   | 31/10/2008 0:00:00   |
------------------------------------------------------------------
| Shock1 | Ruby1    | Brian May1  | New1  | 30/10/2008 0:00:00   |

内容的提问来源于stack exchange,提问作者cgsabari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:28:07