我有一个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个元素放入其中,任何人都知道如何做到这一点?
答案 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() < $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() < $numColumns">
<xsl:attribute name="colspan">
<xsl:value-of select="$numColumns - position() + 1" />
</xsl:attribute>
</xsl:if>
<xsl:value-of select="title"/>
</td>
</xsl:template>