2010-09-17 71 views
5

Tôi gặp sự cố khi bảng có 100 hàng. Nó gây ra một vấn đề và cần phải được chia thành nhiều bảng nhỏ hơn với ít hàng hơn.Chia bảng lớn thành nhiều bảng nhỏ hơn

html của tôi cũng là xml hợp lệ.

Làm cách nào để phân chia bảng mỗi x hàng thành một bảng mới?

Và, làm cách nào tôi có thể sao chép kiểu bảng và hàng đầu tiên (tiêu đề) vào mỗi bảng tiếp theo.

Vì vậy, một cái gì đó như thế này

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

trở thành

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

Tốt câu hỏi (1). Xem câu trả lời của tôi cho giải pháp XSLT 1.0 cổ điển cho các vấn đề như vậy. :) –

Trả lời

3

Đây là cổ điển XSLT 1.0 giải pháp cho loại đó của vấn đề:

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

Dưới đây là một giải pháp XSLT2 sử dụng for-each nhóm. Để thay đổi số lượng mục trên mỗi bảng, hãy thay đổi số chia trong thuộc tính liền kề nhóm. Thử nghiệm trong Oxygen/XML với Saxon 9.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> 

Giải thích:

  1. Trong "bảng" mẫu tạo một biến cho nút bảng riêng của mình, vì vậy chúng tôi có thể sao chép các thuộc tính của nó sau đó, và một biến chứa hàng đầu tiên được tái sử dụng như tiêu đề.
  2. Sử dụng cho từng nhóm để chọn các bộ liền kề trong đó kết quả của "position() - 1 idiv 3" cho cùng một kết quả. Đối với ba hàng đầu tiên, giá trị này trả về 0; cho ba tiếp theo, kết quả là 1, v.v. Số chia sẽ kiểm soát số lượng hàng được nhóm thành từng bộ.
  3. Đối với mỗi bộ, tạo thành phần bảng, sau đó sao chép tất cả thuộc tính của bảng gốc, sau đó là hàng tiêu đề, sau đó sử dụng mẫu nhận dạng (ở cuối biểu định kiểu) để sao chép tất cả các hàng.

Lưu ý rằng nếu bạn có bảng lồng nhau bên trong các hàng, bạn phải sửa đổi điều này một chút để tránh việc mẫu "bảng" khớp với bảng bên trong.

+0

+1 Giải pháp XSLT 2.0 tốt. –

0

này XSLT 1.0 stylesheet:

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

Output:

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

Sửa: Mã nhỏ gọn.

Các vấn đề liên quan