[阅读: 377] 2004-08-18 02:10:39
写了一个递归,用了一点小诡计。长期不练,算法知识已经忘光了,折腾得这叫费劲呀。
<!-- row(startpos), separate a row from startpos -->
<xsl:template name="row">
<xsl:param name="startpos"/>
<xsl:if test="$startpos <= count(/site/section)">
<xsl:variable name="sa-node"
select="section[position() >= $startpos
and position() < $startpos + $columns
and @standalone='yes'] "/>
<xsl:if test="$sa-node">
<xsl:for-each select="/site/section">
<xsl:if test="@name = $sa-node/@name">
<xsl:if test="position() mod $columns != 1">
<xsl:call-template name="onerow">
<xsl:with-param name="startpos" select="$startpos"/>
<xsl:with-param name="endpos" select="position() - 1"/>
</xsl:call-template>
</xsl:if>
<xsl:call-template name="onerow">
<xsl:with-param name="startpos" select="position()"/>
<xsl:with-param name="endpos" select="position()"/>
</xsl:call-template>
<xsl:call-template name="row">
<xsl:with-param name="startpos" select="position() + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:if>
<xsl:if test="not($sa-node)">
<xsl:call-template name="onerow">
<xsl:with-param name="startpos" select="$startpos"/>
<xsl:with-param name="endpos" select="$startpos + $columns - 1"/>
</xsl:call-template>
<xsl:call-template name="row">
<xsl:with-param name="startpos" select="$startpos + $columns"/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>