2011-03-07 46 views
2

我有folllowing xml文件:XSLT排序或分组?

<DATABLOCK> 
    <LINE> 
     <DATA>010000</DATA> 
     <DATA>[email protected]</DATA> 
     <DATA>[email protected]</DATA> 
     <DEBIT></DEBIT> 
     <CREDIT>-0</CREDIT> 
    </LINE> 
    <LINE> 
     <DATA></DATA> 
     <DATA>[email protected]</DATA> 
     <DATA>[email protected]</DATA> 
     <DEBIT></DEBIT> 
     <CREDIT>-0</CREDIT> 
    </LINE> 
    <LINE> 
     <DATA>010002</DATA> 
     <DATA>[email protected]</DATA> 
     <DATA>[email protected]</DATA> 
     <DEBIT></DEBIT> 
     <CREDIT>0</CREDIT> 
    </LINE> 
    <LINE> 
     <DATA></DATA> 
     <DATA>[email protected]</DATA> 
     <DATA>[email protected]</DATA> 
     <DEBIT></DEBIT> 
     <CREDIT>-0</CREDIT> 
    </LINE> 
    <LINE> 
     <DATA></DATA> 
     <DATA>[email protected]</DATA> 
     <DATA>[email protected]</DATA> 
     <DEBIT></DEBIT> 
     <CREDIT>0</CREDIT> 
    </LINE> 
    <LINE> 
     <DATA>010003</DATA> 
     <DATA>[email protected]</DATA> 
     <DATA>[email protected]</DATA> 
     <DEBIT></DEBIT> 
     <CREDIT>640,650</CREDIT> 
    </LINE> 
    <LINE> 
     <DATA></DATA> 
     <DATA>[email protected]</DATA> 
     <DATA>[email protected]</DATA> 
     <DEBIT>567,103</DEBIT> 
     <CREDIT></CREDIT> 
    </LINE> 
    <LINE> 
     <DATA></DATA> 
     <DATA>[email protected]</DATA> 
     <DATA>[email protected]</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> 

我的问题是忽略了后续行的第一个数据元素为空。我不需要借记卡或信用卡,所以我期望的输出是这样的:

Journal Approved By Posted By 
010000  [email protected] [email protected] 
010002  [email protected] [email protected] 
010003  [email protected] [email protected] 

我完全新的XSLT和网上找到的点点滴滴,似乎像他们可能适用,但不完全理解的语法和如何为我的场景进行修改。

+0

+1写得问题 –

回答

1

的换各条件只要改变到

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

这限制了的for-each处理具有在第一数据元素是非空的文本节点仅行。

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

+1一个很好的答案。 –

+0

对于XSLT样式为+1。 – Flack

+0

+1正确的答案和模式匹配。 – 2011-03-08 18:33:30