XSLT创建具有不同列数的表

时间:2010-04-20 16:43:00

标签: asp.net xslt rss

我有一个RSS提要,我需要在一个表格中显示(它来自网上商店系统的衣服)。 RSS中的图像宽度和高度各不相同,我想制作一张能够全部显示它们的表格。首先,我很高兴只是显示3列中的所有项目,但在路上我需要能够通过参数指定我的表中的列数。我遇到一个问题,显示tr标签,并使其正确,这是我的代码到目前为止:

 <xsl:template match="item">
    <xsl:choose>      
      <xsl:when test="position() mod 3 = 0 or position()=1">
        <tr>
          <td>
            <xsl:value-of select="title"/>
          </td>
        </tr>
        </xsl:when>
      <xsl:otherwise>
        <td>
          <xsl:value-of select="title"/>
        </td>
      </xsl:otherwise>
    </xsl:choose>    
  </xsl:template> 

在RSS中,所有“item”标签都在xml的同一级别上,到目前为止我只需要标题节目。问题似乎是我需要指定开始标记以及tr元素的结束标记,并且不能将所有3个元素放入其中,任何人都知道如何做到这一点?

1 个答案:

答案 0 :(得分:2)

当你退后一步时很容易。将问题分成更小的部分。

<xsl:param name="numColumns" select="3" />

<xsl:template match="channel">
  <table>
    <!-- all items that start a column have position() mod x = 1 -->
    <xsl:apply-templates 
       select="item[position() mod $numColumns = 1]" 
       mode="tr"
    />
  </table>
</xsl:template>

<xsl:template match="item" mode="tr">
  <tr>
    <!-- all items make a column: this one (.) and the following x - 1 -->
    <xsl:apply-templates 
      select=".|following-sibling::item[position() &lt; $numColumns]"
      mode="td"
    />
  </tr>
</xsl:template>

<xsl:template match="item" mode="td">
  <td>
    <!-- calculate optional colspan for the last td -->
    <xsl:if test="position() = last() and position() &lt; $numColumns">
      <xsl:attribute name="colspan">
        <xsl:value-of select="$numColumns - position() + 1" />
      </xsl:attribute>
    </xsl:if>
    <xsl:value-of select="title"/>
  </td>
</xsl:template>