File: Data.xml <?xml version="1.0"?> <!-- carlist.xml --> <cars> <make>Alfa Romeo</make> <make>Bentley</make> <make>Chevrolet</make> <make>Dodge</make> <make>Eagle</make> <make>Ford</make> <make>GMC</make> </cars> File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" include-content-type="no"/> <xsl:template match="/"> <html> <head> <title>Car Makes and Models</title> </head> <body> <h1>Car Makes and Models</h1> <paragraph>Here are the car makes and models in our input document.</p> <table border="1" cellpadding="5"> <xsl:apply-templates select="cars"/> </table> </body> </html> </xsl:template> <xsl:template match="cars"> <xsl:for-each-group select="make|model" group-ending-with="*[position() mod 3 = 0]"> <tr> <xsl:apply-templates select="current-group()"/> <xsl:if test="count(current-group()) lt 3"> <td style="background: #CCCCCC;" colspan="{3 - count(current-group())}"> </td> </xsl:if> </tr> </xsl:for-each-group> </xsl:template> <xsl:template match="make"> <td> <xsl:apply-templates/> </td> </xsl:template> <xsl:template match="model"> <td style="font-style: italic; font-weight: bold;"> <xsl:apply-templates/> </td> </xsl:template> </xsl:stylesheet> Output: <html> <head> <title>Car Makes and Models</title> </head> <body> <h1>Car Makes and Models</h1> <paragraph>Here are the car makes and models in our input document. </p> <table border="1" cellpadding="5"> <tr> <td>Alfa Romeo</td> <td>Bentley</td> <td>Chevrolet</td> </tr> <tr> <td>Dodge</td> <td>Eagle</td> <td>Ford</td> </tr> <tr> <td>GMC</td> <td style="background: #CCCCCC;" colspan="2"></td> </tr> </table> </body> </html>