XSLT到HTML将一行变为3行

时间:2015-01-28 14:08:04

标签: xml xslt

我有一个SQL查询,可以生成包含7列和多行数据的结果。

我将其转换为XML并通过XSLT运行以生成HTML,一切正常。 XSLT输出如下所示:

                  Header info

第1行:1 | 2 | 3 | 4 | 5 | 6 | 7 |

第2行:1 | 2 | 3 | 4 | 5 | 6 | 7 |

但是现在一些列中的数据占用了大量空间,我现在需要在XSLT中堆叠列以产生如下结果:

1 | 2 | 3 |

4 | 5 | 6 |

7

我希望第4列在第1列和第7列下方跨越其上方的3列。

这是我的XML的简化版本:

<XML_Data>
  <Row>
    <EMP_ID>APf92C56</EMP_ID>
    <ID>129190950</ID>
    <KEY>H59460973</KEY>
    <COMP_TS>2015-01-26 11:31</COMP_TS>
    <CODE>500</CODE>
    <REASON>Text String</REASON>
    <CREATE_Reason>Very long text string</CREATE_Reason>
  </Row>
  <Row>
      <EMP_ID>APf92C56</EMP_ID>
      <ID>129190950</ID>
      <KEY>H59460973</KEY>
      <COMP_TS>2015-01-26 11:31</COMP_TS>
      <CODE>500</CODE>
      <REASON>Text String</REASON>
      <CREATE_Reason>Very long text string</CREATE_Reason>
  </Row>

</XML_Data>

这是我目前的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/ROOT">
        <table border="0" cellpadding="6">
          <tr>
            <td style="font-weight:bold;">EMP_ID</td>
            <td style="font-weight:bold;">ID</td>
            <td style="font-weight:bold;">KEY</td>
            <td style="font-weight:bold;">COMP_TS</td>
            <td style="font-weight:bold;">CODE</td>
            <td style="font-weight:bold;">REASON</td>
            <td style="font-weight:bold;">CREATE_Reason</td>
          </tr>

           <xsl:for-each select="XML_Data/Row">
            <tr>
              <xsl:for-each select="./*">
                <td>
                  <xsl:value-of select="." disable-output-escaping="yes" />
                </td>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
        </table>
  </xsl:template>
</xsl:stylesheet>

我读到了这个回复:XSL xsl:template match="/"并使用<xsl:template match="element">进行了游戏,但不知道如何强制列到新行,我没有走得太远。

我知道这不是代码生成工具,但我已经梳理了书籍和在线,无法找到我正在寻找的东西。任何帮助,即使只是朝着正确的方向发展,都会受到最大的赞赏。

2 个答案:

答案 0 :(得分:0)

  

我甚至不关心标题,我们可以删除它们。我需要的   要做的是将COMP_TS元素放在一个新行上并放入   新行上的CREATE_Reason元素跨越上面的那一行   它

如果您不关心标题,也不关心分离记录,请尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/XML_Data">
    <table border="1">
        <xsl:for-each select="Row">
            <tr>
                <td><xsl:value-of select="EMP_ID"/></td>
                <td><xsl:value-of select="ID"/></td>
                <td><xsl:value-of select="KEY"/></td>
            </tr>
            <tr>
                <td><xsl:value-of select="COMP_TS"/></td>
                <td><xsl:value-of select="CODE"/></td>
                <td><xsl:value-of select="REASON"/></td>
            </tr>
            <tr>
                <td colspan="3"><xsl:value-of select="CREATE_Reason"/></td>
            </tr>
        </xsl:for-each>
    </table>
</xsl:template>

</xsl:stylesheet>

应用于示例输入时的(渲染)结果

enter image description here

答案 1 :(得分:-1)

根据您的信息,基本解决方案可能是:

<table cellspacing="0" width="100%" cellpadding="0">
    <tr>
        <xsl:for-each select="//XML_Data/Row" >
            <td>
                <xsl:value-of select="current()/1"/>
            </td>
            <td>
                <xsl:value-of select="current()/2"/>
            </td>
            <td>
                <xsl:value-of select="current()/3"/>
            </td>
        </xsl:for-each>
    </tr>
    <tr>
        <xsl:for-each select="//XML_Data/Row" >
            <td>
                <xsl:value-of select="current()/4"/>
            </td>
            <td>
                <xsl:value-of select="current()/5"/>
            </td>
            <td>
                <xsl:value-of select="current()/6"/>
            </td>
        </xsl:for-each>
    </tr>
    <tr>
        <xsl:for-each select="//XML_Data/Row" >
            <td colspan="3">
                <xsl:value-of select="current()/7"/>
            </td>   
        </xsl:for-each>
    </tr>
</table>            
相关问题