实现这一点的另一种方法是匹配“非参数”元素的键,按第一个最前面的参数元素对它们进行分组
<xsl:key
name="params"
match="tag[@name!='param']"
use="generate-id(preceding-sibling::tag[@name='param'][1])" />
然后,您将首先匹配您的“参数”元素
<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(假设根 lelement)时,输出以下内容
param
- Token
- Token
- Token
param
- Token
param
- Token
- Token
- Token
- return
如果你不想要“return”元素,你可以添加另一个模板来匹配它,然后忽略它。