0

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>

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.