我正在使用xslt将xml输入数据格式化为html格式。案例:是我在TRANSACTIONS节点和交易列表中有期初余额值作为属性。假设我按如下方式打印html表
第一行是期初余额
第二行是TRANSACTIONS中第一个节点的opening+AMOUNT的值
第三行是TRANSACTIONS中的值@第二行+金额@第二个节点。其他行
<results>
<TRANSACTIONS opening-balance="100">
<TRANSACTION>
<TYPE>DEBIT</TYPE>
<AMOUNT>10</DR_CR_MARKER>
<VALUE_DATE_1>20150726</VALUE_DATE_1>
</TRANSACTION>
<TRANSACTION>
<TYPE>DEBIT</TYPE>
<AMOUNT>20</DR_CR_MARKER>
<VALUE_DATE_1>20150626</VALUE_DATE_1>
</TRANSACTION>
<TRANSACTION>
<TYPE>DEBIT</TYPE>
<AMOUNT>30</DR_CR_MARKER>
<VALUE_DATE_1>20150826</VALUE_DATE_1>
</TRANSACTION>
</TRANSACTIONS>
</results>
我处理这个的xslt是
<xsl:template match="results">
<xsl:param name="opening-balance">
<xsl:value-of select="TRANSACTIONS/@opening-balance"/>
</xsl:param>
<xsl:for-each select="TRANSACTIONS/TRANSACTION">
<xsl:sort select="VALUE_DATE_1"/>
<tr style="background-color: yellow">
<td>
<!-- i want to print total amount value here -->
<xsl:variable name="opening-balance" select="$opening-balance+amount" />
<xsl:value-of select="$opening-balance"/>
</td>
</tr>
</xsl:for-each>
按照这个代码我做不到。那么,你能帮我做吗?
您可以在此处使用sum
函数和preceding-sibling
轴来选择您希望对求和的所有以前的事务
<xsl:value-of select="$opening-balance + AMOUNT + sum(preceding-sibling::TRANSACTION/AMOUNT)"/>
但是,如果您正在对输出进行排序,则可以使用此表达式来选择值较低的所有节点
<xsl:value-of select="$opening-balance + sum(../TRANSACTION[VALUE_DATE_1 <= current()/VALUE_DATE_1]/AMOUNT)"/>
因此,这会将期初余额、当前交易的金额以及以前所有交易的总和相加。
试试这个XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="results">
<xsl:param name="opening-balance" select="TRANSACTIONS/@opening-balance"/>
<table>
<tr>
<td>
<xsl:value-of select="$opening-balance"/>
</td>
</tr>
<xsl:for-each select="TRANSACTIONS/TRANSACTION">
<xsl:sort select="VALUE_DATE_1"/>
<tr style="background-color: yellow">
<td>
<xsl:value-of select="$opening-balance + sum(../TRANSACTION[VALUE_DATE_1 <= current()/VALUE_DATE_1]/AMOUNT)"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
请注意,这只适用于所有VALUE_DATE_1
金额不同的情况。如果有两个值相同的VALUE_DATE_1
,则需要指定一个附加的排序条件。