Добавьте следующий шаблон к преобразованию идентичности:
<xsl:template match="/*/*[position() < 11]"/>
Как это работает: преобразование идентичности копирует любой узел, которому соответствует, в результирующий документ, рекурсивно. Но критерии соответствия для преобразования идентичности имеют наименьший возможный приоритет; если узел соответствует любому шаблону с более высоким приоритетом, этот шаблон будет использоваться вместо этого. (Правила приоритетов неясны, но они настолько хорошо разработаны, что вам редко нужно о них знать; вообще говоря, если узел соответствует двум шаблонам, XSLT выберет шаблон, шаблон которого является более конкретным.)
В этом случае мы говорим, что если узел является элементом, который является дочерним элементом элемента верхнего уровня (элемент верхнего уровня является первым элементом под корнем, или /*
, а его дочерние элементы таким образом /*/*
) и его позиция в этом списке узлов равна 11 или выше, его не следует копировать.
Edit:
Уф. Все в вышесказанном является правильным, за исключением самого важного. То, что я написал, скопирует каждого потомка элемента верхнего уровня , за исключением для первых десяти.
Вот полная (и правильная) версия шаблонов, которые вам понадобятся:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*[position() > 10]"/>
Вот и все. Первый шаблон копирует все, что не соответствует второму шаблону. Второй шаблон сопоставляет все элементы после первых 10 и ничего с ними не делает, поэтому они не копируются в вывод.