Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Группировка + подсчет суммы / 5 сообщений из 5, страница 1 из 1
25.03.2014, 15:00
    #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
25.03.2014, 15:30
    #38595867
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка + подсчет суммы
sum(line[p0 = current()/p0]/p2)
...
Рейтинг: 0 / 0
25.03.2014, 16:11
    #38595960
Hastiel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка + подсчет суммы
Antonariy, извиняюсь, я только начал изучать xslt и не знаю многих элементарных вещей. Поэтому, можно подробнее? Куда вставить этот фрагмент?
...
Рейтинг: 0 / 0
25.03.2014, 16:13
    #38595970
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка + подсчет суммы
туда, где должно быть "итого"
...
Рейтинг: 0 / 0
25.03.2014, 16:16
    #38595981
Hastiel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка + подсчет суммы
Antonariy, все, разобрался, спасибо большое.
Там еще 2 слеша нужно было поставить:

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


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