Xslt处理银行账户交易

时间:2016-04-07 07:49:08

标签: html xml xslt

我使用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>

我不能通过这段代码来做。 所以,你能帮我做那个吗?

1 个答案:

答案 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 &lt;= 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 &lt;= current()/VALUE_DATE_1]/AMOUNT)"/> 
                </td>
            </tr>
        </xsl:for-each>
    </table>
    </xsl:template>
</xsl:stylesheet>

请注意,这只适用于所有VALUE_DATE_1金额不同的情况。如果您有两个VALUE_DATE_1具有相同的值,则需要指定要对其进行排序的其他条件。