Вот небольшой пример, где трюк в ответе @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(.)
имеет значение true, только когда .
является числом.
Здесь мы используем, что number(somethingNon-Number)
равно NaN
и что NaN
не равно ничему, даже NaN
.