Something
public xml v1 · immutable<table border="1"> <xsl:for-each select="//ROW[not(Surname=preceding-sibling::ROW/Surname)]"> <tr> <th><xsl:value-of select="Surname[text()='Smith']" /></th> <xsl:for-each select="//ROWSET/ROW[Surname = current()/Surname]"> <td> <xsl:value-of select="FirstName[preceding-sibling::Surname=Surname/text()='Smith']" /> </td> </xsl:for-each> </tr> </xsl:for-each></table>