Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
938 views
in Technique[技术] by (71.8m points)

xslt - Split large table into several smaller tables

I have a problem where a table has 100s of rows. It causes an issue and needs to be split into several smaller tables with fewer rows each.

My html is valid xml as well.

How can I split the table every x rows into a new table?

And, how can I copy the table style, and first row (header) into each subsequent table.

So something like this

<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>

Becomes

<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>
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This is the classical XSLT 1.0 solution for such kind of problems:

<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>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...