Создание динамической HTML-таблицы с отдельными строками столбцов

Что мне нужно сделать, так это создать таблицу с переменным именем столбцов (назовем ее x). Проблема, с которой я сталкиваюсь, заключается в том, что любое из полей, которые могут превратиться в td, может быть «элементом одной строки», то есть иметь colspan, равный x. Проблема в том, что заставить строку начинаться и заканчиваться в соответствии с правилами форматирования, требуемыми XML, было сложно.

Вот как будут выглядеть данные:

<status>
    <section title="">
    <columns>3</columns>
    <fields>
        <field label="Label 1">test data 1</field>
        <field label="Label 2">test data 2</field>
        <field label="Label 3">test data 3</field>
        <field singleRow="true" label="Label 4">test data 4</field>
        <field label="Label 5">test data 5</field>
        <field label="Label 6">test data 6</field>
        <field label="Label 7">test data 7</field>
        <field label="Label 8">test data 8</field>
        <field label="Label 9">test data 9</field>
        <field singleRow="true" label="Label 10">test data 10</field>
        <field label="Label 11">test data 11</field>
        <field label="Label 12">test data 12</field>
        <field label="Label 13">test data 13</field>
        <field label="Label 14">test data 14</field>
     </fields>
  </section>

The output should be as following:

     <table>
        <tr>
            <td>Label 1</td>
            <td>test data 1</td>

            <td>Label 2</td>
            <td>test data 2</td>

            <td>Label 3</td>
            <td>test data 3</td>
        </tr>
        <tr>
            <td>Label 4</td>
            <td colspan='5'>test data 4</td>
        </tr>
        <tr>
            <td>Label 5</td>
            <td>test data 5</td>

            <td>Label 6</td>
            <td>test data 6</td>

            <td>Label 7</td>
            <td>test data 7</td>
        </tr>
        <tr>
            <td>Label 8</td>
            <td>test data 8</td>

            <td>Label 9</td>
            <td colspan='3'>test data 9</td>
        </tr>
        <tr>
            <td>Label 10</td>
            <td colspan='5'>test data 10</td>
        </tr>
        <tr>
            <td>Label 11</td>
            <td>test data 11</td>

            <td>Label 12</td>
            <td>test data 12</td>

            <td>Label 13</td>
            <td>test data 13</td>
        </tr>
        <tr>
            <td>Label 14</td>
            <td colspan='5'>test data 14</td>
        </tr>
    </table>

Есть ли способ сгруппировать элементы таким образом, чтобы иметь возможность создавать группу для каждой для вывода каждой строки? Я возился с group-by, но не нашел хорошего способа сделать это. Правило будет состоять в том, чтобы разделить на группы все узлы от текущей точки до тех пор, пока count = x (в приведенном выше примере это 3) или пока элемент не будет иметь атрибут singleRow.

Как вы думаете, какое элегантное решение этой проблемы?


person edlftt    schedule 15.08.2011    source источник


Ответы (1)


Хм, немного неправильно понял ваши требования, это почти делает то, что вы хотите... Мне нужно выйти сейчас, надеюсь, это немного поможет, постараюсь вернуться позже и исправить это :)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="field">
    <td><xsl:value-of select="@label" /></td>
    <td><xsl:value-of select="text()" /></td>
  </xsl:template>

  <xsl:template match="fields">
    <tbody>
      <xsl:for-each-group group-adjacent="exists(@singleRow)" select="*">
        <xsl:choose>
          <xsl:when test="current-grouping-key() = true()">
            <tr>
              <xsl:apply-templates select="current-group()" />
            </tr>
          </xsl:when>
          <xsl:otherwise>
            <xsl:for-each-group select="current-group()" group-adjacent="position() lt 4">
              <tr>
                <xsl:apply-templates select="current-group()" />
              </tr>
            </xsl:for-each-group>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each-group>
    </tbody>
  </xsl:template>

  <xsl:template match="section">
    <xsl:variable name="max" select="number(columns) + 1" />
    <xsl:variable name="colspan" select="columns" />
    <table>
      <caption><xsl:value-of select="@title" /></caption>
      <tbody>
        <xsl:for-each-group group-adjacent="exists(@singleRow)" select="fields/*">
          <xsl:choose>
            <xsl:when test="current-grouping-key() = true()">
              <tr colspan="{$colspan}">
                <xsl:apply-templates select="current-group()" />
              </tr>
            </xsl:when>
            <xsl:otherwise>
              <xsl:for-each-group select="current-group()" group-adjacent="position() lt $max">
                <tr>
                  <xsl:apply-templates select="current-group()" />
                </tr>
              </xsl:for-each-group>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each-group>
      </tbody>
    </table>
  </xsl:template>

</xsl:stylesheet>
person spiralx    schedule 30.10.2012