Вместо:
<xsl:for-each select="address">
<xsl:copy-of select="."/>
</xsl:for-each>
У вас должно быть что-то вроде этого:
<xsl:for-each select="address">
<xsl:if test="position() mod 3 = 1">
<tr>
<xsl:call-template name="printAddress">
<xsl:with-param name="address" select="."/>
</xsl:call-template>
<xsl:call-template name="printAddress">
<xsl:with-param name="address" select="following-sibling::*[position() = 1]"/>
</xsl:call-template>
<xsl:call-template name="printAddress">
<xsl:with-param name="address" select="following-sibling::*[position() = 2]"/>
</xsl:call-template>
</tr>
</xsl:if>
</xsl:for-each>
И, конечно, у вас должен быть где-то шаблон printAddress.
Это должно дать вам представление о том, как ее решить. Задача состоит в том, чтобы обработать каждый n-й элемент (выбранный посредством position () mod n) и явно обработать n следующих элементов одновременно (выбранных методом follow-sibling :: * [position () = x]), заключив их в tr. Обратите внимание, что важно сравнить результат мода с 1, так как позиция начинает считать с 1.