xslt foreach和break

rty*_*hyk 1 xslt xslt-1.0

我知道在xslt中没有break语句而且不知道如何解决我的问题.

      <tag name="param" />
      <tag name="Token" />
      <tag name="Token" />
      <tag name="Token" />
      <tag name="param" />
      <tag name="Token" />
      <tag name="param" />
      <tag name="Token" />
      <tag name="Token" />
      <tag name="Token" />
      <tag name="return"/>
Run Code Online (Sandbox Code Playgroud)

必须在下一个参数之前将参数与所有令牌分组.我怎么能这样做?

输出必须是这样的:

param
    Token
    Token
    Token
param
    Token
param
    Token
    Token
    Token   
Run Code Online (Sandbox Code Playgroud)

Tim*_*m C 5

实现这一目标的另一种方法是匹配"非参数"元素的关键,将它们按第一个最前面的参数元素分组

<xsl:key 
  name="params" 
  match="tag[@name!='param']" 
  use="generate-id(preceding-sibling::tag[@name='param'][1])" />
Run Code Online (Sandbox Code Playgroud)

然后,您将从匹配"param"元素开始

<xsl:apply-templates select="tag[@name='param']" />
Run Code Online (Sandbox Code Playgroud)

对于您匹配的每个,您可以使用密钥在组中选择关联的标签

<xsl:apply-templates select="key('params', generate-id())" />
Run Code Online (Sandbox Code Playgroud)

尝试以下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&#10;</xsl:text> 
      <xsl:apply-templates select="key('params', generate-id())" />
   </xsl:template>

   <xsl:template match="tag">
      <xsl:value-of select="concat(' - ', @name, '&#10;')" />
   </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

应用于示例XML(假设为根元素)时,将输出以下内容

param
 - Token
 - Token
 - Token
param
 - Token
param
 - Token
 - Token
 - Token
 - return
Run Code Online (Sandbox Code Playgroud)

如果您不想要"return"元素,可以添加另一个模板以匹配它,然后忽略它.