Эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kRecordByFirmAndContact" match="Record"
use="concat(FieldValue[@fieldName='firm_number']
/@fieldValue,
'+',
FieldValue[@fieldName='contact_number']
/@fieldValue)"/>
<xsl:template
match="Record
[count(.|key('kRecordByFirmAndContact',
concat(FieldValue
[@fieldName='firm_number']
/@fieldValue,
'+',
FieldValue
[@fieldName='contact_number']
/@fieldValue))[1])
= 1 ]">
<xsl:variable name="vRecords"
select="key('kRecordByFirmAndContact',
concat(FieldValue
[@fieldName='firm_number']
/@fieldValue,
'+',
FieldValue
[@fieldName='contact_number']
/@fieldValue))"/>
<xsl:value-of select="concat('A ',
*[@fieldName='firm_name']
/@fieldValue,
' ',
*[@fieldName='firm_number']
/@fieldValue,
'
',
'B ',
*[@fieldName='prepared_by']
/@fieldValue,
' ',
*[@fieldName='contact_number']
/@fieldValue,
'
')"/>
<xsl:apply-templates select="$vRecords" mode="RecordC"/>
<xsl:value-of select="concat('T ',count($vRecords) + 2,'
')"/>
</xsl:template>
<xsl:template match="Record" mode="RecordC">
<xsl:value-of select="concat('C ',
*[@fieldName='trade_date']
/@fieldValue,
' ',
*[@fieldName='symbol']
/@fieldValue,
'
')"/>
</xsl:template>
</xsl:stylesheet>
Вывод:
A Firm_1 11
B PARKER 123456789
C 2010-10-17 ADM
C 2010-10-16 ACW
T 4
A Firm_2 12
B EDWARDS 123456780
C 2010-10-19 ADS
T 3
Примечание : Как видите, это не сложно, но ваша схема делает код настолько многословным... Это похоже на формат M $ XML для дампов данных.