hss
hss

Reputation: 317

trouble creating generic xslt to output xsl xml

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

Answers (1)

matthias_h
matthias_h

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

Related Questions