powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Группировка + подсчет суммы
5 сообщений из 5, страница 1 из 1
Группировка + подсчет суммы
    #38595815
Hastiel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Столкнулся с проблемой. У меня есть XML документ с информацией по клиентам. Некоторые лицевые счета повторяются, отличаясь типом задолженностей. Нужно сформировать документ, где будут отсортированы клиенты, подсчитана общая задолженность для каждого и перечислены типы задолженностей с отдельными суммами.

Исходный xml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="CP1251"?>
<uforegimport>
<line><p0>707007</p0><p1>2</p1><p2>8.88</p2><p3>Сидоров С.С.</p3></line>
<line><p0>101001</p0><p1>1</p1><p2>1.11</p2><p3>Иванов И.И.</p3></line>
<line><p0>101001</p0><p1>2</p1><p2>2.22</p2><p3>Иванов И.И.</p3></line>
<line><p0>101001</p0><p1>3</p1><p2>3.33</p2><p3>Иванов И.И.</p3></line>
<line><p0>707007</p0><p1>3</p1><p2>9.99</p2><p3>Сидоров С.С.</p3></line>
<line><p0>505002</p0><p1>1</p1><p2>4.44</p2><p3>Петров П.П.</p3></line>
<line><p0>505002</p0><p1>2</p1><p2>5.55</p2><p3>Петров П.П.</p3></line>
<line><p0>505002</p0><p1>3</p1><p2>6.66</p2><p3>Петров П.П.</p3></line>
<line><p0>707007</p0><p1>1</p1><p2>7.77</p2><p3>Сидоров С.С.</p3></line>
</uforegimport>


<p0> Лицевой счет; <p1> Тип задолженности; <p2> Сама задолженность; <p3> ФИО.

У меня получается сгруппировать клиентов по лицевому счету и перечислить для каждого его задолженности. Мой XSLT:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
 
  <xsl:template match="line">
    <xsl:if test="not(preceding-sibling::line[p0 = current()/p0])">
      <line>
        <p0>
          <xsl:text>Счет: </xsl:text>
          <xsl:apply-templates select="p0"/>
          <xsl:text>| </xsl:text>
          <xsl:text>ФИО: </xsl:text>
          <xsl:apply-templates select="p3"/>
          <xsl:text>| </xsl:text>
          <xsl:apply-templates select="../line[p0 = current()/p0]" mode="p1"/>
        </p0>
        <xsl:text> || </xsl:text> 
      </line>
    </xsl:if>
  </xsl:template>
 
  <xsl:template match="line" mode="p1">
    <xsl:text> Задолженность </xsl:text>
    <xsl:if test="not(preceding-sibling::line[
      p0 = current()/p0 and p1 = current()/p1])">
      <p1>
        <xsl:apply-templates select="p1"/>
         <xsl:text>: </xsl:text>
         <xsl:apply-templates select="p2"/>
         <xsl:text>; </xsl:text>
      </p1>
    </xsl:if>
  </xsl:template>
 
  <xsl:template match="text()">
    <xsl:value-of select="."/>
  </xsl:template>
 
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>
 
</xsl:stylesheet>


А вот как подсчитать общую сумму задолженностей у меня не получается((

Сейчас на выходе получается такой вот результат:
Счет: 707007| ФИО: Сидоров С.С.| Задолженность 2: 8.88; Задолженность 3: 9.99; Задолженность 1: 7.77; ||
Счет: 101001| ФИО: Иванов И.И.| Задолженность 1: 1.11; Задолженность 2: 2.22; Задолженность 3: 3.33; ||
Счет: 505002| ФИО: Петров П.П.| Задолженность 1: 4.44; Задолженность 2: 5.55; Задолженность 3: 6.66; ||

Нужно чтобы было как то так:
Счет: 707007| ФИО: Сидоров С.С.| Задолженность 2: 8.88; Задолженность 3: 9.99; Задолженность 1: 7.77; Итого: 26.64 ||
Счет: 101001| ФИО: Иванов И.И.| Задолженность 1: 1.11; Задолженность 2: 2.22; Задолженность 3: 3.33; Итого: 6.66 ||
Счет: 505002| ФИО: Петров П.П.| Задолженность 1: 4.44; Задолженность 2: 5.55; Задолженность 3: 6.66; Итого: 16.65 ||
...
Рейтинг: 0 / 0
Группировка + подсчет суммы
    #38595867
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sum(line[p0 = current()/p0]/p2)
...
Рейтинг: 0 / 0
Группировка + подсчет суммы
    #38595960
Hastiel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, извиняюсь, я только начал изучать xslt и не знаю многих элементарных вещей. Поэтому, можно подробнее? Куда вставить этот фрагмент?
...
Рейтинг: 0 / 0
Группировка + подсчет суммы
    #38595970
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
туда, где должно быть "итого"
...
Рейтинг: 0 / 0
Группировка + подсчет суммы
    #38595981
Hastiel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, все, разобрался, спасибо большое.
Там еще 2 слеша нужно было поставить:

Код: xml
1.
2.
         <xsl:text>Итого: </xsl:text>
         <xsl:value-of select='sum(//line[p0 = current()/p0]/p2)'/>
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Группировка + подсчет суммы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]