XSLT HTML 将一行变成 3

XSLT to HTML turn one row into 3

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

我通过 XSLT 将其转换为 XML 和 运行 以生成 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">,但不知道如何将一列强制换行,我并没有走得太远。

我知道 SO 不是代码生成工具,但我翻遍了书籍和网络,找不到我要找的东西。任何帮助,即使只是朝着正确方向的推动,也将不胜感激。

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

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

I don't even care about the headers, we can remove them. What I need to do is put the COMP_TS element on a new row and put the CREATE_Reason element on a new row that spans across the ones above it.

如果您不关心 headers,也不关心分隔记录,请简单地尝试:

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>

应用于您的示例输入的(呈现的)结果