【发布时间】:2012-10-30 22:55:12
【问题描述】:
假设我有一个简单的输入 XML 文档,例如:
<Amounts>
<item>
<Base>4750</Base>
<Tax1>2800</Tax1>
<Tax2>50</Tax2>
</item>
<item>
<Base>4750</Base>
<Tax1>2800</Tax1>
<Tax2>50</Tax2>
</item>
</Amounts>
XSLT 为:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output version="1.0" method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:element name="MyTax">
<xsl:variable name="bf" select="sum(//item/Base)"/>
<xsl:variable name="discount" select="$bf * 0.08"/>
<xsl:variable name="bf1" select="$bf - $discount"/>
<xsl:variable name="yq1" select="sum(//item/Tax1)"/>
<xsl:variable name="yr1" select="sum(//item/Tax2)"/>
<xsl:variable name="stax">
<xsl:value-of select="round(format-number((($bf1 + $yq1 + $yr1) * 0.0495),'#.##'))"/>
</xsl:variable>
<xsl:element name="Stax"><xsl:value-of select="$stax"/></xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我们得到一个输出 XML:
<MyTax>
<Stax>715</Stax>
</MyTax>
但是,现在我想为每个项目分别计算 stax,然后将这些项目相加 - 这是因为在上面的示例中,我最终会出现舍入错误,因为单个 stax 的总和实际上是 714 - 值我正在寻找,而不是上面的 715。
所以我正在寻找的输出是:
<MyTax>
<item>
<Stax>357</Stax>
</item>
<item>
<Stax>357</Stax>
</item>
<TotalStax>714</TotalStax>
</MyTax>
虽然我可以设置一个 for-each,但如何将 stax 计算为每次传递的变量,然后对单个 stax 求和?我受限于 XSLT 1.0,看到了一些使用键和节点集的答案,但无法理解如何应用它们。
【问题讨论】:
-
您的 XSLT 只对整个输入进行一次 stax 计算。它无法产生您显示的输出。
stax的计算值为 714.78,您已要求处理器对其进行舍入。这四舍五入为 715。为什么要输出 714? -
吉姆,我实际上需要产生 714 的总和 - 只能通过在每次运行中分别计算 stax (357) 并将所有单独的 stax 相加 - 给我 357+357 = 714如果我对单个项目的总和进行计算,则为 715。我无法为此所需的输出创建 XSLT...
标签: xslt sum accumulate