c# - 使用xslt时嵌套的xml数据没有作为输出进入excel
问题描述
我正在尝试使用 xslt 模板将 xml 数据转换为 excel。但我只得到标题,而不是数据。请检查以下 xml 数据和 xslt 模板以及我的 C# 代码供您参考。
例子.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
<?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>
<xsl:for-each select="/projects">
<xsl:for-each select="/project">
<Row ss:Index="1">
<Cell ss:Index="2">
<Data ss:Type="String">
<xsl:value-of select="name" />
</Data>
</Cell>
<Cell ss:Index="2">
<Data ss:Type="String">
<xsl:value-of select="language" />
</Data>
</Cell>
<Cell ss:Index="2">
<Data ss:Type="String">
<xsl:value-of select="owner" />
</Data>
</Cell>
<Cell ss:Index="2">
<Data ss:Type="String">
<xsl:value-of select="state" />
</Data>
</Cell>
<Cell ss:Index="2">
<Data ss:Type="String">
<xsl:value-of select="Date" />
</Data>
</Cell>
</Row>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<xsl:template match="DataList">
</xsl:template>
</xsl:stylesheet>
C#代码:
XmlDocument xdoc = new XmlDocument();
xdoc.Load(@"C:\Xmls\example.xml");
XslCompiledTransform xct = new XslCompiledTransform();
xct.Load(@"C:\Templates\Test.xsl");
XmlTextWriter writer = new XmlTextWriter(@"C:\Outputs\output.xls", null);
writer.WriteProcessingInstruction("xml", "version='1.0'");
xct.Transform(xdoc, null, writer);
writer.Close();
Excel输出.xls:
| name | language | owner | state | Date |
-----------------------------------------------------
但我的预期输出应该是,
| 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 |
------------------------------------------------------------------
目前它在 excel 中单独打印标题,如何将数据逐行输入到 excel 中。
解决方案
替换xsl:for-each select="/project"
为xsl:for-each select="project"
。
我还将简化 C# 以使用
XslCompiledTransform xct = new XslCompiledTransform();
xct.Load(@"C:\Templates\Test.xsl");
xct.Transform(@"C:\Xmls\example.xml", @"C:\Outputs\output.xls");
尽管我认为您的代码不会导致问题,但 XSLT 的 XPath 错误。
推荐阅读
- laravel - Laravel - 如何防止登录和中间件后重定向?
- firebase - 警告:无法检测我们是否在 Google Compute Engine 上运行
- javascript - Sequelize 迁移不会从模型中迁移多个字段
- javascript - 在按钮按下时保持键盘
- django - DJango 相关下拉菜单显示无效选择错误
- javascript - 如何用按钮停止功能?
- c# - 将值从 C# 方法返回到 .aspx 页面问题
- sql - 如何从 Oracle 的 sql 中的其他表更新
- python - 如何在 Jupyter Python 3 上导入 hdbscan?
- maven - 是否可以将 maven 日志配置放入 pom.xml 而不是命令行参数?