使用XSLT显示表格记录,即记录显示x列,然后显示新行

使用XSLT显示表格记录,即记录显示x列,然后显示新行,xslt,Xslt,我有以下XML: <?xml version="1.0" encoding="utf-8" ?> <data> <record> <id>1</id> <name>David</name> <age>40</age> </record> <record> <id>2</id> <name>Tully&l

我有以下XML:

<?xml version="1.0" encoding="utf-8" ?>
<data>
 <record>
  <id>1</id>
  <name>David</name>
  <age>40</age> 
 </record>
 <record>
  <id>2</id>
  <name>Tully</name>
  <age>38</age>
 </record>
 <record>
  <id>3</id> 
  <name>Solai</name>
  <age>32</age>
 </record>
 <record>
  <id>4</id> 
  <name>Michael</name>
  <age>49</age>
 </record>
 <record>
  <id>5</id> 
  <name>Tony</name>
  <age>19</age>
 </record>
 <record>
  <id>6</id> 
  <name>Ray</name>
  <age>26</age>
 </record>
 <record>
  <id>7</id> 
  <name>Leeha</name>
  <age>13</age>
 </record>

</data>

1.
大卫
40
2.
塔利
38
3.
索莱
32
4.
迈克尔
49
5.
托尼
19
6.
射线
26
7.
利哈
13
我希望将记录显示为类似于asp.net中的dataview,如下所示:

record 1 record2 record3 record4 record 5 record6 record7 record8 记录1记录2记录3记录4 记录5记录6记录7记录8 等等

我现在有下面的XSL,至少可以说是不可靠的

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

 <div>
 <table style="width: 200px" border="1">

  <tr>
  <xsl:for-each select="data/record">

   <xsl:if test="position() mod 4 = 0">
   <tr></tr>
   </xsl:if> 

   <td>
    <xsl:value-of select="name"></xsl:value-of>
    <br />
    <xsl:value-of select="age"></xsl:value-of>
   </td>

  </xsl:for-each>
  </tr>

 </table>
 </div>

</xsl:template>

</xsl:stylesheet>


所以我的问题是,我在这条路上走对了吗。。还是有更简单、更可靠的方法来实现这一点


非常感谢。

我想你大致说对了,但是你在另一个
tr
中嵌入了一个空的
tr
,它不会做任何有用的事情,可能会干扰浏览器。如果你发布了你期望的HTML,那么它将更清楚如何实现它。

查看以下内容:

或者也包括:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">

    <div>
      <table style="width: 200px" border="1">

        <tr>
          <xsl:for-each select="data/record">
            <td>
              <xsl:value-of select="name" /><br />
              <xsl:value-of select="age" />
            </td>
            <xsl:if test="position() mod 4 = 0 and position() != last()">
              <xsl:text disable-output-escaping="yes">
                 &lt;/tr&gt;&lt;tr&gt;
              </xsl:text>
            </xsl:if>
          </xsl:for-each>
        </tr>

      </table>
    </div>

  </xsl:template>

</xsl:stylesheet>


/trtr

 
我不久前写过这篇文章(我刚刚对它进行了修改,以适合您的XML模式):




变量C是列数,变量M是每个单元格的记录数。

第二个答案简单而有效-虽然有一个“gotcha”,但您需要抓住最后一行正好有四个项目的情况,而不是放弃额外的插入。@Murph:我现在无法测试它,但有一个
和位置!=last()
应该可以做到这一点;我编辑了我的答案以反映这一点,ty@Rubens:我同意(我抵制住了诱惑,行使我崭新的“编辑”权利,做出完全相同的更改-还没有完全解决这个问题!)嗨,伙计们!非常感谢所有的例子。。真的很有用。我喜欢这个答案的简单性,尽管我可以理解为什么其他答案(来自下面的Erlock和上面的一个)可能有更多的灵活性。。但不管怎样,真的非常感谢!忘记将“模式”名称从默认更改为其他名称sensible@RubensFarias:使用xsl:text-disable输出转义攻击节点树输出是不好的。
  <xsl:template match="/data">
    <div>
       <table style="width: 200px" border="1">
        <xsl:apply-templates select="record[position() mod 4 = 1]"/>
      </table>
    </div>
  </xsl:template>
  <xsl:template match="record">
    <row>
      <xsl:apply-templates select=". | following-sibling::record[position() &lt; 4]" mode="mode" />
    </row>
  </xsl:template>
  <xsl:template match="record" mode="mode">
    <cell>
      <xsl:value-of select="id"/>
    </cell>
    <xsl:if test="position() = last() and position() &lt; 3">
      <xsl:call-template name="complete-row">
        <xsl:with-param name="count" select="position()"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
  <xsl:template name="complete-row">
     <xsl:param name="count"/>
     <td>&#160;</td>
     <xsl:if test="($count + 1) &lt; 3">
        <xsl:call-template name="complete-row">
           <xsl:with-param name="count" select="$count + 1"/>
        </xsl:call-template>
     </xsl:if>
  </xsl:template>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

   <xsl:output method="html"/> 

   <xsl:variable name="M" select="5"/> 
   <xsl:variable name="C" select="2"/> 

   <xsl:template match="/"> 
      <html> 
        <body> 
           <table border="1"> 
             <xsl:for-each select="/data/record[position() mod ($M * $C) = 1]"> 
                <tr>
                  <xsl:for-each select=".|following-sibling::record[position() mod $M = 0 and position() &lt; $M * $C]">
                    <td>
                      <xsl:for-each select=".|following-sibling::record[position() &lt; $M]">
                        <xsl:value-of select="name"/><br/>
                        <xsl:value-of select="age"/>
                      </xsl:for-each>
                    </td>
                  </xsl:for-each>
                  <xsl:if test="position() = last()">
                    <xsl:call-template name="empty-cells">
                      <xsl:with-param name="nb" select="$C - ceiling(count(.|following-sibling::record) div $M)"/>
                    </xsl:call-template>
                  </xsl:if>
                </tr>
             </xsl:for-each> 
           </table> 
        </body> 
      </html> 
   </xsl:template> 

   <xsl:template name="empty-cells">
    <xsl:param name="nb"/>
    <xsl:if test="$nb &gt;= 1">
        <td/>
        <xsl:call-template name="empty-cells">
          <xsl:with-param name="nb" select="$nb - 1"/>
        </xsl:call-template>
    </xsl:if>       
   </xsl:template>


</xsl:stylesheet>