Как обработать пустые элементы во время выполнения суммы элементов с помощью xslt - PullRequest
5 голосов
/ 25 августа 2010
<LIST_R7P1_1>
 <R7P1_1> 
 <ORIG_EXP_PRE_CONV /> 
  <EXP_AFT_CONV >34<EXP_AFT_CONV />
  <GUARANTEE_AMOUNT /> 
  <CREDIT_DER /> 
 </R7P1_1>
</LIST_R7P1_1>


<total><xsl:value-of select="LIST_R7P1_1/R7P1_1/ORIG_EXP_PRE_CONV + LIST_R7P1_1/R7P1_1/EXP_AFT_CONV + LIST_R7P1_1/R7P1_1/GUARANTEE_AMOUNT + LIST_R7P1_1/R7P1_1/CREDIT_DER"/></total>

В итоге я получаю нулевое значение из-за пустых элементов, таких как <CREDIT_DER />, <ORIG_EXP_PRE_CONV /> и т. Д.

Как справиться с этим, чтобы я мог получить числовое значение

Пожалуйста, предложите

Ответы [ 2 ]

8 голосов
/ 25 августа 2010

Вот небольшой пример, где трюк в ответе @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.

2 голосов
/ 25 августа 2010
<total><xsl:value-of select="sum(/LIST_R7P1_1/R7P1_1/*/text())"/></total>

Вам также нужно исправить свой XML (конечный тег EXP_AFT_CONV):

<LIST_R7P1_1>
  <R7P1_1>
    <ORIG_EXP_PRE_CONV/>
    <EXP_AFT_CONV>34</EXP_AFT_CONV>
    <GUARANTEE_AMOUNT/>
    <CREDIT_DER/>
  </R7P1_1>
</LIST_R7P1_1>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...