【问题标题】:Generate a table by column按列生成表
【发布时间】:2014-11-30 12:49:02
【问题描述】:

我将创建一个包含 10 列的表,以 5 组升序显示值,每组 50 个值,每组两个。

这是我的 XML:

<NTC_LIGHTLISTPRODUCT>
    <ITA_LIGHT_NUMBER>4555</ITA_LIGHT_NUMBER>
    <INTERNATIONAL_LIGHT_NUMBER>E2686.5</INTERNATIONAL_LIGHT_NUMBER>
</NTC_LIGHTLISTPRODUCT> 
<NTC_LIGHTLISTPRODUCT>
    <ITA_LIGHT_NUMBER>4556</ITA_LIGHT_NUMBER>
    <INTERNATIONAL_LIGHT_NUMBER>E2686.6</INTERNATIONAL_LIGHT_NUMBER>
</NTC_LIGHTLISTPRODUCT> 
<NTC_LIGHTLISTPRODUCT>
    <ITA_LIGHT_NUMBER>4557</ITA_LIGHT_NUMBER>
    <INTERNATIONAL_LIGHT_NUMBER>E2686.7</INTERNATIONAL_LIGHT_NUMBER>
</NTC_LIGHTLISTPRODUCT> 
<NTC_LIGHTLISTPRODUCT>
    <ITA_LIGHT_NUMBER>4558</ITA_LIGHT_NUMBER>
    <INTERNATIONAL_LIGHT_NUMBER>E2686.8</INTERNATIONAL_LIGHT_NUMBER>
</NTC_LIGHTLISTPRODUCT> 
<NTC_LIGHTLISTPRODUCT>
    <ITA_LIGHT_NUMBER>4559</ITA_LIGHT_NUMBER>
    <INTERNATIONAL_LIGHT_NUMBER>E2686.9</INTERNATIONAL_LIGHT_NUMBER>
</NTC_LIGHTLISTPRODUCT> 
<NTC_LIGHTLISTPRODUCT>
    <ITA_LIGHT_NUMBER>4560</ITA_LIGHT_NUMBER>
    <INTERNATIONAL_LIGHT_NUMBER>E2686.10</INTERNATIONAL_LIGHT_NUMBER>
</NTC_LIGHTLISTPRODUCT>

这些数据将按列创建一个特定的表。 这是输出:


国际 |意大利 |国际 |意大利 |国际 |意大利 |


E2686.5 |4555 | E2686.7 |4557 | E2686.9 |4559 |
E2686.6 |4556 | E2686.8 |4558 | E2686.10 |4560 |

直到页面结束,当页面结束时,从下一列开始。

使用这个 XSLT 我创建了它,但我无法到达页面末尾并继续到下一个表格列,我只在一个列中继续另一个页面。

这是我的 XSLT:

<body style="tab-interval:35.4pt">
    <div>
        <table  style="font-size:9pt; border-style:none; border-collapse:collapse; vertical-align:top; font-family:Univers Condensed;" border="1" cellspacing="0" cellpadding="0">
        <tr>
            <td> <p>Internazionale</p></td>
            <td> <p>Italiano</p></td>
        </tr>
        <xsl:for-each select="//INTERNATIONAL_LIGHT_NUMBER">
        <xsl:sort select="//INTERNATIONAL_LIGHT_NUMBER" data-type="number" order="ascending"/>
            <tr>
                <td>
                    <xsl:value-of select="."/>
                    <td>
                        <xsl:value-of select="preceding-sibling::ITA_LIGHT_NUMBER"/>
                    </td>
                </td>
            </tr>   
        </xsl:for-each>
        </table>
    </div>
</body>

【问题讨论】:

  • @martin_honnen 谢谢
  • "到达页面末尾" 什么页面?您似乎正在生成 HTML。 HTML 页面没有“结束”。

标签: xslt xslt-1.0


【解决方案1】:

我不确定我是否误解了这个问题,但是使用您当前的模板,您在第一个 xsl:for-each 循环中编写第二个 &lt;td&gt; &lt;td&gt;,我猜您不想要并且是无效标记。改成

<xsl:for-each select="//INTERNATIONAL_LIGHT_NUMBER">
<xsl:sort select="." data-type="number" order="ascending"/>
   <tr>
      <td>
          <xsl:value-of select="."/>
      </td>
      <td>
          <xsl:value-of select="preceding-sibling::ITA_LIGHT_NUMBER"/>
      </td>
   </tr>
</xsl:for-each>

生成两列。

更新:对于打印 10 列表的要求,以打印在前两列中升序的前 50 个值,然后在第 3 列和第 4 列中处理从 50 到 100 的值等。 - 一个如何实现 12 个值的示例(为了便于阅读)。
对于示例输入,我刚刚向示例 XML 添加了 4 个产品项。关注 XSLT

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" doctype-public="XSLT-compat"
omit-xml-declaration="yes" encoding="UTF-8" indent="no" />
<xsl:strip-space elements="*"/>
<xsl:template match="/">
   <div>
      <table style="font-size:9pt; border-style:none; border-collapse:collapse;
       vertical-align:top; font-family:Univers Condensed;" border="1" 
       cellspacing="0" cellpadding="0">
        <tr>
          <td> <p>Internazionale</p>
          </td>
          <td> <p>Italiano</p>
          </td>
          <td> <p>Internazionale</p>
          </td>
          <td> <p>Italiano</p>
          </td>
          <td> <p>Internazionale</p>
          </td>
          <td> <p>Italiano</p>
          </td>
          <td> <p>Internazionale</p>
          </td>
          <td> <p>Italiano</p>
          </td>
          <td> <p>Internazionale</p>
          </td>
          <td> <p>Italiano</p>
          </td>
        </tr>
        <xsl:for-each select="//INTERNATIONAL_LIGHT_NUMBER ">
        <xsl:sort select="." data-type="number" order="ascending"/>
        <xsl:variable name="pos" select="position()"/>
          <xsl:if test="not(position() >2)">
            <tr>
              <td>
                <xsl:value-of select="."/>
              </td>
              <td>
                <xsl:value-of select="preceding-sibling::ITA_LIGHT_NUMBER"/>
              </td>
              <xsl:for-each select="//INTERNATIONAL_LIGHT_NUMBER ">
              <xsl:sort select="." data-type="number" order="ascending"/>
                <xsl:if test="position()=$pos+2">
                  <td>
                    <xsl:value-of select="."/>
                  </td>
                  <td>
                    <xsl:value-of select="preceding-sibling::ITA_LIGHT_NUMBER"/>
                  </td>
                </xsl:if>
              </xsl:for-each>
              <xsl:for-each select="//INTERNATIONAL_LIGHT_NUMBER ">
              <xsl:sort select="." data-type="number" order="ascending"/>
                <xsl:if test="position()=$pos+4">
                  <td>
                    <xsl:value-of select="."/>
                  </td>
                  <td>
                    <xsl:value-of select="preceding-sibling::ITA_LIGHT_NUMBER"/>
                  </td>
                </xsl:if>
              </xsl:for-each>
              <xsl:for-each select="//INTERNATIONAL_LIGHT_NUMBER ">
              <xsl:sort select="." data-type="number" order="ascending"/>
                <xsl:if test="position()=$pos+6">
                  <td>
                    <xsl:value-of select="."/>
                  </td>
                  <td>
                    <xsl:value-of select="preceding-sibling::ITA_LIGHT_NUMBER"/>
                  </td>
                </xsl:if>
              </xsl:for-each>
              <xsl:for-each select="//INTERNATIONAL_LIGHT_NUMBER ">
              <xsl:sort select="." data-type="number" order="ascending"/>
                <xsl:if test="position()=$pos+8">
                  <td>
                    <xsl:value-of select="."/>
                  </td>
                  <td>
                    <xsl:value-of select="preceding-sibling::ITA_LIGHT_NUMBER"/>
                  </td>
                </xsl:if>
              </xsl:for-each>
            </tr>
          </xsl:if>
        </xsl:for-each>
      </table>
    </div>
  </xsl:template>
</xsl:stylesheet>

结果 HTML:

<div>
 <table style="font-size:9pt; border-style:none; border-collapse:collapse;
  vertical-align:top; font-family:Univers Condensed;" border="1" 
  cellspacing="0" cellpadding="0">
    <tr>
     <td>
        <p>Internazionale</p>
     </td>
     <td>
        <p>Italiano</p>
     </td>
     <td>
        <p>Internazionale</p>
     </td>
     <td>
        <p>Italiano</p>
     </td>
     <td>
        <p>Internazionale</p>
     </td>
     <td>
        <p>Italiano</p>
     </td>
     <td>
        <p>Internazionale</p>
     </td>
     <td>
        <p>Italiano</p>
     </td>
     <td>
        <p>Internazionale</p>
     </td>
     <td>
        <p>Italiano</p>
     </td>
    </tr>
    <tr>
     <td>E2686.5</td>
     <td>4555</td>
     <td>E2686.7</td>
     <td>4557</td>
     <td>E2686.9</td>
     <td>4559</td>
     <td>E2686.11</td>
     <td>4561</td>
     <td>E2686.13</td>
     <td>4563</td>
    </tr>
    <tr>
     <td>E2686.6</td>
     <td>4556</td>
     <td>E2686.8</td>
     <td>4558</td>
     <td>E2686.10</td>
     <td>4560</td>
     <td>E2686.12</td>
     <td>4562</td>
     <td>E2686.14</td>
     <td>4564</td>
    </tr>
  </table>
</div> 

要处理 50 个值的组,您只需调整列组的值,初始 &lt;xsl:for-each&gt; - 必须将 &lt;xsl:if test="not(position() &gt;2)"&gt; 调整为 &lt;xsl:if test="not(position() &gt;50)"&gt;。对于接下来的 50 个值,&lt;xsl:if test="position()=$pos+2"&gt; 必须调整为 &lt;xsl:if test="position()=$pos+50"&gt;,依此类推。

【讨论】:

  • 这是正确的,我不希望所有内容都放在一个长列上,我想先做 50 个,然后在下一列继续。
  • @francesco_irrera 最好添加这些要求 - 一个有 10 列的表,在每个 &lt;tr&gt; 中显示两个 &lt;td&gt; 的 50 个值的 5 组升序值 - 作为对您的更新问题而不是编辑答案,以便更容易理解您的问题。否则,想要为您的问题提供建议的人也必须阅读答案和 cmets 才能理解要求。
  • @francesco_irrera 我刚刚更新了我的答案,例如如何在 10 列的表中以 50 个为一组打印值。
  • 我尝试了您的解决方案并且运行良好,但我正在学习改进与您的类似的个人解决方案。感谢您和所有成员社区。​​span>
猜你喜欢
  • 2018-11-27
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多