2011-11-02 67 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, –