当前位置: 代码迷 >> XML/SOAP >> xsl生成多列列表解决方案
  详细解决方案

xsl生成多列列表解决方案

热度:493   发布时间:2014-02-23 23:10:46.0
xsl生成多列列表
xml中有一个图像的列表,想用XSLT生成FO:table的列表,每行三个,XSLT如何控制每满三个添加一行?
本帖最后由 net_lover 于 2013-02-16 18:54:27 编辑
可参考这个例子
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
   <!-- 定义常量 -->
    <xsl:variable name="strTrLeft" select="'&lt;tr&gt;'"/>
    <xsl:variable name="strTrRight" select="'&lt;/tr&gt;'"/>
    <!-- 计算总记录数 -->
    <xsl:variable name="nTotal" select="count(/Items/Item)"/>
    <!-- 定义列数 -->
    <xsl:variable name="nCols" select="3"/>
    <!-- 计算需要的补齐的列数 -->
    <xsl:variable name="nLefted" select="$nCols - ($nTotal mod $nCols)"/>
    <!-- 计算不需要补齐的行数 -->
    <xsl:variable name="nNotProcessedRow" select="$nTotal -  ($nTotal mod $nCols)"/>
    <table bgcolor="snow" border="1" cellpadding="5" cellspacing="2" borderColor="darkorange"
      style="font-size:9pt">
     <!-- 对于不需要补齐的行数,直接输出 -->
      <xsl:for-each select="/Items/Item[position() &lt; $nNotProcessedRow +1]">
        <xsl:if test="position() mod $nCols = 1">
          <xsl:value-of select="$strTrLeft" disable-output-escaping="yes"/>
        </xsl:if>
        <td>
    <a target="_blank">
      <xsl:attribute name="href">
        <xsl:if test="contains(Url,'@')">mailto:</xsl:if><xsl:value-of select="Url"/></xsl:attribute>
      <xsl:value-of select="Title"/>
    </a>
        </td>
        <xsl:if test="position() mod $nCols = 0">
          <xsl:value-of select="$strTrRight" disable-output-escaping="yes"/>
        </xsl:if>
      </xsl:for-each>
      <!-- 转换除去不需要补齐的记录的剩余记录 -->
      <xsl:if test="$nLefted != 0 and $nLefted != $nCols">
        <xsl:value-of select="$strTrLeft" disable-output-escaping="yes"/>
        <xsl:for-each select="/Items/Item[position() &gt;$nNotProcessedRow]">
          <td>
    <a target="_blank">
      <xsl:attribute name="href">
        <xsl:if test="contains(Url,'@')">mailto:</xsl:if><xsl:value-of select="Url"/></xsl:attribute>
      <xsl:value-of select="Title"/>
    </a>
          </td>
        </xsl:for-each>
        <!--
        如果nLefted不等于0和列数,则需要进行补齐,这里进行递归调用,需要传递的参数有两个:
        nLefted:要补齐的列数;
        nCols:表格的列数。
        -->
        <xsl:call-template name="MyFun">
          <xsl:with-param name="nLefted" select="$nLefted"/>
          <xsl:with-param name="nCols" select="$nCols"/>
        </xsl:call-template>
        <xsl:value-of select="$strTrRight" disable-output-escaping="yes"/>
      </xsl:if>
    </table>
    <p>共有<xsl:value-of select="$nTotal"/>条数据。</p>
  </xsl:template>
  <xsl:template name="MyFun">
    <xsl:param name="nLefted"/>
    <xsl:param name="nCols"/>
    <xsl:if test=" $nLefted != 0 and $nLefted != $nCols">
      <td>
        <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
      </td>
  相关解决方案