Извините, что полностью пересмотрел ваш первоначальный шаблон, но наиболее распространенный способ сделать это (в XSLT 1.0) - применить метод Meunchian к многоуровневой группировке. В вашем конкретном случае вы можете создать xsl:key
на основе конкатенации @IT_Type
и родительского элемента Row
.
Например, это XSLT 1.0 (проверено при 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>
<!--xsl:value-of select="@Location"/-->
</description>
<styleUrl>
<!--xsl:value-of select="concat($hash,@IT_Type)"/-->
</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>
<!-- xsl:value-of select="concat($hash,@IT_Type)"/-->
</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>
Применительно к вашему входу, выдает 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>