Чтобы сделать это в XSLT 1.0, вам придется использовать технику под названием "muenchian grouping" . Сначала создайте ключ узлов, по которым вы хотите сгруппировать
<xsl:key name="intfield" match="int" use="substring-before(@name, ':')" />
Далее вы повторяете его по всем узлам, но выбираете только те, которые оказались первыми в соответствующей группе
<xsl:for-each select="int[generate-id() = generate-id(key('intfield', substring-before(@name, ':'))[1])]">
Далее, вы можете использовать итерацию, чтобы перебрать все узлы в группе
<xsl:variable name="intfieldname" select="substring-before(@name, ':')"/>
<xsl:for-each select="key('intfield', $intfieldname)">
Соединение всего этого дает
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:key name="intfield" match="int" use="substring-before(@name, ':')"/>
<xsl:template match="/results">
<results>
<xsl:for-each select="int[generate-id() = generate-id(key('intfield', substring-before(@name, ':'))[1])]">
<xsl:variable name="intfieldname" select="substring-before(@name, ':')"/>
<field>
<xsl:attribute name="name">
<xsl:value-of select="$intfieldname"/>
</xsl:attribute>
<xsl:for-each select="key('intfield', $intfieldname)">
<value>
<xsl:attribute name="name">
<xsl:value-of select="substring-after(@name, ':')"/>
</xsl:attribute>
<xsl:value-of select="."/>
</value>
</xsl:for-each>
</field>
</xsl:for-each>
</results>
</xsl:template>
</xsl:stylesheet>
В вашем примере 'intfield' становится 'numberfield'. Я сохранил имя как 'intfield' в приведенном выше примере.