XMLの要素を反復処理するというかなり単純なことを行う必要があります(XMLの下での詳細な説明)
<form>
<field index="1" name="field_X_1" group="firstGroup" type="String">
<value>Value of Field X 1 of first group</value>
</field>
<field index="1" name="field_Y_1" group="firstGroup" type="String">
<value>Value of Field Y 1 of first group</value>
</field>
<field index="2" name="field_X_2" group="firstGroup" type="String">
<value>Value of Field X 2 of first group</value>
</field>
<field index="2" name="field_Y_2" group="firstGroup" type="String">
<value>Value of Field Y 2 of first group</value>
</field>
<field index="1" name="field_A_1" group="secondGroup" type="String">
<value>Value of Field A 1 of second group</value>
</field>
<field index="1" name="field_B_1" group="secondGroup" type="String">
<value>Value of Field B 1 of second group</value>
</field>
<field index="2" name="field_A_2" group="secondGroup" type="String">
<value>Value of Field A 2 of second group</value>
</field>
<field index="2" name="field_B_2" group="secondGroup" type="String">
<value>Value of Field B 2 of second group</value>
</field>
</form>
現在、firstGroup のすべてのフィールドを反復処理しており、インデックスが変更されていることがわかるたびに (インデックスを兄弟のインデックスと比較して)、改行文字を追加します)。問題は、インデックスを反復処理するだけでよいことです (それでも、firstGroup と secondGroup の区別は維持されます)。
私の出力は次のようになります
Value of Field X 1 of first group, Value of Field Y 1 of first group
Value of Field X 2 of first group, Value of Field Y 2 of first group
Value of Field A 1 of second group, Value of Field B 1 of second group
Value of Field A 2 of second group, Value of Field B 2 of second group
etc
私のXSLは今のようになります
<xsl:for-each select='/form/field[@group="firstGroup"]'>
<xsl:sort select="@index" order="ascending"></xsl:sort>
<xsl:if test='preceding-sibling::*[@group="firstGroup"][1]/@index != @index and count(preceding-sibling::*) != 0 '>
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:value-of select="//field[@name=concat('field_X_', @index,')]/value"/>
<xsl:value-of select="//field[@name=concat('field_Y_', @index,')]/value"/>
</xsl:for-each>
<!-- Differente iteration for second group-->
<xsl:text>
</xsl:text>
<xsl:for-each select='/form/field[@group="firstGroup"]'>
<xsl:sort select="@index" order="ascending"></xsl:sort>
<xsl:if test='preceding-sibling::*[@group="firstGroup"][1]/@index != @index and count(preceding-sibling::*) != 0 '>
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:value-of select="//field[@name=concat('field_A_', @index,')]/value"/>
<xsl:value-of select="//field[@name=concat('field_B_', @index,')]/value"/>
</xsl:for-each>