Вот еще один способ сделать это.
Сначала сопоставьте все дочерние узлы элемента блока
<xsl:template match="block/child::*">
Далее, проверьте, имеет ли другое имя самого прямого родственного элемента другое имя, указывая, что это первый из одного или нескольких соседних элементов:
<xsl:if test="local-name(preceding-sibling::*[position()=1]) != $name">
Если это так, вы можете скопировать этот узел. Затем вам нужно скопировать следующих братьев и сестер с тем же именем. Я сделал это, рекурсивно вызывая шаблон для каждого сразу же следующего брата с тем же именем
<xsl:apply-templates select="following-sibling::*[1][local-name()=$name]" mode="next"/>
Соединение всего этого дает
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<!-- Match children of the block element -->
<xsl:template match="block/child::*">
<xsl:variable name="name" select="local-name()"/>
<!-- Is this the first element in a sequence? -->
<xsl:if test="local-name(preceding-sibling::*[position()=1]) != $name">
<xsl:copy>
<xsl:apply-templates />
<!-- Match the next sibling if it has the same name -->
<xsl:apply-templates select="following-sibling::*[1][local-name()=$name]" mode="next"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<!-- Recursive template used to match the next sibling if it has the same name -->
<xsl:template match="block/child::*" mode="next">
<xsl:variable name="name" select="local-name()"/>
<xsl:apply-templates />
<xsl:apply-templates select="following-sibling::*[1][local-name()=$name]" mode="next"/>
</xsl:template>
<!-- Template used to copy a generic node -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>