Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
937 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 Answer

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>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...