我正在xslt 1.0中编写样式表并具有以下xml数据:
<PurchasePrice>$100.00</PurchasePrice>
<Deposit>$560.00</Deposit>
<ChequeLine>
<ChequeType>Bank</ChequeType>
<ChequeAmount>$465.00</ChequeAmount>
</ChequeLine>
<ChequeLine>
<ChequeType>Trust</ChequeType>
<ChequePayee>Department of the Environment</ChequePayee>
<ChequeAmount>$456.00</ChequeAmount>
</ChequeLine>
<ChequeLine>
<ChequeType>Credit Union</ChequeType>
<ChequePayee>Some Bank</ChequePayee>
<ChequeAmount>$9,999,999.00</ChequeAmount>
</ChequeLine>
我需要计算所有 ChequeAmount , PurchasePrice 和存款的总和。 我假设我必须使用translate()来删除'$'以及可能 number()以将其从字符串转换。
预期值为: 10001580
这里的做法是什么?据我所知,我们只能在XSLT中设置一次变量,所以我需要创建一些计数器函数吗?
我应该在 ChequeLines 上执行for-each循环吗? 最好的方法是什么?
答案 0 :(得分:0)
要在XSLT 1.0中执行此操作,您必须使用尾递归机制一次处理一个ChequeLine
,将运行总计从一个传递到下一个,例如。
<xsl:template match="ChequeLine" mode="sum">
<xsl:param name="sum" select="0"/>
<xsl:apply-templates select="following-sibling::ChequeLine[1]" mode="sum">
<xsl:with-param name="sum" select="$sum + translate(ChequeAmount, '$,', '')"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="ChequeLine[last()]" mode="sum">
<xsl:param name="sum" select="0"/>
<xsl:value-of select="$sum + translate(ChequeAmount, '$,', '')"/>
</xsl:template>
要开始此过程,您需要
<xsl:apply-templates select="ChequeLine[1]" mode="sum">
<xsl:with-param name="sum" select="translate(Deposit, '$,', '') + translate(PurchasePrice, '$,', '')"/>
</xsl:apply-templates>
我使用了mode="sum"
,因此这些模板不会与您在ChequeLine
元素上执行的任何其他处理冲突。