Как разделить таблицу по вертикали на две таблицы в XSL? - PullRequest
3 голосов
/ 21 декабря 2009

Если у меня есть следующая таблица:

<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 / N, где TD является ячейкой данных таблицы. Например, если есть 12 столбцов и 25 строк, я бы хотел 4 таблицы, каждая с 3 столбцами и 25 строками.

Ответы [ 2 ]

1 голос
/ 21 декабря 2009

Попробуй это. Это должно работать в 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 голосов
/ 21 декабря 2009

Вот мое мнение:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...