У меня есть такой XML-фрагмент

<lines>
    <item><code>1.1</code><amt>1000.00</amt></item>
    <item><code>1.3.1</code><amt>2000.00</amt></item>
    <item><code>1.3.2</code><amt>3000.00</amt></item>
    <item><code>2.1</code><amt>4000.00</amt></item>
    ...
</lines>

Я хочу получить сумму всех узлов 1 *. Полный список известен, поэтому я могу написать что-то вроде:

<xsl:value-of select="item[code=1.1]/amt + 
 item[code=1.2]/amt + item[code=1.3.1]/amt + item[code=1.3.2]/amt"/>

Проблема в том, что любой (даже все) из этих узлов может отсутствовать (например, 1.2 в примере). Таким образом, инструкция возвращает NaN!

Был бы признателен за хороший совет :)

Alex

0
A.Fas 25 Фев 2015 в 14:12

2 ответа

Лучший ответ

В этом случае, поскольку это прямая сумма, вы можете просто сделать

<xsl:value-of select="sum(item[code=1.1 or code=1.2 or
                               code=1.3.1 or code=1.3.2]/amt)"/>
1
Ian Roberts 25 Фев 2015 в 11:36

Вы можете использовать это при условии, что все amt являются допустимыми десятичными знаками:

 <xsl:value-of select="sum(item[starts-with(code, '1')]/amt)"/>

И если вы хотите суммировать только числа и опустить значения NaN (в случае их наличия), используйте это:

<xsl:value-of select="sum(item[starts-with(code, '1.') and number(amt)]/amt)"/>
1
Lingamurthy CS 25 Фев 2015 в 11:16