Исходя из вашего предыдущего вопроса, вы все равно можете выполнить форму «начало группы», используя следующую клавишу:
<xsl:key name="start" match="catalog/*" use="generate-id(preceding-sibling::de[@name='16R'][. = 'FIN'][1])" />
Чтобы получить первые три элемента, которые вы хотите, в «35B»", тогда вы бы сделали это ...
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='35B']]" mode="ds-35B" />
И получите первый элемент" 93B ", с количеством_типов" AGGR ", который вы можете сделать:
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='93B'][de[@name='amount_type']='AGGR']][1]" mode="ds-93B" />
Попробуйтеэто так ...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="start" match="catalog/*" use="generate-id(preceding-sibling::de[@name='16R'][. = 'FIN'][1])" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="catalog">
<xsl:copy>
<xsl:for-each select="de[@name='16R'][. = 'FIN']">
<group>
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='35B']]" mode="ds-35B" />
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='93B'][de[@name='amount_type']='AGGR']][1]" mode="ds-93B" />
</group>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="ds" mode="ds-35B">
<xsl:apply-templates select="de[@name='instrument_identification' or @name='instrument_type' or @name='instrument_code']" />
</xsl:template>
<xsl:template match="ds" mode="ds-93B">
<xsl:apply-templates select="de[@name='amount']" />
</xsl:template>
</xsl:stylesheet>