我正在尝试将保存为 XML 的 Excel 电子表格转换为实际的 XML 文档(删除所有对格式的引用并获取我的数据)。第一行是应该是节点名称的标题,其余行是数据。XML 将在 Windows 窗体应用程序中使用,转换将通过 XML 命名空间的 XslTransform 类完成。
我无法使用互操作访问 Excel,因为将使用该程序的机器没有 MS Office。如果任何列包含分隔符,则另存为 CSV 并读取文件将失败。我不想只编写 XML 文件或硬编码信息,因为当电子表格更改时需要更新。所以我相信动态生成 XML 是最好的选择。
为简单起见,我已从生成的 XML 文件中删除了大部分无关信息,以仅显示我感兴趣的工作表:
<?xml version="1.0"?>
<Worksheet Name="AttributionImages">
<Table ExpandedColumnCount="5" ExpandedRowCount="2" FullColumns="1"
FullRows="1">
<Column AutoFitWidth="0" Width="73.5"/>
<Column AutoFitWidth="0" Width="84"/>
<Column AutoFitWidth="0" Width="121.5"/>
<Column AutoFitWidth="0" Width="146.25"/>
<Column AutoFitWidth="0" Width="124.5"/>
<Row>
<Cell><Data Type="String">Name</Data></Cell>
<Cell><Data Type="String">Source</Data></Cell>
<Cell><Data Type="String">PicSet</Data></Cell>
<Cell><Data Type="String">License</Data></Cell>
<Cell><Data Type="String">Website</Data></Cell>
</Row>
<Row>
<Cell><Data Type="String">Image1</Data></Cell>
<Cell StyleID="s21" HRef="http://www.website.com/"><Data Type="String">Artist </Data></Cell>
<Cell><Data Type="String">FreeIcons</Data></Cell>
<Cell><Data Type="String">Creative Commons Attribution</Data></Cell>
<Cell StyleID="s21" HRef="http://www.website.com/"><Data
Type="String">http://www.website.com</Data></Cell>
</Row>
</Table>
</Worksheet>
我的 XSLT:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/Worksheet">
<xsl:element name="{@Name}">
<xsl:for-each select="Table/Row">
<xsl:if test="(position( )) > 1">
<Image>
<xsl:for-each select="Cell">
<xsl:element name="{/Worksheet/Table/Row[1]/Cell[position()]/Data}">
<!-- <countNo><xsl:value-of select="position()"/></countNo> -->
<xsl:value-of select="Data"/>
</xsl:element>
</xsl:for-each>
</Image>
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我将以下主题的答案归功于帮助我开发上述 XSLT:
预期输出:
<?xml version="1.0" encoding="utf-8" ?>
<AttributionImages>
<Image>
<Name>Image1 </Name>
<Source>Artist</Source>
<PicSet>FreeIcons</PicSet>
<License>Creative Commons Attribution</License>
<Website>http://www.Website.com</Website>
</Image>
</AttributionImages>
实际输出:
<?xml version="1.0" encoding="utf-8" ?>
<AttributionImages>
<Image>
<Name>Image1 </Name>
<Name>Artist</Name>
<Name>FreeIcons</Name>
<Name>Creative Commons Attribution</Name>
<Name>http://www.Website.com</Name>
</Image>
</AttributionImages>
出于某种原因,“/Worksheet/Table/Row 1 /Cell[position()]/Data”总是等于第一行的第一个单元格(1 = 名称)。如果我用数字 1-5 替换 position() 它访问正确的索引。此外,<countNo><xsl:value-of select="position()"/></countNo>
我已经注释掉了,它将输出正确的循环计数。我需要为 cell[] 索引值指定什么才能访问第一行中的所有节点?