我正在努力将 excel xml 文件转换为另一种 xml 格式。
以下是源代码的简化摘录:
<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>
第 2 列(单元格 [2])可以看作是第 3-4 列的标题
我想要的输出应该是以下格式:
<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>
我的问题是定义 xslt,以便<case>
标签包含所有行,直到下一行在 Cell[1] 中有数据条目。如果我<xsl:if test="Cell[1]/Data">
用来查找下一个测试,则</case>
必须在之前输入结束</xsl:if>
,因此我需要在该语句中迭代以下同级行(测试步骤)。我该如何做到这一点?
这是我对 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>