=============================================== =========================
**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函数没有正常工作。它回归零。
答案 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>