麻烦创build通用xslt输出xsl xml

我有一个下面的xml文件,我想转换到xsl而不硬编码“table”元素下的元素,因为不同的文件中的单元格可以更多:

<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> 

问题我面临两个问题:1)遍历Table [1]的元素来创build头文件2)创build每行的值

这里是我没有给出欲望结果的xslt:

 <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> 

它不是创build所需的结果XML如下所示:

 <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> 

我不确定你喜欢在XSLT的开始处使用静态头的输出

 <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> <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> 

输出是

 <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> 

在你的XSLT部分

 <xsl:variable name="set" select="/Data/Table[1]" /> <xsl:for-each select="$set"> <Cell ss:StyleID="header"> ... 

只为表格的每个单元格生成第一个表格而不是一个单元格的单元格。

这同样适用于

 <xsl:for-each select="/Data/Table/."> <Row> <Cell ss:StyleID="header"> ... 

每个表格只有一个单元格的行被创build。