2016-04-07 2 views
0

Я использую xslt для форматирования входных данных xml в формате html. Дело: это то, что у меня есть значение открытия-баланса как атрибут в узле TRANSACTIONS и список транзакций. Предполагается, что я напечатаю таблицу html следующим образом.
первая строка - значение открытия баланса
вторая строка - значение открытия + AMOUNT @ первый узел в ОПЕРАЦИЯХ.
Третья строка - это значение @ вторая строка + AMOUNT @ второй узел в ОПЕРАЦИЯХ. и т.д. для строк отдыхаXslt для обработки банковского счета

<results> 
<TRANSACTIONS opening-balance="100"> 
    <TRANSACTION> 
     <TYPE>DEBIT</TYPE> 
     <AMOUNT>10</DR_CR_MARKER> 
     <VALUE_DATE_1>20150726</VALUE_DATE_1> 
    </TRANSACTION> 
    <TRANSACTION> 
     <TYPE>DEBIT</TYPE> 
     <AMOUNT>20</DR_CR_MARKER> 
     <VALUE_DATE_1>20150626</VALUE_DATE_1> 
    </TRANSACTION> 
    <TRANSACTION> 
     <TYPE>DEBIT</TYPE> 
     <AMOUNT>30</DR_CR_MARKER> 
     <VALUE_DATE_1>20150826</VALUE_DATE_1> 
    </TRANSACTION> 
</TRANSACTIONS> 
</results> 

и моей XSLT обрабатывать это

<xsl:template match="results"> 
<xsl:param name="opening-balance"> 
    <xsl:value-of select="TRANSACTIONS/@opening-balance"/> 
</xsl:param> 
    <xsl:for-each select="TRANSACTIONS/TRANSACTION"> 
     <xsl:sort select="VALUE_DATE_1"/> 
     <tr style="background-color: yellow"> 
      <td> 
       <!-- i want to print total amount value here --> 
       <xsl:variable name="opening-balance" select="$opening-balance+amount" /> 
       <xsl:value-of select="$opening-balance"/> 
      </td> 
     </tr> 
    </xsl:for-each> 

я cannt сделать этим кодом. Итак, не могли бы вы мне помочь?

ответ

1

Вы можете использовать функцию sum здесь, вместе с preceding-sibling оси, чтобы выбрать все предыдущие операции, которые вы хотите, чтобы подвести

<xsl:value-of select="$opening-balance + AMOUNT + sum(preceding-sibling::TRANSACTION/AMOUNT)"/> 

Однако, если вы разбираете свой выход, вы можете использовать это выражение вместо выбрать все узлы с более низкими значениями

<xsl:value-of select="$opening-balance + sum(../TRANSACTION[VALUE_DATE_1 &lt;= current()/VALUE_DATE_1]/AMOUNT)"/> 

Так что это добавляет начальное сальдо, сумму для текущей сделки, а сумма от всех предыдущих операций.

Попробуйте XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

<xsl:template match="results"> 
    <xsl:param name="opening-balance" select="TRANSACTIONS/@opening-balance"/> 
    <table> 
     <tr> 
      <td> 
       <xsl:value-of select="$opening-balance"/> 
      </td> 
     </tr> 
     <xsl:for-each select="TRANSACTIONS/TRANSACTION"> 
      <xsl:sort select="VALUE_DATE_1"/> 
      <tr style="background-color: yellow"> 
       <td> 
        <xsl:value-of select="$opening-balance + sum(../TRANSACTION[VALUE_DATE_1 &lt;= current()/VALUE_DATE_1]/AMOUNT)"/> 
       </td> 
      </tr> 
     </xsl:for-each> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 

Обратите внимание, это будет работать только все VALUE_DATE_1 суммы различны. Если у вас есть два VALUE_DATE_1 с таким же значением, вам нужно указать дополнительные критерии для сортировки.

+0

Спасибо, он работает. Но, к сожалению, я использую сортировку для , и это делает расчет неточным –

+0

Можете ли вы изменить свой вопрос, чтобы показать его с помощью 'xsl: sort', так как в настоящее время нет упоминания о сортировке вообще. Спасибо! –

+0

сделано, спасибо заранее –

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