I am struggling to convert an excel xml file to another xml format.
Here is a simplified extract of the source:
<Workbook>
<Worksheet>
<Table>
<Row>
<Cell>
<Data>Test 1</Data>
</Cell>
<Cell>
<Data>Preconditions for test 1</Data>
</Cell>
<Cell>
<Data>The setup for test 1</Data>
</Cell>
<Cell />
</Row>
<Row>
<Cell />
<Cell>
<Data>Step 1</Data>
</Cell>
<Cell>
<Data>Todo in step 1</Data>
</Cell>
<Cell>
<Data>Expected result</Data> <!--omitted if empty-->
</Cell>
</Row>
.
.
<Row>
<Cell />
<Cell>
<Data>Step n</Data>
</Cell>
<Cell>
<Data>Todo in step n</Data>
</Cell>
<Cell>
<Data>Expected result</Data> <!--omitted if empty-->
</Cell>
</Row>
.
.
-----------------
.
.
<Row>
<Cell>
<Data>Test m</Data>
</Cell>
<Cell>
<Data>Preconditions for test m</Data>
</Cell>
<Cell>
<Data>The setup for test m</Data>
</Cell>
<Cell />
</Row>
<Row>
<Cell />
<Cell>
<Data>Step 1</Data>
</Cell>
<Cell>
<Data>Todo in step 1</Data>
</Cell>
<Cell />
<Cell>
<Data>Expected result</Data> <!--omitted if empty-->
</Cell>
</Row>
.
.
<Row>
<Cell />
<Cell>
<Data>Step k</Data>
</Cell>
<Cell>
<Data>Todo in step k</Data>
</Cell>
<Cell>
<Data>Expected result</Data> <!--omitted if empty-->
</Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
Column 2 (Cell[2]) can be seen as header for cols 3-4
My desired output should be in the following format:
<case>
<title>Test 1</title>
<precond>The setup for test 1</precond>
<step>
<index>1</index>
<content>Todo in step 1</content>
<expected>Expected result</expected> <!--omitted if empty-->
</step>
.
.
<step>
<index>n</index>
<content>Todo in step n</content>
<expected>Expected result</expected> <!--omitted if empty-->
</step>
</case>
.
.
.......
.
.
<case>
<title>Test m</title>
<precond>The setup for test m</precond>
<step>
<index>1</index>
<content>Todo in step 1</content>
<expected>Expected result</expected> <!--omitted if empty-->
</step>
.
.
<step>
<index>n</index>
<content>Todo in step n</content>
<expected>Expected result</expected> <!--omitted if empty-->
</step>
</case>
My problem is to define the xslt so that the <case>
tags encompass all the rows up until the next row which has a data entry in Cell[1]. If I use <xsl:if test="Cell[1]/Data">
to find the next test, the closing </case>
must be entered before </xsl:if>
and thus I need to iterate the following sibling rows (test steps) within that statement. How do I accomplish that?
Here's my feeble attempt at an xslt:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes" />
<xsl:template match="Workbook/Worksheet/Table">
<xsl:for-each select="Row">
<xsl:if test="Cell[1]/Data">
<case>
<title>
<xsl:value-of select="Cell[1]/Data"/>
</title>
<xsl:if test="Cell[3]/Data">
<precond>
<xsl:value-of select="Cell[3]/Data"/>
</precond>
</xsl:if>
<!-- Here I need to iterate "while not" following-sibling::Cell[1]/Data and extract the data from cells 2-4.-->
</case>
</xsl:if>
</xsl:for-each>
</xsl:template>