2015-12-07 2 views
1

Я работаю над созданием суммы имен элементов, которые, когда они существуют, увеличиваются.XSLT 2.0 - Имена элементов сумм, которые увеличиваются

Пример XML:

<Distributions> 
<DIST_DISTRIBUTIONMETHOD_1>Check to Other</DIST_DISTRIBUTIONMETHOD_1> 
<DIST_CREDITOR_1>MOTORS FINANCE</DIST_CREDITOR_1> 
<DIST_AMOUNT_1>16710.04</DIST_AMOUNT_1> 
<DIST_NET_1>No</DIST_NET_1> 
<DIST_DISTRIBUTIONMETHOD_2>Check to Other</DIST_DISTRIBUTIONMETHOD_2> 
<DIST_CREDITOR_2>WILLIAM HOOK</DIST_CREDITOR_2> 
<DIST_AMOUNT_2>1239.86</DIST_AMOUNT_2> 
<DIST_NET_2>Yes</DIST_NET_2> 
</Distributions> 

мне нужно подвести DIST_AMOUNT_1, 2, и т.д., вплоть до 15 возможных в общей сложности, которые могут или не могут существовать.

Таким образом, я назначил каждому DIST_AMOUNT переменной после проверки, существует ли она. Сама сумма - это то место, где у меня возникают проблемы, так как нет ничего населяющего сумму, и я не знаю, почему, я избил свою голову по этому поводу и искал ответы на вопросы в течение нескольких дней. Любая помощь приветствуется.

Мой XSL код thusfar:

<xsl:variable name="DIST_TMP_1"> 
      <xsl:choose> 
       <xsl:when test="//DIST_AMOUNT_1"> 
        <xsl:value-of select="number(//DIST_AMOUNT_1)"/> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="number(0.00)"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     <xsl:variable name="DIST_TMP_2"> 
      <xsl:choose> 
       <xsl:when test="//DIST_AMOUNT_2"> 
        <xsl:value-of select="number(//DIST_AMOUNT_2)"/> 
       </xsl:when>     
       <xsl:otherwise> 
        <xsl:value-of select="number(0.00)"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     <xsl:variable name="DIST_TMP_3"> 
      <xsl:choose> 
       <xsl:when test="//DIST_AMOUNT_3"> 
        <xsl:value-of select="number(//DIST_AMOUNT_3)"/> 
       </xsl:when>     
       <xsl:otherwise> 
        <xsl:value-of select="number(0.00)"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     <xsl:element name="ECD070_TOTAL_VAR"> 
      <xsl:value-of select="sum($DIST_TMP_1+$DIST_TMP_2+DIST_TMP_3)"/> 
     </xsl:element> 
+0

Возможный дубликат [Агрегатная функция для суммы и продукта в XPath] (http://stackoverflow.com/questions/10669313/aggregate-function-for-sum-and-product-in-xpath). В верхней части ответа есть часть XSLT 1.0; вы можете оставить часть продукта, так как вам нужна только сумма. – Kenney

+0

Я не думаю, что его дубликат, поскольку в примере используется только значение. Not value_1, value_2 и т. Д. Эти элементы не совпадают, поэтому код не работает для этой проблемы. –

+0

Все, что вам нужно сделать, это изменить выражение в соответствии с тегом. – Kenney

ответ

2

Почему вы не можете просто сделать:

<xsl:value-of select="sum(/Distributions/*[starts-with(name(), 'DIST_AMOUNT_')])" /> 

Или, если вы должны быть явными, сделайте следующее:

<xsl:value-of select="sum((DIST_AMOUNT_1, DIST_AMOUNT_2, DIST_AMOUNT_3, ... DIST_AMOUNT_15))" /> 

(это из контекста Distributions). Нет необходимости проверять каждый из них на наличие: несуществующие узлы просто игнорируются.

+0

Используя первый вариант, он предоставляет «0» в качестве суммы, когда она должна быть 17949.90. Это, по крайней мере, дает некоторые результаты сейчас, поэтому спасибо за это! –

+0

Явный вариант дает синтаксическую ошибку, он не любил запятые, когда я использовал их ранее, и почему я использовал знаки плюс. –

+0

@ DanaWilliams Оба предложения были протестированы с использованием процессора XSLT 2.0 (первый тоже должен работать в XSLT 1.0). Какой процессор вы используете? --- P.S. Использование плюсовых знаков внутри sum() гарантируется сбой. –

Смежные вопросы