如何在使用xslt对元素求和期间处理空元素

时间:2010-08-25 07:00:54

标签: xml xslt

<LIST_R7P1_1>
 <R7P1_1> 
 <ORIG_EXP_PRE_CONV /> 
  <EXP_AFT_CONV >34<EXP_AFT_CONV />
  <GUARANTEE_AMOUNT /> 
  <CREDIT_DER /> 
 </R7P1_1>
</LIST_R7P1_1>


<total><xsl:value-of select="LIST_R7P1_1/R7P1_1/ORIG_EXP_PRE_CONV + LIST_R7P1_1/R7P1_1/EXP_AFT_CONV + LIST_R7P1_1/R7P1_1/GUARANTEE_AMOUNT + LIST_R7P1_1/R7P1_1/CREDIT_DER"/></total>

总的来说,由于<CREDIT_DER />, <ORIG_EXP_PRE_CONV />等空元素

,我得到的是空值

如何处理,以便我可以获得数值

请建议

2 个答案:

答案 0 :(得分:8)

这是一个小例子,其中@DevNull答案中的技巧无济于事:

<a>
 <b>5</b>
 <c>
  <d></d>
  <e>1</e>
  <f>2</f>
 </c>
</a>

我们想要/a/c/d + /a/c/f

为了保证我们得到总和,虽然其中一些可能是空的或不是数字,但请使用

sum((/a/c/d|/a/c/f)[number(.) = number(.)])

<强>解释

XPath表达式:(/a/c/d|/a/c/f)[number(.) = number(.)]

仅选择所有联合节点的值,其值为数字。因此,sum()函数仅提供数字参数,不会生成NaN

仅当number(.) = number(.)是数字时,表达式.才为真。

我们在这里使用number(somethingNon-Number)NaN

并且NaN不等于任何内容,即使是NaN

答案 1 :(得分:2)

<total><xsl:value-of select="sum(/LIST_R7P1_1/R7P1_1/*/text())"/></total>

您还需要修复XML(EXP_AFT_CONV结束标记):

<LIST_R7P1_1>
  <R7P1_1>
    <ORIG_EXP_PRE_CONV/>
    <EXP_AFT_CONV>34</EXP_AFT_CONV>
    <GUARANTEE_AMOUNT/>
    <CREDIT_DER/>
  </R7P1_1>
</LIST_R7P1_1>