'loop to create N equal payments in XSLT
I am pretty new in this language and need help by creating a loop in xslt. I have an XML with info below:
<Number_of_Payments>12</Number_of_Payments>
<First_Payment_Date>28-10-2020</First_Payment_Date>
<Monthly_Payment>760,00</Monthly_Payment>
And I need to transform this to a recurrent monthly payment (12 payments of 760). So far I have the first payment in xslt:
<paymentplan>
<loanpaymentplantype>Flat</loanpaymentplantype>
<intervaltype>StartOfMonth</intervaltype>
<interval>1</interval>
<startdate>
<xsl:call-template name="formatdate">
<xsl:with-param name="DateTimeStr" select="Account/First_Payment_Date"/>
</xsl:call-template>
</startdate>
<maturitydate>
<xsl:call-template name="formatdate">
<xsl:with-param name="DateTimeStr" select="Account/Last_Payment_Date"/>
</xsl:call-template>
</maturitydate>
<numpayments>
<xsl:value-of select="Account/Number_of_Payments"/>
</numpayments>
<payments>
<payment>
<paymentdate>
<xsl:call-template name="formatdate">
<xsl:with-param name="DateTimeStr" select="Account/First_Payment_Date"/>
</xsl:call-template>
<!--<xsl:value-of select="concat(substring(First_Payment_Date, 7, 4),'-',substring(First_Payment_Date, 4, 2),'-',substring(First_Payment_Date, 1, 2))"/>-->
</paymentdate>
<amount>
<xsl:value-of select="translate(Account/Monthly_Payment, ',', '.')"/>
</amount>
<principalamount>
<xsl:value-of select="translate(Account/Monthly_Payment, ',', '.')"/>
</principalamount>
<fixedinterest>0</fixedinterest>
</payment>
</payments>
This is the Output that I get:
<paymentplan>
<loanpaymentplantype>Flat</loanpaymentplantype>
<intervaltype>StartOfMonth</intervaltype>
<interval>1</interval>
<startdate>2020-11-01</startdate>
<maturitydate>2021-10-01</maturitydate>
<numpayments>12</numpayments>
<payments>
<payment>
<paymentdate>2020-11-01</paymentdate>
<amount>760.00</amount>
<principalamount>760.00</principalamount>
<fixedinterest>0</fixedinterest>
</payment>
</payments>
</paymentplan>
What I would need is 12 payments on the paymentplan:
<payment>
<paymentdate>2020-11-01</paymentdate>
<amount>760.00</amount>
<principalamount>760.00</principalamount>
<fixedinterest>0</fixedinterest>
</payment>
<payment>
<paymentdate>2020-12-01</paymentdate>
<amount>760.00</amount>
<principalamount>760.00</principalamount>
<fixedinterest>0</fixedinterest>
</payment>
<payment>
<paymentdate>2021-01-01</paymentdate>
<amount>760.00</amount>
<principalamount>760.00</principalamount>
<fixedinterest>0</fixedinterest>
</payment>
<payment>
<paymentdate>2021-02-01</paymentdate>
<amount>760.00</amount>
<principalamount>760.00</principalamount>
<fixedinterest>0</fixedinterest>
</payment>
<payment>
<paymentdate>2021-03-01</paymentdate>
<amount>760.00</amount>
<principalamount>760.00</principalamount>
<fixedinterest>0</fixedinterest>
</payment>
<payment>
<paymentdate>2021-04-01</paymentdate>
<amount>760.00</amount>
<principalamount>760.00</principalamount>
<fixedinterest>0</fixedinterest>
</payment>
And so on...
Solution 1:[1]
Here is something you could use as your starting point:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<payments>
<xsl:call-template name="generate-payments">
<xsl:with-param name="start-year" select="2020"/>
<xsl:with-param name="start-month" select="11"/>
<xsl:with-param name="number-of-payments" select="12"/>
<xsl:with-param name="amount" select="760"/>
</xsl:call-template>
</payments>
</xsl:template>
<xsl:template name="generate-payments">
<xsl:param name="start-year"/>
<xsl:param name="start-month"/>
<xsl:param name="number-of-payments"/>
<xsl:param name="amount"/>
<xsl:if test="$number-of-payments > 0">
<payment>
<paymentdate>
<xsl:value-of select="$start-year"/>
<xsl:value-of select="format-number($start-month, '-00')"/>
<xsl:text>-01</xsl:text>
</paymentdate>
<amount>
<xsl:value-of select="format-number($amount, '#,##0.00')"/>
</amount>
</payment>
<!-- recursive call -->
<xsl:variable name="m" select="12*$start-year + $start-month" />
<xsl:call-template name="generate-payments">
<xsl:with-param name="start-year" select="floor($m div 12)"/>
<xsl:with-param name="start-month" select="$m mod 12 + 1"/>
<xsl:with-param name="number-of-payments" select="$number-of-payments - 1"/>
<xsl:with-param name="amount" select="$amount"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Result
<?xml version="1.0" encoding="UTF-8"?>
<payments>
<payment>
<paymentdate>2020-11-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2020-12-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2021-01-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2021-02-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2021-03-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2021-04-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2021-05-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2021-06-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2021-07-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2021-08-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2021-09-01</paymentdate>
<amount>760.00</amount>
</payment>
<payment>
<paymentdate>2021-10-01</paymentdate>
<amount>760.00</amount>
</payment>
</payments>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | michael.hor257k |
