代码之家  ›  专栏  ›  技术社区  ›  Piotr Czapla

在xslt 1.0中每3项分组一次

  •  2
  • Piotr Czapla  · 技术社区  · 15 年前

    我很难找到对xslt 1.0项进行分组的方法。 我有一个类似于下面的源xml:

    <client name="client A">
        <project name = "project A1"/>
        <project name = "project A2"/>
        <project name = "project A3"/>
        <project name = "project A4"/>
    </client>
    <client name="client B">
        <project name = "project B1"/>
        <project name = "project B2"/>
    </client>
    <client name="client C">
        <project name = "project C1"/>
        <project name = "project C2"/>
        <project name = "project C3"/>
    </client>
    

    我要选择所有项目,对它们进行排序,然后在一个边界中对每3个项目进行分组,如下例所示:

    <boundle>
      <project name="project A1">
      <project name="project A2">
      <project name="project A3">
    </boundle>
    <boundle>
      <project name="project A4">
      <project name="project B1">
      <project name="project B2">
    </boundle>
    <boundle>
      <project name="project C1">
      <project name="project C2">
      <project name="project C3">
    </boundle>
    

    目前我正在使用打开一个边界标记并稍后关闭它。 你能想出更好的办法吗?

    2 回复  |  直到 13 年前
        1
  •  4
  •   Tomalak    15 年前

    无需分组。

    <xsl:param name="perGroup" select="3" />
    
    <xsl:variable name="allProjects" select="/client/project" />
    
    <xsl:template match="/">
      <xsl:apply-templates select="$allProjects" mode="counted" />
    </xsl:template>
    
    <xsl:template match="project" mode="counted">
      <xsl:if test="position() mod $perGroup = 1">
        <xsl:variable name="pos" select="position()" />
        <boundle>
          <xsl:copy-of select="$allProjects[
            position() &gt;= $pos and position() &lt; ($pos + $perGroup)
          ]" />
        </boundle>
      </xsl:template>
    </xsl:template>
    
        2
  •  0
  •   Thomas Bindzus    13 年前

    我可以推荐以下链接 http://www.jenitennison.com/xslt/grouping/ 这有助于我了解如何根据xml文档中的内容将不同数量的元素分组到一些类别中。