【问题标题】:I want sum of product of two element [duplicate]我想要两个元素的乘积之和[重复]
【发布时间】:2013-02-08 07:08:52
【问题描述】:

我有 xml 。我使用以下 XPath 表达式:

sum(//Item[@type='sg_aml_rel'][(./sg_percentage * ./related_id/Item[@type='sg_aml2']/sg_cost)])

我创建了 XMLDoucment 对象并将 XML 加载到其中,然后创建了 XPathNavigator 对象并提供 xpth 来评估 XPathNavigator 的方法。 我的 XML 看起来像:

<AML>
   <Item>
       <sg_percentage>10</sg_percentage>
       <related_id>
          <Item>
           <sg_cost>100<sg_cost>
          </Item>
       <related_id>    
   </Item>
  <Item>
       <sg_percentage>20</sg_percentage>
       <related_id>
          <Item>
           <sg_cost>500<sg_cost>
          </Item>
       <related_id>    
   </Item>
<AML>

我想要 SUM(sg_percentage*sg_cost)。

【问题讨论】:

  • @DanielHaley:那个副本没有任何价值——它作为 NARQ 被关闭,并且有 7 个反对票。
  • @JonEgerton - 你是对的。我一定是粘贴了错误的 URL。该用户已发布此问题 4 次。

标签: c# xml xpath


【解决方案1】:

already provided you an answer to this 当您询问有关 XSLT 的问题时。如果没有自定义扩展,则无法使用单个 XPath 1.0 表达式来完成此操作。最好的办法是执行以下操作:

decimal sum = 0;
foreach (XPathNavigator item in document.CreateNavigator().Select("/AML/Item"))
{
    sum += Convert.ToDecimal(item.Evaluate("sg_percentage * related_id/Item/sg_cost"));
}

完成后,sum 应该具有您要查找的值。

将其泛化一点的一种方法是定义这样的方法:

public static decimal SumPaths(XmlNode source, string nodePath, string formula)
{
    decimal sum = 0;
    foreach (XPathNavigator item in source.CreateNavigator().Select(nodePath))
    {
        sum += Convert.ToDecimal(item.Evaluate(formula));
    }
    return sum;
}

然后你可以这样称呼它:

decimal sum = 
     SumPaths(document, "/AML/Item", "sg_percentage * related_id/Item/sg_cost");

【讨论】:

  • 这是可行的,但我想要通用方法,以便我可以放置任何 xpath,它会为我提供 xpath 的输出。如何编写这个通用代码。请提供一些建议。谢谢
  • 正如我已经说过的,这不能用单个 XPath 计算,除非您使用非标准 XPath 函数(这可能相当复杂)。我已经修改了我的答案,以提供一种通用方法来计算跨多个节点的某个公式的总和。
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2011-12-28
相关资源
最近更新 更多