2009-12-21 51 views
2

如果我有如下表:如何在XSL中將表格垂直分割爲兩個表格?

<table> 
    <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td></tr> 
    <tr><td>A</td><td>B</td><td>C</td><td>D</td><td>E</td><td>F</td></tr> 
</table> 

我怎麼會在XSLT分裂,這樣我結束了以下內容:

<table> 
    <tr><td>1</td><td>2</td><td>3</td></tr> 
    <tr><td>A</td><td>B</td><td>C</td></tr> 
</table>  
<table> 
    <tr><td>4</td><td>5</td><td>6</td></tr> 
    <tr><td>D</td><td>E</td><td>F</td></tr> 
</table> 

我感興趣的是廣義的方法,其中表可以有任何維度並且可以分成兩個以上的表格。我不關心行;我想拆分N列以上的地方,並且以TD爲表格數據單元的TD/N表格結束。例如,如果有12列和25行,我想要4個表格,每個表格有3列25行。

回答

1

試試這個。這應該在XSLT 1.0中起作用。調整ITEMS變量以改變每個表所需的列數。

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

    <xsl:output method="html" omit-xml-declaration="yes"/> 

    <xsl:variable name="ITEMS">3</xsl:variable> 

    <xsl:template match="//table"> 
     <!-- Loop through the items in the first row --> 
     <xsl:for-each select="tr[position() = 1]/td"> 
     <!-- Check if this item needs to be the start of a new row in a new table --> 
     <xsl:if test="position() mod $ITEMS = 1"> 
      <!-- Get the current position which is used to get items from subsequent rows --> 
      <xsl:variable name="COLUMNNUMBER" select="position()"/> 
      <table> 
       <!-- Loop through all the rows in the table --> 
       <xsl:for-each select="../../tr"> 
        <tr> 
        <!-- Output items within the required range using previously saved column number --> 
        <xsl:for-each select="td[position() &gt;= $COLUMNNUMBER and position() &lt; $COLUMNNUMBER + $ITEMS]"> 
         <xsl:copy-of select="."/> 
        </xsl:for-each> 
        </tr> 
       </xsl:for-each> 
      </table> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
0

這是我取它:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:variable name="split" select="3" /> 

    <xsl:template match="table"> 
    <xsl:variable name="self" select="." /> 
    <!-- select <td>1</td>, <td>4</td> --> 
    <xsl:for-each select="tr[1]/td[position() mod $split = 1]"> 
     <xsl:apply-templates select="$self" mode="split"> 
     <!-- calculate & pass the starting position for copying <td>s --> 
     <xsl:with-param name="start" select="$split * (position() - 1)" /> 
     </xsl:apply-templates> 
    </xsl:for-each> 
    </xsl:template> 

    <!-- this just copies the table an passes on $start --> 
    <xsl:template match="table" mode="split"> 
    <xsl:param name="start" select="0" /> 
    <xsl:copy> 
     <xsl:apply-templates select="tr" mode="split"> 
     <xsl:with-param name="start" select="$start" /> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <!-- this copies <tr>/<td> based on $start --> 
    <xsl:template match="tr" mode="split"> 
    <xsl:param name="start" select="0" /> 
    <xsl:copy> 
     <xsl:copy-of select="td[ 
     position() &gt; $start and position() &lt;= $start + $split 
     ]" /> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

結果:

<table> 
    <tr> 
    <td>1</td><td>2</td><td>3</td> 
    </tr> 
    <tr> 
    <td>A</td><td>B</td><td>C</td> 
    </tr> 
</table> 
<table> 
    <tr> 
    <td>4</td><td>5</td><td>6</td> 
    </tr> 
    <tr> 
    <td>D</td><td>E</td><td>F</td> 
    </tr> 
</table>