我正在尝试从我通过SQL查询获得的某些XML生成HTML表。生成的XML如下所示:
<root>
<form attribute1="1" attribute2="1" />
<form attribute1="1" attribute2="2" />
<form attribute1="1" attribute2="3" />
<form attribute1="2" attribute2="1" />
<form attribute1="2" attribute2="2" />
<form attribute1="3" attribute2="1" />
</root>
我想要生成的表需要为每个唯一的attribute1设置一个标题行,每个attribute2下面都有行,如下所示:
<attribute1="1" />
<attribute2="1" />
<attribute2="2" />
<attribute2="3" />
<attribute1="2" />
<attribute2="1" />
<attribute2="2" />
<attribute1="3" />
<attribute2="1" />
我没有太多使用XML / XSLT的经验,但我希望可以做一些像循环遍历表单的事情,为每个唯一的attribute1创建一个标题行,然后创建与下面的唯一attribute1相关联的数据行。
答案 0 :(得分:0)
如果您只能使用XSLT 1.0,请尝试使用此XSLT作为初学者,它使用Muenchian分组方法
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="form" match="form" use="@attribute1" />
<xsl:template match="root">
<xsl:copy>
<!-- Get first "form" element that occurs in each group -->
<xsl:for-each select="form[generate-id() = generate-id(key('form',@attribute1)[1])]">
<group>
<header><xsl:value-of select="@attribute1" /></header>
<!-- Get the "form" elements that make up the group -->
<xsl:apply-templates select="key('form', @attribute1)" />
</group>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="form">
<row><xsl:value-of select="@attribute2" /></row>
</xsl:template>
</xsl:stylesheet>
这里有一些可以创建HTML表的XSLT。这个稍微高一点,因为它计算出一行的最大列数,并在为较短的行创建colspan属性时使用它
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:key name="form" match="form" use="@attribute1" />
<xsl:variable name="maxCells">
<xsl:for-each select="/root/form[generate-id() = generate-id(key('form',@attribute1)[1])]">
<xsl:sort select="count(key('form', @attribute1))" order="descending" />
<xsl:if test="position() = 1">
<xsl:value-of select="count(key('form', @attribute1))" />
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:template match="root">
<table border="1">
<!-- Get first "form" element that occurs in each group -->
<xsl:for-each select="form[generate-id() = generate-id(key('form',@attribute1)[1])]">
<tr>
<th colspan="{$maxCells}">
<xsl:value-of select="@attribute1" />
</th>
</tr>
<tr>
<!-- Get the "form" elements that make up the group -->
<xsl:apply-templates select="key('form', @attribute1)" />
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template match="form">
<td>
<xsl:if test="position() = last()">
<xsl:attribute name="colspan">
<xsl:value-of select="$maxCells - count(key('form', @attribute1)) + 1" />
</xsl:attribute>
</xsl:if>
<xsl:value-of select="@attribute2" />
</td>
</xsl:template>
</xsl:stylesheet>