我想要两个元素的产品的总和

时间:2013-02-08 07:08:52

标签: c# xml xpath

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

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

我已经创建了XMLDoucment和Load 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)。

1 个答案:

答案 0 :(得分:0)

当你在参考XSLT时询问它时,我already provided you an answer to this。如果没有自定义扩展,则无法使用单个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");