任何人都知道如何使用XSLT将XML转换为层次结构表?我已经工作了几个小时,不知道该怎么做。样本xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<table>
<h1>
<value1>1</value1>
<h2>
<value2>2</value2>
<h3>
<value3>3</value3>
<value3>3</value3>
<value3>3</value3>
</h3>
</h2>
<h2>
<value2>2</value2>
<h3>
<value3>3</value3>
<value3>3</value3>
<value3>3</value3>
</h3>
</h2>
</h1>
<h1>
<value1>1</value1>
<h2>
<value2>2</value2>
<h3>
<value3>3</value3>
<value3>3</value3>
<value3>3</value3>
</h3>
</h2>
<h2>
<value2>2</value2>
<h3>
<value3>3</value3>
<value3>3</value3>
<value3>3</value3>
</h3>
</h2>
</h1>
</table>
输出将是这样的:
1 2 3
3
3
2 3
3
3
1 2 3
3
3
2 3
3
3
PS:每个数字都在一个单元格中,总共有12行。数字1跨越6行,数字2跨越3行。
答案 0 :(得分:0)
假设您正在寻找HTML输出,因此第一行<td colspan="...">
并且相应的列完全省略了span中的后续行,那么:
<tr>
个value3
,并且您始终需要第三列。value3
是其父value3
中的第一个h2
,那么您还需要在其value2
之前,value2
是其h2
中的第一个h1
,那么您需要在其value1
之前。<xsl:template match="table">
<table>
<xsl:apply-templates select=".//value3" />
</table>
</xsl:template>
<xsl:template match="value3">
<tr>
<xsl:if test="not(preceding-sibling::value3)">
<xsl:apply-templates select="ancestor::h2[1]" />
</xsl:if>
<td><xsl:value-of select="." /></td>
</tr>
</xsl:template>
<xsl:template match="h2">
<xsl:if test="not(preceding-sibling::h2)">
<xsl:apply-templates select="ancestor::h1[1]" />
</xsl:if>
<td rowspan="{count(.//value3)}"><xsl:value-of select="value2" /></td>
</xsl:template>
<xsl:template match="h1">
<td rowspan="{count(.//value3)}"><xsl:value-of select="value1" /></td>
</xsl:template>
rowspan
属性很简单,因为您的XML嵌套得很好 - 跨度始终是此value3
或h1
下的后代h2
元素的数量。