首页 > 解决方案 > XSLT 按“n”次分组然后复制子节点

问题描述

我需要对公司进行分组,并且新节点组中节点行可以出现的最大数量为 3。

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:decimal-format name="coerce" NaN="0"/>
<xsl:template match="/root">
    <root>
        <!--Group by fields, can only group by 1 element each time-->
        <xsl:for-each-group select="row" group-by="Company">
            <xsl:for-each-group select="current-group()" group-by="Department">
                <xsl:for-each select="current-group()">
                    <!--Create a variable for the row count-->
                    <xsl:variable name="Grpcounter" select="number(position())"/>
                    <xsl:if test="$Grpcounter &lt; 3">
                        <xsl:call-template name="Group">
                        </xsl:call-template>
                    </xsl:if>
                </xsl:for-each>
            </xsl:for-each-group>
        </xsl:for-each-group>
    </root>
</xsl:template>
<xsl:template name="Group">
    <xsl:copy-of select="."/>
</xsl:template>

</xsl:样式表>

标签: group-byduplicates

解决方案


您能否按如下方式更新您的 xslt:

替换: <xsl:template match="/root"> . . . </xsl:template>

    <xsl:template match="/root">
      <xsl:variable name="grouped">
        <!--Group by fields, can only group by 1 element each time-->
        <xsl:for-each-group select="row" group-by="Company">
        <!--<xsl:for-each-group select="current-group()" group-by="Department">-->
          <xsl:for-each select="current-group()">
            <xsl:choose>
              <xsl:when test="position() mod 3 = 1">
                <Group>
                  <xsl:call-template name="Group"/>
                </Group>
              </xsl:when>
              <xsl:otherwise>
                <Group1>
                  <xsl:call-template name="Group"/>
                </Group1>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:for-each>
          <!--</xsl:for-each-group>-->
        </xsl:for-each-group>
      </xsl:variable>
      <root>
        <xsl:for-each-group select="$grouped/*" group-starting-with="Group">
          <Group>
            <xsl:copy-of select="current-group()/row"/>
          </Group>
        </xsl:for-each-group>    
      </root>
    </xsl:template>

获得预期的输出。查看结果


推荐阅读