代码之家  ›  专栏  ›  技术社区  ›  CaffGeek

把大桌子分成几个小桌子

  •  5
  • CaffGeek  · 技术社区  · 14 年前

    我有一个问题,一个表有100行。它会导致一个问题,需要拆分成几个较小的表,每个表的行数较少。

    我的html也是有效的xml。

    如何将表每x行拆分为一个新表?

    以及,如何将表样式和第一行(标题)复制到每个后续表中。

    像这样的事情

    <table class="..." style="...">
       <tr>
           <td>head 1</td>
           <td>head 2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    <table>
    

    <table class="..." style="...">
       <tr>
           <td>head 1</td>
           <td>head 2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    </table>
    
    <table class="..." style="...">
       <tr>
           <td>head 1</td>
           <td>head 2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    </table>
    
    <table class="..." style="...">
       <tr>
           <td>head 1</td>
           <td>head 2</td>
       </tr>
    
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    
    </table>
    
    <table class="..." style="...">
       <tr>
           <td>head 1</td>
           <td>head 2</td>
       </tr>
       <tr>
           <td>col1</td>
           <td>col2</td>
       </tr>
    <table>
    
    3 回复  |  直到 14 年前
        1
  •  3
  •   Dimitre Novatchev    14 年前

    这是典型的XSLT1.0解决方案

    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
        <xsl:strip-space elements="*"/>
    
        <xsl:param name="prowLimit" select="12"/>
    
        <xsl:variable name="vTable" select="/*"/>
    
     <xsl:template match="node()|@*" name="identity">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
     </xsl:template>
    
     <xsl:template match="tr">
      <xsl:if test="position() mod $prowLimit = 1">
        <table>
          <xsl:copy-of select="$vTable/@*"/>
          <xsl:copy-of select=
          ". | following-sibling::tr[not(position() > $prowLimit -1)]"/>
        </table>
      </xsl:if>
     </xsl:template>
    </xsl:stylesheet>
    
        2
  •  1
  •   Jim Garrison    14 年前

    这里有一个用于每个组的XSLT2解决方案。要更改每个表的项数,请更改“组相邻”属性中的除数。在Oxygen/XML和saxon9.2中测试。

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
      exclude-result-prefixes="xs xd"
      version="2.0">
      <xsl:output method="xml" indent="yes"/>
      <xsl:template match="table">
        <xsl:variable name="tblNode" select="."/>
        <xsl:variable name="header"  select="tr[1]"/>
        <xsl:for-each-group select="tr[position() > 1]" group-adjacent="(position()-1) idiv 3">
          <xsl:element name="table">
            <xsl:copy-of select="$tblNode/@*"/>
            <xsl:copy-of select="$header"/>
            <xsl:apply-templates select="current-group()"/>
          </xsl:element>
        </xsl:for-each-group>
      </xsl:template>
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    

    1. 在“table”模板中,为表节点本身创建一个变量,这样我们以后就可以复制它的属性,并创建一个包含第一行的变量作为头。
    2. 对于每个集合,生成一个表元素,然后复制原始表的所有属性,然后是标题行,然后使用标识模板(在样式表的末尾)复制所有行。

    请注意,如果行中有嵌套的表,则必须对此稍加修改,以避免“table”模板与内部表匹配。

        3
  •  0
  •   user357812 user357812    14 年前

    此XSLT 1.0样式表:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:param name="pMaxRow" select="2"/>
        <xsl:template match="/">
            <html>
                <xsl:apply-templates
                     select="table/tr[(position()-1) mod $pMaxRow = 1]"
                     mode="table"/>
            </html>
        </xsl:template>
        <xsl:template match="node()|@*" name="identity">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
        <xsl:template match="tr" mode="table">
            <table>
                <xsl:apply-templates select="../@*|../tr[1]|.|following-sibling::tr
                                                 [$pMaxRow > position()]"/>
            </table>
        </xsl:template>
    </xsl:stylesheet>
    

    <html>
        <table class="..." style="...">
            <tr>
                <td>head 1</td>
                <td>head 2</td>
            </tr>
            <tr>
                <td>col1</td>
                <td>col2</td>
            </tr>
            <tr>
                <td>col1</td>
                <td>col2</td>
            </tr>
        </table>
        <table class="..." style="...">
            <tr>
                <td>head 1</td>
                <td>head 2</td>
            </tr>
            <tr>
                <td>col1</td>
                <td>col2</td>
            </tr>
            <tr>
                <td>col1</td>
                <td>col2</td>
            </tr>
        </table>
        <table class="..." style="...">
            <tr>
                <td>head 1</td>
                <td>head 2</td>
            </tr>
            <tr>
                <td>col1</td>
                <td>col2</td>
            </tr>
            <tr>
                <td>col1</td>
                <td>col2</td>
            </tr>
        </table>
    </html>
    

    编辑