如何使用XSLT 1.0计算重复元素的总和

时间:2017-02-23 09:15:00

标签: xml xslt

=============================================== =========================

**Input XML:** 
<Customers> 
<Customer>
    <Items> 
        <Item>
            <ItemId>5639</ItemId>
            <ProductName> Lawnmower </ProductName>
            <Quantity>1</Quantity>
            <USPrice>148.95</USPrice>
            <Comment>Confirm this is electric</Comment>
        </Item>
        <Item>
            <ItemId>6000</ItemId>
            <ProductName>Baby Monitor</ProductName>
            <Quantity>2</Quantity>
            <USPrice>39.98</USPrice>
            <Comment>Confirm this is electric</Comment>
        </Item>
    </Items>
</Customer>
<Customer>
    <Items>
        <Item>
            <ItemId>7000</ItemId>
            <ProductName> Cutter </ProductName>
            <Quantity>1</Quantity>
            <USPrice>15.95</USPrice>
            <Comment>Confirm this is electric</Comment>
        </Item>
        <Item>
            <ItemId>9000</ItemId>
            <ProductName> Laptop </ProductName>
            <Quantity>5</Quantity>
            <USPrice>2048.95</USPrice>
            <Comment>Confirm this is electric</Comment>
        </Item>
    </Items>
</Customer >

输出XML:

<Customers> 
    <Customer> 
        <TotalPurchase>sum(USPRice)</TotalPurchase> 
    </Customer> 
    <Customer> 
        <TotalPurchase>sum(USPrice)</TotalPurchase> 
    </Customer> 
</Customers>

XSLT代码:

<Customers> 
   <xsl:for-each select="Customers/Customer"> 
     <Customer> 
        <xsl:for-each select="Items/Item"> 
           <TotalPurchase> 
              <xsl:value-of select="sum(/USPrice)"/> 
           </TotalPurchase> 
        </xsl:for-each> 
     </Customer> 
   </xsl:for-each> 
</Customers>

有人可以指导我如何在XSLT 1.0中实现输出。由于sum函数没有正常工作。它回归零。

3 个答案:

答案 0 :(得分:1)

如果您想对每个USPrice的{​​{1}}值求和,而不先将它们乘以Customer(这对我来说似乎很奇怪),那么请执行以下操作:

Quantity

您的示例中的结果将是:

<xsl:template match="/Customers">
    <xsl:copy>
        <xsl:for-each select="Customer">
            <Customer> 
                <TotalPurchase> 
                    <xsl:value-of select="sum(Items/Item/USPrice)"/>
                </TotalPurchase>
            </Customer>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

答案 1 :(得分:0)

您的输入XML看起来无效 例如 - 如果您想要客户标签内的值或标签内的id元素

,您需要一个属性名称
e.g. <customer id=1> or <customer><id>1</id>

**更新** 您的xpath选择不正确 - 一旦您在Items / Item上完成了for-each,就不需要使用斜杠来引用子元素 所以你的代码应该是

<xsl:value-of select="sum(USPrice)"/>

然而,这不会解决您的问题。在for-each中,您一次只指向一个“item”节点,因此您一次只能获得一个USPrice的总和。

我相信

  <xsl:for-each select="Customers/Customer">
    <Customer>
            <TotalPurchase>
                <xsl:value-of select="sum(Items/Item/USPrice)"/>
            </TotalPurchase>
  </xsl:for-each>

应该有效

答案 2 :(得分:0)

让我们清楚你做错了什么,这样你就不会再犯同样的错误了。

        <xsl:for-each select="Items/Item"> 
           <TotalPurchase> 
              <xsl:value-of select="sum(/USPrice)"/> 
           </TotalPurchase> 
        </xsl:for-each>

你做错的第一件事就是USPrice之前的“/”。 “/”将您带到文档的根目录,这是您不想要的 - 您希望从Item元素的当前位置向下选择。所以放下“/".

但这并没有解决问题。 sum()函数添加一组数字,但从USPrice开始的Item仅选择一个数字。你在这里的错误是认为“我正在处理一系列事情因此我需要循环它们”。忘记那个低级程序思维中的一切,你在这里处理一个高级声明性语言。你想要的是:

       <TotalPurchase> 
          <xsl:value-of select="sum(Items/Item/USPrice)"/> 
       </TotalPurchase>