В этом случае вы на самом деле не группируете элементы.Это больше похоже на разгруппировку.
Один из способов сделать это - использовать xsl: key для поиска строки «заголовка» для каждой из строк сведений.
<xsl:key name="fruity"
match="tr[not(td[@class='header'])]"
use="generate-id(preceding-sibling::tr[td[@class='header']][1])"/>
т.е. для каждой строки сведений получите самую предыдущую строку заголовка.
Затем вы можете сопоставить все строки заголовка следующим образом:
<xsl:apply-templates select="tr/td[@class='header']"/>
Внутри соответствующего шаблона,Вы можете извлечь тип, страну и звание.Затем, чтобы получить связанные строки подробностей, это простой случай просмотра ключа родительской строки:
<xsl:apply-templates select="key('fruity', generate-id(..))">
Вот общий XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="fruity"
match="tr[not(td[@class='header'])]"
use="generate-id(preceding-sibling::tr[td[@class='header']][1])"/>
<xsl:template match="/tbody">
<data>
<!-- Match header rows -->
<xsl:apply-templates select="tr/td[@class='header']"/>
</data>
</xsl:template>
<xsl:template match="td">
<!-- Match associated detail rows -->
<xsl:apply-templates select="key('fruity', generate-id(..))">
<!-- Extract relevant parameters from the td cell -->
<xsl:with-param name="type" select="substring-before(substring-after(img[1]/@src, 'images/icon_'), '.gif')"/>
<xsl:with-param name="country" select="img[2]/@alt"/>
<xsl:with-param name="rank" select="normalize-space(text())"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="tr">
<xsl:param name="type"/>
<xsl:param name="country"/>
<xsl:param name="rank"/>
<entry>
<type>
<xsl:value-of select="$type"/>
</type>
<country>
<xsl:value-of select="$country"/>
</country>
<rank>
<xsl:value-of select="$rank"/>
</rank>
<color>
<xsl:value-of select="td[1]"/>
</color>
<shape>
<xsl:value-of select="td[2]"/>
</shape>
<taste>
<xsl:value-of select="td[3]"/>
</taste>
</entry>
</xsl:template>
</xsl:stylesheet>
Применительно к вашемувходной документ, генерируется следующий вывод:
<data>
<entry>
<type>apples</type>
<country>Portugal</country>
<rank>First Grade</rank>
<color>Green</color>
<shape>Round shaped</shape>
<taste>Tasty</taste>
</entry>
<entry>
<type>apples</type>
<country>Portugal</country>
<rank>First Grade</rank>
<color>Red</color>
<shape>Round shaped</shape>
<taste>Bitter</taste>
</entry>
<entry>
<type>apples</type>
<country>Portugal</country>
<rank>First Grade</rank>
<color>Pink</color>
<shape>Round shaped</shape>
<taste>Tasty</taste>
</entry>
<entry>
<type>strawberries</type>
<country>USA</country>
<rank>Fifth Grade</rank>
<color>Red</color>
<shape>Heart shaped</shape>
<taste>Super tasty</taste>
</entry>
<entry>
<type>bananas</type>
<country>Congo</country>
<rank>Third Grade</rank>
<color>Yellow</color>
<shape>Smile shaped</shape>
<taste>Fairly tasty</taste>
</entry>
<entry>
<type>bananas</type>
<country>Congo</country>
<rank>Third Grade</rank>
<color>Brown</color>
<shape>Smile shaped</shape>
<taste>Too sweet</taste>
</entry>
</data>