2010-08-25 55 views
4
<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 />等空元素。如何在使用xslt執行元素總和期間處理空元素

如何處理這樣我就可以得到一個數值

請建議

回答

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> 
+0

這種技術不適用於當總和節點不是所有文本後代的某些元素。查看我的答案,找到適用於所有情況的解決方案。 – 2010-08-25 13:33:35

+0

@Dimitre:非常真實。我的回答是針對這個例子的。 – 2010-08-25 16:41:08

+0

這個答案是錯誤的。在這裏你選擇一個singleton節點集,然後'fn:sum'將這個節點與'fn:number'結合起來得到總和。但是操作系統明確性要求'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'。所以,除Dimitre之外的其他表達,將會是'sum(LIST_R7P1_1/R7P1_1/*/text())' – 2010-08-25 18:33:27

7

這裏是一個小例子,其中@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

+0

+1僅用於數字謂詞。 – 2010-08-25 13:51:58