我有以下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的新手,并且在网上找到可能适用的点点滴滴,但不完全理解语法以及如何根据我的场景修改它。
答案 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元素中具有非空文本节点的行。