Subject: Re: RE: Is xsl:for-each "syntactic sugar"?
From: Liam R E Quin <liam@xxxxxx>
Date: Fri, 07 May 2010 19:08:54 -0400
|
On Fri, 2010-05-07 at 18:34 -0400, Costello, Roger L. wrote:
> Hi Folks,
>
> Suppose that I want to write an XSLT transform that outputs a bank account balance after each debit/credit transaction. Here's an XML document that has the start balance followed by each transaction:
>
> <?xml version="1.0"?>
> <BankTransactions>
> <StartBalance>100.00</StartBalance>
> <Transaction>-5.00</Transaction>
> <Transaction>-2.50</Transaction>
> <Transaction>10.00</Transaction>
> <Transaction>-7.50</Transaction>
> </BankTransactions>
>
> The output should be:
>
> 95 92.5 102.5 95
>
> I do not believe that this task can be accomplished using xsl:for-each. Do you agree?
No. Wait. Yes, I agree hat you believe that. But I don't agree it's
true :-)
First, here's a non-recursive solution with apply-templates:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="BankTransactions">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="StartBalance"></xsl:template>
<xsl:template match="Transaction">
<xsl:value-of select="preceding-sibling::StartBalance +
sum(preceding-sibling::Transaction) + ." />
<xsl:if test="following-sibling::Transaction">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Now here's one with for-each
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="BankTransactions">
<xsl:for-each select="Transaction">
<xsl:value-of select="preceding-sibling::StartBalance +
sum(preceding-sibling::Transaction) + ." />
<xsl:if test="following-sibling::Transaction">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Liam
--
Liam Quin - XML Activity Lead, W3C, http://www.w3.org/People/Quin/
Pictures from old books: http://fromoldbooks.org/
Ankh: irc.sorcery.net irc.gnome.org www.advogato.org
|