2011-11-02 155 views
2

我有以下內容的XML文件:如何在XPath中使用sum函數?

<Xavor> 
<Dev> 
    <Emp>1</Emp> 
    <Floor>1</Floor> 
    <Salary>1200.4</Salary> 
</Dev> 
<Dev> 
    <Emp>2</Emp> 
    <Salary>3100.8</Salary> 
</Dev> 
<Dev> 
    <Emp>3</Emp> 
    <Floor>1</Floor> 
</Dev> 

我要計算使用SUM函數前兩個員工的工資總和。我來到這個XPath:

sum(/Xavor/Dev[2]/Salary/text()) 

但是,這隻返回第二個工資值,即3100.8 !!! 當只有非浮點數在工資中時,此XPath工作正常。請幫助我。

+8

如果你認爲這個XPath在做你以前問的問題,那你就錯了。它明確地只選擇第二個Dev元素,而不是選擇前兩個元素。 –

+0

它工作正常,但只有非浮點數。 – Azeem

回答

8

試試這個:

sum(/Xavor/Dev[position() &lt;= 2]/Salary/text()) 
+0

你確實需要總結前兩個元素,或者所有具有「薪水」信息的元素? –

+0

如果您正在測試Altova XMLSpy中的XPath表達式,則不需要將標記更改爲字符引用。當然,如果你是用XSLT或Stylevision或其他方法來做這件事,那就很有必要。另外,員工是否總是按順序排列,還是需要用'Emp'元素排序?我試過這樣,成功:'sum(/ */Dev [Emp <= 2 and Salary]/Salary)' –

+0

G_H感謝您的詳細回覆。我很抱歉,我是XPath的初學者,所以目前這個新的XPath對我來說很難理解。它正在處理正確的輸出。謝謝:) – Azeem

4

除了正確的答案被@Rubens法里亞斯,如果你想已指定(數字)的薪水來總結所有Dev的工資,使用:

sum(/*/Dev/Salary[number(.) = number(.)]) 
+2

+1 - 我喜歡這種方法比我通常使用的'NaN'方法好得多。 ('sum(/ */Dev/Salary [string(number(。))!='NaN'])') –

+0

@dimitre:你能解釋一下嗎?數字(。)]起作用。我期望它,如果發現一個NaN也匹配。謝謝 –

+0

@dimitre:我想我明白了。 NaN = NaN永遠不會是真的,因此number(。)= number(。)在節點可轉換爲數字時起作用。確實如此。@LuisFilipe, –