Reputation: 317
I have a following xml file which I would like to transfom to xsl without hardcoding the elements under the "table" element since no of cells in different file can be more:
<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>
The Problem I am facing two issues: 1) iterating through the elements of Table[1] to create header 2) create the each row with the value
Here is the xslt i have which is not giving desire results:
<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>
It is not creating the desired result xml like this below:
<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>
Upvotes: 0
Views: 85
Reputation: 11416
I'm not sure about what you like to have as output for the static header at the beginning of your XSLT with
<Table>
<Row>
<Cell>
Header
</Cell>
</Row>
....
but for the relevant part: if you change to
<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>
the output is
<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>
In your XSLT the part
<xsl:variable name="set" select="/Data/Table[1]" />
<xsl:for-each select="$set">
<Cell ss:StyleID="header">
...
did only generate a cell for the first table instead of one cell for each cell of the table.
The same applies to
<xsl:for-each select="/Data/Table/.">
<Row>
<Cell ss:StyleID="header">
...
where only one row with one cell is created for each table.
Upvotes: 1