Xpoint
   [напомнить пароль]

Посчитать суммы значений с разбиением по 10

Метки: [без меток]
2012-02-23 16:18:03 [обр] Дзегайло Анна[досье]
сообщение промодерировано

Пусть у меня есть xml:

<list name="table" >
<item><SUM>1.00</SUM></item>
<item><SUM>1.00</SUM></item>
<item><SUM>1.00</SUM></item>
<item><SUM>1.00</SUM></item>
<item><SUM>1.00</SUM></item>
<item><SUM>1.00</SUM></item>
<item><SUM>1.00</SUM></item>
<item><SUM>1.00</SUM></item>
<item><SUM>1.00</SUM></item>
<item><SUM>1.00</SUM></item>
<item><SUM>2.00</SUM></item>
<item><SUM>2.00</SUM></item>
<item><SUM>2.00</SUM></item>
<item><SUM>2.00</SUM></item>
</list>

Мне нужно преобразовать его в хмл:

<PAGE>
<TABLE>
<ROW><SUM>1.00</SUM></ROW>
<ROW><SUM>1.00</SUM></ROW>
<ROW><SUM>1.00</SUM></ROW>
<ROW><SUM>1.00</SUM></ROW>
<ROW><SUM>1.00</SUM></ROW>
<ROW><SUM>1.00</SUM></ROW>
<ROW><SUM>1.00</SUM></ROW>
<ROW><SUM>1.00</SUM></ROW>
<ROW><SUM>1.00</SUM></ROW>
<ROW><SUM>1.00</SUM></ROW>
</TABLE>
<TOTAL_SUM>10.00</TEST_SUM>
</PAGE>
<PAGE>
<TABLE>
<ROW><SUM>2.00</SUM></ROW>
<ROW><SUM>2.00</SUM></ROW>
<ROW><SUM>2.00</SUM></ROW>
<ROW><SUM>2.00</SUM></ROW>
</TABLE>
<TOTAL_SUM>8.00</TEST_SUM>
</PAGE>

Делаю я это следующим образом:

…
<xsl:variable name="max_rows">10</xsl:variable>
…
<xsl:template match="/">
<xsl:apply-templates select="/document/list/item[position() mod $max_rows = 1]" mode="page" />
</xsl:template>

<xsl:template match="item" mode="page">
<PAGE>
<TABLE>
        <xsl:apply-templates select=".|following-sibling::item[position() &lt;$max_rows]" mode="row" />
</TABLE>
<xsl:element name="TOTAL_SUM">
    <xsl:variable name="fpm" select="sum(//list[@name='table']/item/SUM)"/>
        <xsl:value-of select='format-number($fpm, "#.00")' />
</xsl:element>
</PAGE>
</xsl:template>

<xsl:template match="item" mode="row">
<ROW>
 <SUM >
     <xsl:value-of select="SUM" />
 </SUM >
</ROW>
</xsl:template>

Но в таком случае у меня получается, что значением TOTAL_SUM есть сумма всех SUM, а мне необходимо чтобы при разделении на PAGE в каждом TOTAL_SUM была сумма только тех значений SUM, которые есть в конкретном PAGE.

спустя 17 часов [обр] Jared(0/26)[досье]
Правильно. Когда вы выводите сумму, вы даете функции sum все элементы. Давайте только нужные.
<xsl:template match='list'>
    <xsl:for-each select="item[position() mod $max_rows = 1]">
        <PAGE>
                <TABLE>
                        <xsl:variable name="fst" value="position()"/>
                        <xsl:apply-templates select=".|following-sibling::item[position() &lt; $max_rows]" mode='subitems'/>
                </TABLE>

                <TOTAL_SUM>
                        <xsl:variable name="fpm" select="sum(.|following-sibling::item[position() &lt; $max_rows]/SUM)"/>
                        <xsl:value-of select='format-number($fpm, "#.00")' />
                </TOTAL_SUM>        
        </PAGE>
    </xsl:for-each>
</xsl:template>

<xsl:template match='item' mode='subitems'>
        <ROW><SUM><xsl:value-of select ="./SUM"/></SUM></ROW>
</xsl:template>
спустя 4 часа 1 минуту [обр] Дзегайло Анна[досье]
Спасибо за совет, но у меня все равно не получилось)
у меня этот код не отрабатывает вообще, просто ничего не происходит.
т.е. я пыталась прикрутить вызов этого шаблона к своему хсл - ничего, я пыталась использовать только скрипт, написанный Вами, - тоже ничего.
Ваша идея мне понятна, но с реализацией - туго.
спустя 1 час 58 минут [обр] Jared(0/26)[досье]

Дзегайло Анна[досье] полный код XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"  version="1.0" standalone="yes"  indent="yes" media-type="string"/>

<xsl:variable name="max_rows">10</xsl:variable>


<xsl:template match='list'>
    <xsl:for-each select="item[position() mod $max_rows = 1]">
        <PAGE>
                <TABLE>
                        <xsl:variable name="fst" value="position()"/>
                        <xsl:apply-templates select=".|following-sibling::item[position() &lt; $max_rows]" mode='subitems'/>
                </TABLE>
                
                <TOTAL_SUM>
                        <xsl:variable name="fpm" select="sum(.|following-sibling::item[position() &lt; $max_rows]/SUM)"/>
                        <xsl:value-of select='format-number($fpm, "#.00")' />
                </TOTAL_SUM>                    
        </PAGE>
    </xsl:for-each>
</xsl:template>

<xsl:template match='item' mode='subitems'>
        <ROW><SUM><xsl:value-of select ="./SUM"/></SUM></ROW>
</xsl:template>

</xsl:stylesheet>

Полный perl код:

#!/usr/bin/perl
use strict;
use XML::LibXSLT;
use XML::LibXML;

      
my $parser = XML::LibXML->new();
my $xslt = XML::LibXSLT->new();
            
my $source = $parser->parse_file('xml.xml');
my $style_doc = $parser->parse_file('xslt.xslt');
                  
my $stylesheet = $xslt->parse_stylesheet($style_doc);
                     
my $results = $stylesheet->transform($source);
                          
print $stylesheet->output_string($results);
Powered by POEM™ Engine Copyright © 2002-2005