Xslt处理银行账户交易



我正在使用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 &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,则需要指定一个附加的排序条件。