Вот простой способ сделать группировку, если ваши исходные данные уже упорядочены так, как вы ожидаете:
<xsl:apply-templates select="/tag1/*[position() mod 2 = 1]" mode="group"/>
Это будет применять шаблоны к каждому нечетному дочернему элементу tag1
независимо от имени. Вы используете режим для ограничения применяемого шаблона (потому что этот шаблон должен соответствовать *
). Внутри шаблона вы можете использовать ось поиска following-sibling
, чтобы получить следующий узел. Это дает вам что-то вроде:
<xsl:template match="*" mode="group">
<xsl:variable name="next" select="following-sibling::*[1]"/>
<group>
<xsl:copy-of select="."/>
<xsl:copy-of select="$next"/>
</group>
</xsl:template>
Еще проще, если вы можете полагаться на имена элементов:
<xsl:apply-templates select="/tag1/tag2"/>
<xsl:template match="tag2">
<xsl:variable name="next" select="following-sibling::tag3[1]"/>
<group>
<xsl:copy-of select="."/>
<xsl:copy-of select="$next"/>
</group>
</xsl:template>
Обратите внимание: если вы группируете все N элементов, вы можете получить список текущего элемента и его следующих N-1 братьев и сестер:
<xsl:variable name="list" select=". | following-sibling::*[position() < $n]"/>