Sorry to have completely revised your original template, but the general way to do this (in XSLT 1.0) is to use the Meunchian method for multi-level grouping. In your specific case, you can create xsl:key based on the concatenation of @IT_Type and the parent Row element.
For example, this XSLT 1.0 (tested in Saxon 6.5 )
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="kIT_Type" match="Row" use="concat( name(parent::node()),@IT_Type )"/> <xsl:template match="Parents/*"> <Folder> <name><xsl:value-of select="name()"/></name> <xsl:apply-templates select="Row[ generate-id(.) = generate-id(key('kIT_Type', concat(name(parent::node()),@IT_Type))[1]) ]"/> </Folder> </xsl:template> <xsl:template match="Row"> <Folder> <name><xsl:value-of select="@IT_Type"/></name> <xsl:apply-templates select="key('kIT_Type', concat(name(parent::node()),@IT_Type))" mode="placemark"/> </Folder> </xsl:template> <xsl:template match="Row[parent::Point]" mode="placemark"> <Placemark> <name> <xsl:value-of select="@IT_Name"/> </name> <description> </description> <styleUrl> </styleUrl> <Point> <coordinates> <xsl:value-of select="@GPSLong"/>, <xsl:value-of select="@GPSLat"/> </coordinates> </Point> </Placemark> </xsl:template> <xsl:template match="Row[parent::Line]" mode="placemark"> <Placemark> <name> From: <xsl:value-of select="@FROM_SYSTEM_ID"/> to: <xsl:value-of select="@TO_SYSTEM_ID"/> </name> <description> <xsl:value-of select="@CONDUIT_NUMBER"/> </description> <styleUrl> </styleUrl> <LineString> <tessellate>1</tessellate> <coordinates> <xsl:value-of select="@FromLong"/>,<xsl:value-of select="@FromLat"/>,0 <xsl:value-of select="@ToLong"/>,<xsl:value-of select="@ToLat"/>,0 </coordinates> </LineString> </Placemark> </xsl:template> <xsl:template match="Row2"/> </xsl:stylesheet>
Applied at your input, creates RTF:
<Folder> <name>Point</name> <Folder> <name>VSS</name> <Placemark> <name>VSS1</name> <description/> <styleUrl/> <Point> <coordinates>-85.671800000000, 43.953000000000</coordinates> </Point> </Placemark> <Placemark> <name>VSS2</name> <description/> <styleUrl/> <Point> <coordinates>-85.678900000000, 43.966900000000</coordinates> </Point> </Placemark> </Folder> <Folder> <name>Cabinet</name> <Placemark> <name>Cab1</name> <description/> <styleUrl/> <Point> <coordinates>-85.677100000000, 43.903100000000</coordinates> </Point> </Placemark> <Placemark> <name>Cab2</name> <description/> <styleUrl/> <Point> <coordinates>-85.677300000000, 43.913500000000</coordinates> </Point> </Placemark> </Folder> <Folder> <name>DMS</name> <Placemark> <name>DMS1</name> <description/> <styleUrl/> <Point> <coordinates>-85.677100000000, 43.903100000000</coordinates> </Point> </Placemark> <Placemark> <name>DMS2</name> <description/> <styleUrl/> <Point> <coordinates>-85.676800000000, 43.989400000000</coordinates> </Point> </Placemark> </Folder> </Folder> <Folder> <name>Line</name> <Folder> <name>Handhole</name> <Placemark> <name> From: 2127 to: 1947</name> <description/> <styleUrl/> <LineString> <tessellate>1</tessellate> <coordinates>-83.195331982500,43.438474034300,0 -83.193657308800,43.437072542900,0 </coordinates> </LineString> </Placemark> </Folder> <Folder> <name>Cabinet</name> <Placemark> <name> From: 2011 to: 2012</name> <description/> <styleUrl/> <LineString> <tessellate>1</tessellate> <coordinates>-83.260130135400,43.482705558800,0 -83.260107590500,43.482694479700,0 </coordinates> </LineString> </Placemark> </Folder> <Folder> <name>Other</name> <Placemark> <name> From: 2415 to: 2413</name> <description/> <styleUrl/> <LineString> <tessellate>1</tessellate> <coordinates>-83.086848805700,43.624664303600,0 -83.086770805500,43.624645615600,0 </coordinates> </LineString> </Placemark> </Folder> </Folder>