Разделите большой стол на несколько небольших столов - PullRequest
5 голосов
/ 18 сентября 2010

У меня проблема, когда в таблице сотни строк.Это вызывает проблему и требует разделения на несколько небольших таблиц с меньшим количеством строк в каждой.

Мой html также является допустимым xml.

Как разделить таблицу каждые x строк на новуюtable?

И как мне скопировать стиль таблицы и первую строку (заголовок) в каждую последующую таблицу.1012 *

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

3 голосов
/ 18 сентября 2010

Это классическое решение XSLT 1.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>
1 голос
/ 18 сентября 2010

Вот решение XSLT2, использующее для каждой группы. Чтобы изменить количество элементов в таблице, измените делитель в атрибуте, смежном с группой. Протестировано в Oxygen / XML с 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>

Пояснение:

  1. В шаблоне "table" создайте переменную для самого узла таблицы, чтобы мы могли позже скопировать его атрибуты, и переменную, содержащую первую строку, которая будет использоваться в качестве заголовка.
  2. Используйте for-each-group для выбора смежных наборов, в которых результат "position () - 1 idiv 3" дает тот же результат. Для первых трех строк это возвращает 0; для следующих трех - 1 и т. д. Делитель управляет количеством строк, сгруппированных в каждом наборе.
  3. Для каждого набора создайте элемент таблицы, затем скопируйте все атрибуты исходной таблицы, затем строку заголовка, а затем используйте шаблон идентификации (в конце таблицы стилей), чтобы скопировать все строки.

Обратите внимание, что если бы у вас были вложенные таблицы внутри строк, вам бы пришлось немного изменить это, чтобы шаблон "таблицы" не совпадал с внутренними таблицами.

0 голосов
/ 18 сентября 2010

Эта таблица стилей 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>

Редактировать : компактный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...