-1

私はxmlを持っています。次のXPath式を使用しています。

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

XMLDoucmentのオブジェクトを作成し、それにXMLをロードしてから、XPathNavigatorオブジェクトを作成し、XPathNavigatorのメソッドを評価するためのxpthを提供します。私の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)が必要です。

4

1 に答える 1

0

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探している値が得られるはずです。

これを少し一般化する 1 つの方法は、次のようなメソッドを定義することです。

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");
于 2013-02-08T07:21:40.150 に答える