これを実現する別の方法は、「非パラメータ」要素を一致させ、最初に先行するパラメータ要素でグループ化するためのキーです。
<xsl:key
name="params"
match="tag[@name!='param']"
use="generate-id(preceding-sibling::tag[@name='param'][1])" />
次に、「param」要素を照合することから始めます
<xsl:apply-templates select="tag[@name='param']" />
そして、一致するものごとに、キーを使用してグループ内の関連するタグを選択できます
<xsl:apply-templates select="key('params', generate-id())" />
次のXSLTを試してください
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:key name="params" match="tag[@name!='param']" use="generate-id(preceding-sibling::tag[@name='param'][1])" />
<xsl:template match="/*">
<xsl:apply-templates select="tag[@name='param']" />
</xsl:template>
<xsl:template match="tag[@name='param']">
<xsl:text>param </xsl:text>
<xsl:apply-templates select="key('params', generate-id())" />
</xsl:template>
<xsl:template match="tag">
<xsl:value-of select="concat(' - ', @name, ' ')" />
</xsl:template>
</xsl:stylesheet>
サンプルXMLに適用すると(ルート要素を想定)、次のように出力されます。
param
- Token
- Token
- Token
param
- Token
param
- Token
- Token
- Token
- return
「return」要素が必要ない場合は、それに一致する別のテンプレートを追加して、無視することができます。