我有一个以下xml文件,我想将其转换为xsl而不对“table”元素下的元素进行硬编码,因为不同文件中的单元格不能更多:
<Data>
<Table>
<cell1>val1</cell1>
<cell2>val2</cell2>
<cell3 />
<cell4>val3</cell4>
<cell5>val4</cell5>
</Table>
<Table>
<cell1>vala</cell1>
<cell2>valB</cell2>
<cell3>valC</cell3>
<cell4></cell4>
<cell5></cell5>
</Table>
</Data>
问题我面临两个问题: 1)迭代表[1]的元素以创建标题 2)使用值
创建每一行这是我所拥有的xslt,它没有给出欲望结果:
<Worksheet ss:Name="Sheet1">
<Table>
<Row>
<Cell>
Header
</Cell>
</Row>
<Row>
<Cell/>
<xsl:variable name="set" select="/Data/Table[1]" />
<xsl:for-each select="$set">
<Cell ss:StyleID="header">
<Data ss:Type="string">
<xsl:value-of select="name(.)"/>
</Data>
</Cell>
</xsl:for-each>
</Row>
<xsl:for-each select="/Data/Table/.">
<Row>
<Cell ss:StyleID="header">
<Data ss:Type="String">
<xsl:value-of select="."/>
</Data>
</Cell>
</Row>
</xsl:for-each>
</Table>
</Worksheet>
它没有像下面这样创建所需的结果xml:
<Row>
<Cell ss:StyleID="header">
<Data ss:Type="string">cell1</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="string">cell2</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="string">cell3</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="string">cell4</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="string">cell5</Data>
</Cell>
</Row>
<Row>
<Cell ss:StyleID="header">
<Data ss:Type="String">val1</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String">val2</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String"></Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String">val4</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String">val5</Data>
</Cell>
</Row>
<Row>
<Cell ss:StyleID="header">
<Data ss:Type="String">vala</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String">valB</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String">valC</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String"></Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String"></Data>
</Cell>
</Row>
答案 0 :(得分:1)
我不确定您希望在XSLT开头使用
作为静态标头的输出。<Table>
<Row>
<Cell>
Header
</Cell>
</Row>
....
但是对于相关部分:如果你改为
<Row>
<Cell/>
<xsl:variable name="set" select="/Data/Table[1]" />
<xsl:for-each select="$set/*">
<Cell ss:StyleID="header">
<Data ss:Type="string">
<xsl:value-of select="name(.)"/>
</Data>
</Cell>
</xsl:for-each>
</Row>
<xsl:for-each select="/Data/Table/.">
<Row>
<xsl:for-each select="./*">
<Cell ss:StyleID="header">
<Data ss:Type="String">
<xsl:value-of select="."/>
</Data>
</Cell>
</xsl:for-each>
</Row>
</xsl:for-each>
输出
<Row>
<Cell></Cell>
<Cell ss:StyleID="header">
<Data ss:Type="string">cell1</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="string">cell2</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="string">cell3</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="string">cell4</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="string">cell5</Data>
</Cell>
</Row>
<Row>
<Cell ss:StyleID="header">
<Data ss:Type="String">val1</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String">val2</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String"></Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String">val3</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String">val4</Data>
</Cell>
</Row>
<Row>
<Cell ss:StyleID="header">
<Data ss:Type="String">vala</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String">valB</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String">valC</Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String"></Data>
</Cell>
<Cell ss:StyleID="header">
<Data ss:Type="String"></Data>
</Cell>
</Row>
在你的XSLT中的部分
<xsl:variable name="set" select="/Data/Table[1]" />
<xsl:for-each select="$set">
<Cell ss:StyleID="header">
...
只为第一个表生成一个单元格,而不是为表格的每个单元格生成一个单元格。
同样适用于
<xsl:for-each select="/Data/Table/.">
<Row>
<Cell ss:StyleID="header">
...
其中只为每个表创建一个包含一个单元格的行。