【问题标题】:XSL - Sum of computed amounts with comparisonXSL - 计算金额的总和与比较
【发布时间】:2016-09-21 12:10:33
【问题描述】:

我需要一些帮助来计算总和并增加一些比较复杂性以了解哪个元素应该是总和的一部分。

让我们采用以下 XML

<REF>
   <amount>3</amount>
   <rate>7</rate>
</REF>
<A>
   <amount>10</amount>
   <rate>4</rate>
</A>
<A>
   <amount>-21</amount>
   <rate>2</rate>
</A>
<B>
   <amount>8</amount>
   <rate>1</rate>
</B>
<C>
   <amount>7</amount>
   <rate>32</rate>
</C>

我想在 Total 元素中显示每个金额乘以每个相关比率的总和。 我想将我的总数分成两个元素:NegativeTotal 和 PositiveTotal。 PostiveTotal 将包含 ((amount * rate) 如果值大于 REF 对象的 (amount * rate)) NegativeTotal 将包含 ((amount * rate) 如果值小于 REF 对象的 (amount * rate) 的 SUM)

它应该给出以下输出

<Total>
    <PositiveTotal>
        264 <!-- 40 + 224 -->
    </PositiveTotal>
    <NegativeTotal>
        -34 <!-- -42 + 8 -->
    </NegativeTotal>
</Total>

如果可能,请告诉我 信息技术限制:XSLT 1.0

提前致谢

问候,

【问题讨论】:

    标签: sum comparison xslt-1.0


    【解决方案1】:

    我建议你这样做:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
    <xsl:template match="/root">
        <!-- first pass -->
        <xsl:variable name="summands-rtf">
            <xsl:for-each select="*">
                <value>
                    <xsl:value-of select="amount * rate" />
                </value>
            </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="summands" select="exsl:node-set($summands-rtf)/value" />
        <!-- get the threshold -->
        <xsl:variable name="threshold" select="REF/amount * REF/rate" />
        <!-- output -->
        <Total>
            <PositiveTotal>
                <xsl:value-of select="sum($summands[. > $threshold])" />
            </PositiveTotal>
            <NegativeTotal>
                <xsl:value-of select="sum($summands[. &lt; $threshold])" />
            </NegativeTotal>
        </Total>
    </xsl:template>
    
    </xsl:stylesheet>
    

    当应用于格式良好的 XML 输入(具有单个根元素)时:

    XML

    <root>
       <REF>
          <amount>3</amount>
          <rate>7</rate>
       </REF>
       <A>
          <amount>10</amount>
          <rate>4</rate>
       </A>
       <A>
          <amount>-21</amount>
          <rate>2</rate>
       </A>
       <B>
          <amount>8</amount>
          <rate>1</rate>
       </B>
       <C>
          <amount>7</amount>
          <rate>32</rate>
       </C>
    </root>
    

    结果将是:

    <?xml version="1.0" encoding="UTF-8"?>
    <Total>
       <PositiveTotal>264</PositiveTotal>
       <NegativeTotal>-34</NegativeTotal>
    </Total>
    

    请注意,REF 金额和费率的乘积不包括在两个总数中,因为它既不高于也不低于阈值。同样,如果任何其他产品恰好等于阈值。它也将被排除在外。

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多