包含'$'字符XSLT 1.0的Sum节点

时间:2015-04-30 07:41:49

标签: xml xslt

我正在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循环吗? 最好的方法是什么?

1 个答案:

答案 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元素上执行的任何其他处理冲突。