Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / sum в xslt / 5 сообщений из 5, страница 1 из 1
18.10.2013, 09:26
    #38432292
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum в xslt
Вот так работает:
<xsl:for-each select="$rekv">
<xsl:value-of select='sum(@Сумма)' />
</xsl:for-each>

Но если вместо @Сумма поставить переменную, то не работает.
Как суммировать переменную в цикле?
Если вывести значение переменной <xsl:value-of select='$v1' /> , то будет: 10,20,30
а вот так <xsl:value-of select='sum($v1)' /> - пустота
...
Рейтинг: 0 / 0
18.10.2013, 09:48
    #38432328
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum в xslt
Альтаира вот так <xsl:value-of select='sum($v1)' /> - пустотаВсе правильно. Если $v1 = 10, то чему должно быть равно sum(10)?

sum работает с набором узлов, а не скалярными значениями.
АльтаирКак суммировать переменную в цикле?Никак и это не нужно. Сумма значений из предыдущих узлов по отношению к контексту считается с помощью preceding-sibling.
тынц
...
Рейтинг: 0 / 0
18.10.2013, 11:36
    #38432512
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum в xslt
Мне кажется, это немного не то.. Дело в том, что если бы мне просто нужно было сложить узлы, то я бы смогла их сложить и с помощью 'sum(@Сумма)'. Но числа у меня в непотребном виде, с пробелами и запятами, поэтому я их перед сложением прогоняю через функции, на выходе которых получаю переменную v1. А как дальше с переменными поступить - не знаю.
...
Рейтинг: 0 / 0
18.10.2013, 12:33
    #38432654
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum в xslt
Можно из результатов перегона создать временное дерево и просуммировать его.
тынц
...
Рейтинг: 0 / 0
18.10.2013, 12:51
    #38432698
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum в 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
<xsl:template name="replace1">            
       <xsl:param name="input"/>            
       <xsl:param name="from"/>            
                  

       <xsl:choose>            
           <xsl:when test="contains($input, $from)">            
               <!--   вывод подстроки предшествующей образцу  + вывод строки замены -->            
               <xsl:value-of select="substring-before($input, $from)"/><!--   вход в итерацию -->            
               <xsl:call-template name="replace">            
                   <!--  в качестве входного параметра задается подстрока после образца замены  -->            
                   <xsl:with-param name="input" select="substring-after($input, $from)"/>            
                   <xsl:with-param name="from" select="$from"/>            
                          
               </xsl:call-template>            

           </xsl:when>            
           <xsl:otherwise>            
               <xsl:value-of select="$input"/>            
           </xsl:otherwise>            
       </xsl:choose>            
   </xsl:template>    

   <xsl:template name="replace2">            
       <xsl:param name="input"/>            
       <xsl:param name="from"/>                        
       <xsl:choose>            
           <xsl:when test="contains($input, $from)">            
               <!--   вывод подстроки предшествующей образцу  + вывод строки замены -->            
               <xsl:value-of select="substring-before($input, $from)"/>,<!--   вход в итерацию -->            
               <xsl:call-template name="replace">            
                   <!--  в качестве входного параметра задается подстрока после образца замены  -->            
                   <xsl:with-param name="input" select="substring-after($input, $from)"/>            
                   <xsl:with-param name="from" select="$from"/>            
                          
               </xsl:call-template>            

           </xsl:when>            
           <xsl:otherwise>            
               <xsl:value-of select="$input"/>            
           </xsl:otherwise>            
       </xsl:choose>            
   </xsl:template>       



<xsl:template name="sum">
  <xsl:param name="pos"/>
  <xsl:param name="nodes"/>
  <xsl:choose>
    <xsl:when test="$pos = 0">
      <xsl:value-of select="0"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:variable name="sum">
        <xsl:call-template name="sum">
          <xsl:with-param name="pos" select="$pos - 1"/>
          <xsl:with-param name="nodes" select="$nodes"/>
        </xsl:call-template>
      </xsl:variable>



 <xsl:variable name="v1">   
  <xsl:value-of select="$nodes[$pos]/text()"/> 
</xsl:variable>


<xsl:variable name="v1_">    
  	  <xsl:call-template name="replace">            
           <xsl:with-param name="input" select="$v1"/>            
           <xsl:with-param name="from" select="','"/>                        
       </xsl:call-template>   
       </xsl:variable>  

 <xsl:variable name="v1_1">    
  	  <xsl:call-template name="replace1">            
           <xsl:with-param name="input" select="$v1_"/>            
           <xsl:with-param name="from" select="' '"/>                        
       </xsl:call-template>  
       </xsl:variable>

    <xsl:value-of select="format-number($sum + $v1_1, '#0.00')" />


    </xsl:otherwise>
  </xsl:choose>
</xsl:template>  
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / sum в xslt / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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