如何在xsl中对同源数据进行分组?

时间:2012-02-09 07:34:01

标签: xslt

假设我们有以下数据:

<all>
    <item id="1"/>
    <item id="2"/>
    ...
    <item id="N"/>
</all>

将这些项目分组的最优雅的xslt-ish方法是什么? 例如,假设我们想要一个每行包含两个单元格的表。 在我的脑海中,我可以想象(尽管没有经过测试) 在模板中,匹配项目,我可以调用这个项目,选择以下兄弟。 但即使在这种情况下,我也应该传递额外的参数,以使递归有限。

2 个答案:

答案 0 :(得分:0)

由于行计数可以变量..我将它作为参数传递给模板..:)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/all[node]">
    <table>
      <xsl:for-each select="node[1]">
        <xsl:call-template name="whoaa">
          <xsl:with-param name="count" select="'1'"/>
          <xsl:with-param name="row_count" select="'10'"/>
          <!--maximum row_count is set to 10 -->
        </xsl:call-template>
      </xsl:for-each>
    </table>
  </xsl:template>

  <xsl:template name="whoaa">
    <xsl:param name="count"/>
    <xsl:param name="row_count"/>
    <!--check if we have crossed row_count-->
    <xsl:if test="not ($row_count &lt; $count)">
      <tr>
        <td>
          <xsl:value-of select="."/>
        </td>
        <td>
          <!--copy next column-->
          <xsl:for-each select="following-sibling::node[1]">
            <xsl:value-of select="."/>
          </xsl:for-each>
        </td>
      </tr>
      <!--Select next row .. call the same template untill we reach (row_count > count)-->
      <xsl:for-each select="following-sibling::node[2]">
        <xsl:call-template name="whoaa">
          <xsl:with-param name="count" select="$count+2"/>
          <xsl:with-param name="row_count" select="$row_count"/>
        </xsl:call-template>
      </xsl:for-each>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

使用position和mod,例如

<xsl:template match="/all">
    <table>
    <xsl:apply-templates name="item" mode="group"/>
    </table>
</xsl:template>

<xsl:template match="item[position() mod 2=1]" mode="group">
<tr>
<td><xsl:apply-templates select="." mode="render"/></td>
<td><xsl:apply-templates select="following-sibling::item[1]" mode="render"/></td>
</tr>
</xsl:template>

<xsl:template match="item[position() mod 2=0]"></xsl:template>

<xsl:template match="item" mode="render">item: <xsl:value-of select="@id"/></xsl:template>