Динамическое создание HTML-таблицы со строками из одного столбца - PullRequest
1 голос
/ 15 августа 2011

Что мне нужно сделать, это создать таблицу с именем переменной столбцов (назовите ее х). Проблема, с которой я сталкиваюсь, заключается в том, что любое из полей, которые могут превратиться в 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>

Вывод должен быть следующим:

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

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

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

1 Ответ

0 голосов
/ 30 октября 2012

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

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