2011-11-02 16 views
2

J'ai un fichier xml avec le contenu suivant:Comment utiliser la fonction sum dans XPath?

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

Je veux calculer la somme des salaires des deux premiers employés en utilisant la fonction de somme. Je suis venu à cette XPath:

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

Mais ce ne retourne deuxième valeur de salaire c.-à-3100.8 !!! Cette XPath fonctionnait bien quand il n'y avait que des nombres à virgule flottante dans les salaires. Sil te plait aide moi.

+8

Si vous pensez que XPath faisait ce que vous demandez avant, vous vous êtes trompé. Il sélectionne clairement le second élément Dev, plutôt que de sélectionner les deux premiers. –

+0

Il fonctionnait bien MAIS avec seulement des nombres de points non flottants. – Azeem

Répondre

8

Essayez ceci:

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

Vous devez additionner seulement les deux premiers éléments, ou tous les éléments avec l'information «Salaire»? –

+0

Si vous testez l'expression XPath dans Altova XMLSpy, vous n'avez pas besoin de modifier le balisage dans les références de caractères. Bien sûr, si vous le faites dans XSLT ou Stylevision ou autre, ce serait nécessaire. Aussi, les employés seront-ils toujours en ordre ou avez-vous besoin de commander par des éléments Emp? Je l'ai essayé comme ça, avec succès: 'sum (/ */Dev [Emp <= 2 et Salaire]/Salaire)' –

+0

G_H merci pour votre réponse détaillée. Je m'excuse que je suis débutant de XPath donc ce nouveau XPath est difficile à comprendre pour le moment. Cela fonctionne avec une sortie correcte. merci :) – Azeem

4

En plus de la bonne réponse par @Rubens Farias, si vous voulez résumer les salaires de tous les Dev qui ont des salaires (numériques) spécifié, utilisez:

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

+1 - J'aime cette approche beaucoup mieux que l'approche «NaN» que j'utilise habituellement. ('sum (/ */Dev/Salary [string (nombre (.))! = 'NaN'])') –

+0

@dimitre: Pourriez-vous m'expliquer (ou pointer une url) comment le [nombre (.) = nombre (.)] fonctionne. Je m'y attends, si on trouve un NaN qui correspond aussi. Merci –

+0

@dimitre: Je pense que je l'ai eu. NaN = NaN n'est jamais vrai et donc nombre (.) = Nombre (.) Fonctionne quand le noeud est convertible en nombre. –

Questions connexes