【问题标题】:XSLT 2.0 - Sum Element Names that IncrementXSLT 2.0 - 对递增的元素名称求和
【发布时间】:2015-12-07 17:07:54
【问题描述】:

我正在生成一个元素名称的总和,当它们存在时会递增。

XML 示例:

<Distributions>
<DIST_DISTRIBUTIONMETHOD_1>Check to Other</DIST_DISTRIBUTIONMETHOD_1>
<DIST_CREDITOR_1>MOTORS FINANCE</DIST_CREDITOR_1>
<DIST_AMOUNT_1>16710.04</DIST_AMOUNT_1>
<DIST_NET_1>No</DIST_NET_1>
<DIST_DISTRIBUTIONMETHOD_2>Check to Other</DIST_DISTRIBUTIONMETHOD_2>
<DIST_CREDITOR_2>WILLIAM HOOK</DIST_CREDITOR_2>
<DIST_AMOUNT_2>1239.86</DIST_AMOUNT_2>
<DIST_NET_2>Yes</DIST_NET_2>
</Distributions>

我需要对 DIST_AMOUNT_1、2 等进行求和,总共可能有 15 个,可能存在也可能不存在。

到目前为止,在检查每个 DIST_AMOUNT 是否存在后,我已将其分配给一个变量。总和本身就是我遇到问题的地方,因为总和没有任何填充物,我不知道为什么,我已经为此绞尽脑汁,并在谷歌上搜索了几天的答案。任何帮助表示赞赏。

到目前为止我的 XSL 代码:

<xsl:variable name="DIST_TMP_1">
            <xsl:choose>
                <xsl:when test="//DIST_AMOUNT_1">
                    <xsl:value-of select="number(//DIST_AMOUNT_1)"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="number(0.00)"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:variable name="DIST_TMP_2">
            <xsl:choose>
                <xsl:when test="//DIST_AMOUNT_2">
                    <xsl:value-of select="number(//DIST_AMOUNT_2)"/>
                </xsl:when>                 
                <xsl:otherwise>
                    <xsl:value-of select="number(0.00)"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable> 
        <xsl:variable name="DIST_TMP_3">
            <xsl:choose>
                <xsl:when test="//DIST_AMOUNT_3">
                    <xsl:value-of select="number(//DIST_AMOUNT_3)"/>
                </xsl:when>                 
                <xsl:otherwise>
                    <xsl:value-of select="number(0.00)"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:element name="ECD070_TOTAL_VAR">
            <xsl:value-of select="sum($DIST_TMP_1+$DIST_TMP_2+DIST_TMP_3)"/>
        </xsl:element>

【问题讨论】:

  • Aggregate-function for sum and product in XPath 的可能重复项。最佳答案有一个 XSLT 1.0 部分;您可以省略“产品”部分,因为您只需要总和。
  • 我不认为它是重复的,因为示例只使用了“价值”。不是 value_1、value_2 等。这些元素的名称不同,因此代码无法解决此问题。
  • 您需要做的就是更改表达式以匹配标签。

标签: xml xslt xslt-2.0


【解决方案1】:

你为什么不能简单地做:

<xsl:value-of select="sum(/Distributions/*[starts-with(name(), 'DIST_AMOUNT_')])" />

或者,如果您必须明确说明,请执行以下操作:

<xsl:value-of select="sum((DIST_AMOUNT_1, DIST_AMOUNT_2, DIST_AMOUNT_3, ... DIST_AMOUNT_15))" />

(这是来自Distributions 的上下文)。无需测试每一个是否存在:不存在的节点将被简单地忽略。

【讨论】:

  • 使用第一个选项它提供 '0' 作为总和,它应该是 17949.90。它现在至少给出了一些输出,所以谢谢你!
  • 显式选项给出了一个语法错误,当我以前使用它们时它不喜欢逗号,这就是我使用加号的原因。
  • @DanaWilliams 这两个建议都使用 XSLT 2.0 处理器进行了测试(第一个实际上也应该在 XSLT 1.0 中工作)。您使用的是哪个处理器? --- 附:在 sum() 中使用加号肯定会失败。
  • 啊哈,Distrubtions 需要大写,Michael 你太喜欢这个解决方案了!几天来,我一直在无脑地殴打自己,而您却在一条线上! :)
  • 哦,是的,XML 区分大小写。这让许多毫无戒心的人绊倒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2017-08-26
  • 2011-05-17
  • 1970-01-01
  • 2020-06-25
  • 2012-09-10
相关资源
最近更新 更多