XSLT排序还是分组?

时间:2011-03-07 22:55:25

标签: xslt

我有以下xml文件:

<DATABLOCK>
    <LINE>
        <DATA>010000</DATA>
        <DATA>User1@MSAD</DATA>
        <DATA>User2@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>-0</CREDIT>
    </LINE>
    <LINE>
        <DATA></DATA>
        <DATA>User1@MSAD</DATA>
        <DATA>User2@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>-0</CREDIT>
    </LINE>
    <LINE>
        <DATA>010002</DATA>
        <DATA>User3@MSAD</DATA>
        <DATA>User2@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>0</CREDIT>
    </LINE>
    <LINE>
        <DATA></DATA>
        <DATA>User3@MSAD</DATA>
        <DATA>User2@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>-0</CREDIT>
    </LINE>
    <LINE>
        <DATA></DATA>
        <DATA>User3@MSAD</DATA>
        <DATA>User2@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>0</CREDIT>
    </LINE>
    <LINE>
        <DATA>010003</DATA>
        <DATA>User4@MSAD</DATA>
        <DATA>User5@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>640,650</CREDIT>
    </LINE>
    <LINE>
        <DATA></DATA>
        <DATA>User4@MSAD</DATA>
        <DATA>User5@MSAD</DATA>
        <DEBIT>567,103</DEBIT>
        <CREDIT></CREDIT>
    </LINE>
    <LINE>
        <DATA></DATA>
        <DATA>User4@MSAD</DATA>
        <DATA>User5@MSAD</DATA>
        <DEBIT>73,547</DEBIT>
        <CREDIT></CREDIT>
    </LINE>
</DATABLOCK>

此文件是我无法轻易修改的输出,需要更长时间才能找出生成xml数据的编码,而不是创建修改后的显示格式。数据表示期刊报告,其中DATA节点中的值等于期刊编号,批准,过帐,借方金额,贷方金额。我已将标准报告XSL文件编辑为:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
    <h1>Posted Journals:</h1>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Journal</th>
        <th>Approved By</th>
        <th>Posted By</th>
      </tr>
      <xsl:for-each select="DATABLOCK/LINE">
      <tr>
                <xsl:for-each select="DATA">
                        <TD><xsl:value-of select="."/></TD>
                </xsl:for-each>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>

我的问题是忽略第一个DATA元素为空的后续LINE。我不需要借记或贷记,所以我想要的输出是这样的:

Journal Approved By Posted By
010000     User1@MSAD    User2@MSAD
010002      User3@MSAD   User2@MSAD
010003      User4@MSAD   User5@MSAD

我是XSLT的新手,并且在网上找到可能适用的点点滴滴,但不完全理解语法以及如何根据我的场景修改它。

2 个答案:

答案 0 :(得分:2)

如果它们已经分组和排序,那么看起来您可以只渲染具有第一个DATA元素值的行并跳过其余部分:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />

<xsl:template match="DATABLOCK">
  <html>
  <body>
    <h1>Posted Journals:</h1>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Journal</th>
        <th>Approved By</th>
        <th>Posted By</th>
      </tr>
      <xsl:apply-templates />
    </table>
  </body>
  </html>
  </xsl:template>

  <!--Do not render LINEs that do not have a value for the first DATA element-->
  <xsl:template match="LINE[not(normalize-space(DATA[1]))]"/>

  <!--Each LINE element will be renderd as a Row-->
  <xsl:template match="LINE">
    <tr><xsl:apply-templates select="DATA"/></tr>
  </xsl:template>

  <!--Each DATA element will be a column -->
  <xsl:template match="DATA">
    <td><xsl:value-of select="."/></td>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

只需将for-each条件更改为

即可
<xsl:for-each select="DATABLOCK/LINE[not(DATA[1]/text()='')]">

这限制了for-each只处理第一个DATA元素中具有非空文本节点的行。