XML として保存された Excel スプレッドシートを実際の XML ドキュメントに変換しようとしています (書式設定へのすべての参照を削除し、データを取得するだけです)。最初の行はノード名であるヘッダーで、残りの行はデータです。XML は Windows フォーム アプリケーションで使用され、変換は XML 名前空間の XslTransform クラスを通じて行われます。
プログラムを使用するマシンに MS Office がないため、相互運用機能を使用して Excel にアクセスできません。いずれかの列に区切り文字が含まれていると、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 = 名前) と等しくなります。position() を 1 ~ 5 の数字に置き換えると、正しいインデックスにアクセスします。さらに、<countNo><xsl:value-of select="position()"/></countNo>
私がコメントアウトしたものは、正しいループカウントを出力します。最初の行のすべてのノードにアクセスするには、cell[] インデックス値に何を指定する必要がありますか?