This is a grouping problem, and the standard approach to such problems in XSLT 1.0 is called Muenchian grouping. You define a key that groups your elements in the way you want and then use a trick with generate-id
to process just one element per group. In this case you want to group elements by the part of their name before the dot:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="elementByRow" match="/*/*"
use="substring-before(name(), '.')" />
<xsl:template match="/results">
<results>
<!-- pick out the first RowN.* element for each N -->
<xsl:apply-templates select="*[generate-id() =
generate-id(key('elementByRow', substring-before(name(), '.'))[1])]" />
</results>
</xsl:template>
<xsl:template match="*">
<Row>
<!-- process _all_ the elements that belong to this row -->
<xsl:for-each select="key('elementByRow', substring-before(name(), '.'))">
<xsl:element name="{substring-after(name(), '.')}">
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</Row>
</xsl:template>
</xsl:stylesheet>