我使用xslt将xml输入数据格式化为html格式。 案例:我将开放余额值作为TRANSACTIONS节点和交易清单中的属性。 据说我打印html表如下 第一行是开放余额的价值 第二行是TRANSACTIONS中打开+ AMOUNT @第一个节点的值 第三行是TRANSACTIONS中的值@ second row + AMOUNT @ second节点。 等等休息行
<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>
我不能通过这段代码来做。 所以,你能帮我做那个吗?
答案 0 :(得分:1)
您可以在此处使用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
具有相同的值,则需要指定要对其进行排序的其他条件。