XQuery - 无界结构中元素值的总和

时间:2017-09-02 04:37:03

标签: xquery

我试图从下面的结构中获取特定字段的值的总和,但看起来它不起作用,因为我得到的错误是预期的零或一个值,但得到两个或更多。

 <v4:CalculateResponse xmlns:v4="http://services.xx.net/mm/va">
       <v4:CalculateResponseSizeType>
          <v4:CalculateCCs>
             <v4:Container>
                <v4:GrossBookedWeight>31.6</v4:GrossBookedWeight>
                <v4:NetPredictedWeight>50</v4:NetPredictedWeight>
                <v4:GrossPredictedWeight>53.6</v4:GrossPredictedWeight>
                <v4:TypeOfWeightUsed>P</v4:TypeOfWeightUsed>
             </v4:Container>
             <v4:Container>
                <v4:GrossBookedWeight>31.6</v4:GrossBookedWeight>
                <v4:NetPredictedWeight>50</v4:NetPredictedWeight>
                <v4:GrossPredictedWeight>53.6</v4:GrossPredictedWeight>
                <v4:TypeOfWeightUsed>B</v4:TypeOfWeightUsed>
             </v4:Container>
             <v4:Container>
                <v4:GrossBookedWeight>31.6</v4:GrossBookedWeight>
                <v4:NetPredictedWeight>50</v4:NetPredictedWeight>
                <v4:GrossPredictedWeight>53.6</v4:GrossPredictedWeight>
                <v4:TypeOfWeightUsed>B</v4:TypeOfWeightUsed>
             </v4:Container>
             <v4:Container>
                <v4:GrossBookedWeight>31.6</v4:GrossBookedWeight>
                <v4:NetPredictedWeight>50</v4:NetPredictedWeight>
                <v4:GrossPredictedWeight>53.6</v4:GrossPredictedWeight>
                <v4:TypeOfWeightUsed>P</v4:TypeOfWeightUsed>
             </v4:Container>
      </v4:CalculateCCs>
   </v4:CalculateResponseSizeType>
   <v4:Status>P</v4:Status>
   <v4:StatusCode>1000</v4:StatusCode>
</v4:CalculateResponse>

我尝试使用下面的函数对这些值进行求和,但看起来只是在考虑一个值。

<Weight>
        {
        sum(
            data($calculateResponse1/*:CalculateResponseSizeType/*:CalculateCCs/*:Container[data(*:TypeOfWeightUsed) = "B"]/*:GrossBookedWeight), 
            data($calculateResponse1/*:CalculateResponseSizeType/*:CalculateCCs/*:Container[data(*:TypeOfWeightUsed) = "P"]/*:GrossPredictedWeight)
        )

    }
</Weight>

这里计算很简单,比如说TypeOfWeightUsed = 0然后我想使用GrossPredictedWeight元素值或者如果TypeOfWeightUsed = B那么我想使用GrossBookedWeight。

我们可以在一个结构中有多个容器。

请说明上述syntex有什么问题。

2 个答案:

答案 0 :(得分:1)

  

这里计算很简单,比如TypeOfWeightUsed = 0然后我想使用GrossPredictedWeight元素值,或者如果TypeOfWeightUsed = B那么我想使用GrossBookedWeight。

您可以在<Weight> { sum( for $c in $calculateResponse1/*:CalculateResponseSizeType/*:CalculateCCs/*:Container return if($c/*:TypeOfWeightUsed = "B") then $c/*:GrossBookedWeight else $c/*:GrossPredictedWeight ) } </Weight> 构造的帮助下使用FLOWR表达式来获取执行<Weight>170.4</Weight> 所需的所有数字:

{{1}}

<强> demo

输出

{{1}}

答案 1 :(得分:1)

当sum()函数有两个参数时,第二个参数提供一个值,当第一个参数是空序列时,该值将用作结果。 (这是一种笨拙的方式来处理这样一个事实,即没有静态类型检查,sum()函数无法区分空序列的双精度数和空的持续时间序列,并且你真的不想要一个整数为零的结果当你总结持续时间时)。

您已使用两个参数调用该函数,但我认为您希望将两个序列视为要求和的输入。只需添加另一对括号,使其成为一个参数:将sum(x, y)替换为sum((x, y))

您收到错误的原因是第二个参数(如果提供)必须是单个值,而不是序列。