Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / проблема с key / 21 сообщений из 21, страница 1 из 1
24.11.2012, 21:12
    #38051844
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
Добрый вечер. Делаю xslt-шаблон. для xml:
Код: 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.
<?xml version="1.0" encoding="windows-1251" ?> 
- <Файл>

<Документ>

<ОбъемОборота НаимЮЛ="Подразделение1" >			
			<Оборот ПN="1" П000000000003="010">
				<СведПроизвИмпорт ПN="1" ИдПроизвИмп="7">
					<Движение ПN="1" П100000000006="5.00000" />
				</СведПроизвИмпорт>
				<СведПроизвИмпорт ПN="2" ИдПроизвИмп="8">
					<Движение ПN="1" П100000000006="2.00000" />
				</СведПроизвИмпорт>
				<СведПроизвИмпорт ПN="3" ИдПроизвИмп="9">
					<Движение ПN="1" П100000000006="8.00000" />
				</СведПроизвИмпорт>
			</Оборот>
		</ОбъемОборота>
		<ОбъемОборота НаимЮЛ="Подразделение2">
			<Оборот ПN="1" П000000000003="010">
				<СведПроизвИмпорт ПN="1" ИдПроизвИмп="8">
					<Движение ПN="1" П100000000006="7.00000"/>
				</СведПроизвИмпорт>
				<СведПроизвИмпорт ПN="2" ИдПроизвИмп="9">
					<Движение ПN="1" П100000000006="9.00000"/>
				</СведПроизвИмпорт>
			</Оборот>
			<Оборот ПN="2" П000000000003="020">
				<СведПроизвИмпорт ПN="1" ИдПроизвИмп="7">
					<Движение ПN="1" П100000000006="99.00000" />
				</СведПроизвИмпорт>
				<СведПроизвИмпорт ПN="2" ИдПроизвИмп="8">
					<Движение ПN="1" П100000000006="7.00000" />
				</СведПроизвИмпорт>
			</Оборот>
		</ОбъемОборота>

  </Документ>
  </Файл>


В котором необходимо выполнить две таблицы 1) по всей организации 2) по подразделениям. (картринку прилагаю) По подразделениям таблица готова. Весь код прилагать не буду. Делала с помощью циклов. То есть внешний цикл - это подразделения, потом код продукции и так далее.Итоги по подразделениям считала так:

Код: 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.
<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:value-of select="format-number($sum + $nodes[$pos]/Движение/@П100000000006, '#0.00')"/>
       
    </xsl:otherwise>
  </xsl:choose>
</xsl:template> 

...
<xsl:variable name="vid" select="Оборот" /> 

  <xsl:for-each select="$vid">
...
   <xsl:variable name="CADDR">
    <xsl:if test="@П000000000003">
      <xsl:value-of select="@П000000000003"/> 
    </xsl:if>  
  </xsl:variable> 

    <xsl:variable name="nodes" select="СведПроизвИмпорт[//Оборот/@П000000000003=$CADDR]"/>

<xsl:call-template name="sum">
  <xsl:with-param name="pos" select="count($nodes)"/>
  <xsl:with-param name="nodes" select="$nodes"/>
</xsl:call-template> 
...
  
 



Может быть мой способ не самый хороший. Прошу помощи в составлении общей таблицы по организации. Не могу разобраться с ключами. То есть как сгруппировать по каждому коду все подразделения .
Спасибо.
...
Рейтинг: 0 / 0
24.11.2012, 21:21
    #38051850
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
Альтаир, Если я Вас правильно понял
Код: xml
1.
<xsl:key name="total" match="/Документ/ОбъемОборота/Оборот" use="@ПN"/>
...
Рейтинг: 0 / 0
24.11.2012, 22:12
    #38051891
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
ID подразделения - это Документ/ОбъемОборота/Оборот/СведПроизвИмпорт/@ИдПроизвИмп

Нужно вначале сгруппировать по Оборот/@П000000000003 и внутри по ID/
...
Рейтинг: 0 / 0
24.11.2012, 22:39
    #38051904
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
Ну тогда, что-то вроде этого
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<xsl:template match="Документ">
  <xsl:variable name="returns" select="ОбъемОборота/Оборот"/>
  <xsl:for-each select="$returns/Оборот">
    <xsl:variable name="p003" select="@П000000000003"/>
    <xsl:if test="not(preceding-sibling::Оборот[@П000000000003 = $p003])">
      <xsl:for-each select="$returns/Оборот[@П000000000003 = $p003]/СведПроизвИмпорт">
        <xsl:if test="not(preceding-sibling::СведПроизвИмпорт[@ИдПроизвИмп = current()/@ИдПроизвИмп])">
           .......................
        </xsl:if>
      </xsl:for-each>
    </xsl:if>
  </xsl:for-each>
</xsl:template>
...
Рейтинг: 0 / 0
24.11.2012, 22:49
    #38051914
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
то есть я так понимаю, что нужно сортировать по коду а внутри него складывать суммы по всем производителям, то есть

Код: xml
1.
2.
  <xsl:key name="type" match="/Документ/ОбъемОборота/Оборот" use="@П000000000003/text()" />
   <xsl:template match="Файл">



а дальше пробую так

Код: xml
1.
<xsl:for-each select="Документ/ОбъемОборота/Оборот[generate-id()=generate-id(key('type',@П000000000003/text()))]">


а чтобы сложить внутри каждого кода:

Код: xml
1.
2.
3.
4.
5.
<xsl:variable name="nodes" select="СведПроизвИмпорт/Движение/@П100000000006[@П000000000003=current()/@П000000000003]"/>
<xsl:call-template name="sum">
  <xsl:with-param name="pos" select="count($nodes)"/>
  <xsl:with-param name="nodes" select="$nodes"/>
</xsl:call-template>  



но nodes - не правильно задаю
...
Рейтинг: 0 / 0
24.11.2012, 22:50
    #38051917
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
_Vasilisk_,

простите. не заметила что вы ответили сразу
...
Рейтинг: 0 / 0
24.11.2012, 23:04
    #38051922
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
В Ваших терминах должно быть так
Код: xml
1.
<xsl:variable name="nodes" select="/Файл/Документ/ОбъемОборота/Оборот[@П000000000003=current()/@П000000000003]/СведПроизвИмпорт/Движение/@П100000000006"/>
...
Рейтинг: 0 / 0
25.11.2012, 13:12
    #38052113
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
_Vasilisk_,

В моих терминах ничего не выводится.

А в ваших тоже не очень понимаю. выводится следующее:
5.00000
2.00000
8.00000
7.00000
9.00000
5.00000
2.00000
8.00000
7.00000
9.00000
99.00000
7.00000
...
Рейтинг: 0 / 0
25.11.2012, 13:18
    #38052114
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
_Vasilisk_,
То есть ещё раз, пишу так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
     <xsl:variable name="returns" select="Документ/ОбъемОборота"/>
  <xsl:for-each select="$returns/Оборот">
    <xsl:variable name="p003" select="@П000000000003"/>
    <xsl:if test="not(preceding-sibling::Оборот[@П000000000003 = $p003])">
      <xsl:for-each select="$returns/Оборот[@П000000000003 = $p003]/СведПроизвИмпорт">    
        <xsl:if test="not(preceding-sibling::СведПроизвИмпорт[@ИдПроизвИмп = current()/@ИдПроизвИмп])">
             <xsl:value-of select="Движение/@П100000000006"/> 
             <br/>
        </xsl:if>
      </xsl:for-each>
    </xsl:if>
  </xsl:for-each>




или так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
   <xsl:key name="type" match="/Документ/ОбъемОборота/Оборот" use="@П000000000003/text()" />

  <xsl:template match="Файл">
 ...    
 <xsl:for-each select="/Документ/ОбъемОборота/Оборот[generate-id()=generate-id(key('type',@П000000000003/text()))]">
 <xsl:value-of select="СведПроизвИмпорт/Движение/@П100000000006" />

    <xsl:variable name="nodes" select="/Документ/ОбъемОборота/Оборот[@П000000000003=current()/@П000000000003]/СведПроизвИмпорт/Движение/@П100000000006"/>
<xsl:value-of select="$nodes" />
...
Рейтинг: 0 / 0
26.11.2012, 16:31
    #38053592
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
Если написать так:

Код: 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.
 <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:value-of select="format-number($sum + $nodes[$pos]/Движение/@П100000000006, '#0.00')"/>
       
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>  




<xsl:variable name="vid" select="ОбъемОборота/Оборот" /> 

  <xsl:for-each select="$vid">

   <xsl:variable name="CADDR">
    <xsl:if test="@П000000000003">
      <xsl:value-of select="@П000000000003"/> 
    </xsl:if>  
  </xsl:variable> 

  
  <xsl:variable name="sv" select="СведПроизвИмпорт" /> 
  
      <xsl:for-each select="$sv"> 

       <xsl:variable name="sv_">
          <xsl:if test="@ИдПроизвИмп">
             <xsl:value-of select="@ИдПроизвИмп"/> 
          </xsl:if>  
        </xsl:variable> 


   <xsl:variable name="nodes" select="//СведПроизвИмпорт[@ИдПроизвИмп=$sv_ and //Оборот/@П000000000003=$CADDR]"/>

<xsl:call-template name="sum">
  <xsl:with-param name="pos" select="count($nodes)"/>
  <xsl:with-param name="nodes" select="$nodes"/>
...




то суммы с одинаковыми производителями складываются но не учитывается //Оборот/@П000000000003=$CADDR то есть складываются с разными кодами.
...
Рейтинг: 0 / 0
27.11.2012, 01:02
    #38054118
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
В итоге получилось сделать так:
Код: 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.
 <xsl:variable name="returns" select="Документ/ОбъемОборота"/>

  
   
     <xsl:for-each select="$returns/Оборот">
     <xsl:variable name="p003" select="@П000000000003"/>
       
                 <xsl:for-each select="СведПроизвИмпорт[not(@ИдПроизвИмп=preceding-sibling::СведПроизвИмпорт/@ИдПроизвИмп)]">
ID-произв - 
        <xsl:value-of select="@ИдПроизвИмп"/>
        /код - 
                <xsl:value-of select="$p003"/>
                /сумма -
     <xsl:variable name="nodes101" select="//Оборот[@П000000000003=$p003]/СведПроизвИмпорт[@ИдПроизвИмп=current()/@ИдПроизвИмп]"/>
     


<xsl:call-template name="sum">
  <xsl:with-param name="pos" select="count($nodes101)"/>
  <xsl:with-param name="nodes" select="$nodes101"/>
  
 </xsl:call-template>  
             
             <br/>
              </xsl:for-each>
      
     
 </xsl:for-each>



результат

ID-произв - 7 /код - 010 /сумма - 5.00
ID-произв - 8 /код - 010 /сумма - 9.00
ID-произв - 9 /код - 010 /сумма - 17.00
ID-произв - 8 /код - 010 /сумма - 9.00
ID-произв - 9 /код - 010 /сумма - 17.00
ID-произв - 7 /код - 020 /сумма - 99.00
ID-произв - 8 /код - 020 /сумма - 7.00

два повторяющихся значения, хотя дубли убираю строкой - <xsl:for-each select="СведПроизвИмпорт[not(@ИдПроизвИмп=preceding-sibling::СведПроизвИмпорт/@ИдПроизвИмп)]">
...
Рейтинг: 0 / 0
27.11.2012, 02:04
    #38054148
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
Альтаирдва повторяющихся значения, хотя дубли убираю строкойА если так
Код: xml
1.
<xsl:for-each select="СведПроизвИмпорт[not(preceding-sibling::СведПроизвИмпорт[@ИдПроизвИмп = current()/@ИдПроизвИмп])]">

И точно будет работать так
Код: xml
1.
2.
3.
4.
5.
<xsl:for-each select="СведПроизвИмпорт>
  <xsl:if test="not(preceding-sibling::СведПроизвИмпорт[@ИдПроизвИмп = current()/@ИдПроизвИмп])">
    .............
  </xsl:if>
</xsl:for-each>
...
Рейтинг: 0 / 0
27.11.2012, 09:10
    #38054246
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
_Vasilisk_,

то же самое выводится почему-то
...
Рейтинг: 0 / 0
27.11.2012, 10:06
    #38054308
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
Нет. получается, что здесь не повторы лишние, а цикл не правильный...
...
Рейтинг: 0 / 0
28.11.2012, 16:58
    #38056701
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
Народ, помогите.
Почему не убираются дубли???????? замучилась уже. эти preceding-sibling почему-то не срабатывают.
...
Рейтинг: 0 / 0
28.11.2012, 18:26
    #38056889
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
Альтаир,

ужасный ужасный ужасный XML по русски. я бы бежал из этой конторы.
у меня нужная вам выборка генерится, объяснять - лень.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="1.0"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns="http://www.w3.org/1999/xhtml">
	<xsl:output method="html" indent="yes" />

	<xsl:key name="o" match="/Файл/Документ/ОбъемОборота/Оборот" use="@П000000000003"/>
	<xsl:key name="p" match="/Файл/Документ/ОбъемОборота/Оборот/СведПроизвИмпорт" use="concat(../@П000000000003, @ИдПроизвИмп)"/>

	<xsl:template match="/">
		<xsl:for-each select="/Файл/Документ/ОбъемОборота/Оборот[generate-id()=generate-id(key('o', @П000000000003))]">
			<xsl:variable name="poz" select="@П000000000003" />
			<xsl:for-each select="key('o', $poz)">
				<xsl:for-each select="СведПроизвИмпорт[generate-id()=generate-id(key('p', concat($poz,@ИдПроизвИмп)))]">
					[<xsl:value-of select="$poz" /> - <xsl:value-of select="sum(/Файл/Документ/ОбъемОборота/Оборот[@П000000000003=$poz]/СведПроизвИмпорт[@ИдПроизвИмп=current()/@ИдПроизвИмп]/Движение/@П100000000006)" /> - <xsl:value-of select="@ИдПроизвИмп" />]
				</xsl:for-each>
			</xsl:for-each>
			{<xsl:value-of select="@П000000000003" /> sum: <xsl:value-of select="sum(/Файл/Документ/ОбъемОборота/Оборот[@П000000000003=$poz]/СведПроизвИмпорт/Движение/@П100000000006)" />}
		</xsl:for-each>
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
28.11.2012, 18:29
    #38056890
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
один фор лишний, пока пытался понять что вам надо...
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="1.0"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns="http://www.w3.org/1999/xhtml">
	<xsl:output method="html" indent="yes" />

	<xsl:key name="o" match="/Файл/Документ/ОбъемОборота/Оборот" use="@П000000000003"/>
	<xsl:key name="p" match="/Файл/Документ/ОбъемОборота/Оборот/СведПроизвИмпорт" use="concat(../@П000000000003, @ИдПроизвИмп)"/>

	<xsl:template match="/">
		<xsl:for-each select="/Файл/Документ/ОбъемОборота/Оборот[generate-id()=generate-id(key('o', @П000000000003))]">
			<xsl:variable name="poz" select="@П000000000003" />
			<xsl:for-each select="СведПроизвИмпорт[generate-id()=generate-id(key('p', concat($poz,@ИдПроизвИмп)))]">
				[<xsl:value-of select="$poz" /> - <xsl:value-of select="sum(/Файл/Документ/ОбъемОборота/Оборот[@П000000000003=$poz]/СведПроизвИмпорт[@ИдПроизвИмп=current()/@ИдПроизвИмп]/Движение/@П100000000006)" /> - <xsl:value-of select="@ИдПроизвИмп" />]
			</xsl:for-each>
			{<xsl:value-of select="@П000000000003" /> sum: <xsl:value-of select="sum(/Файл/Документ/ОбъемОборота/Оборот[@П000000000003=$poz]/СведПроизвИмпорт/Движение/@П100000000006)" />}
		</xsl:for-each>
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
28.11.2012, 18:34
    #38056899
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
кдючи пишутся от рута без попыток вставить переменные, иначе они не работают.
...
Рейтинг: 0 / 0
28.11.2012, 19:07
    #38056934
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
mage.lan,

то есть без key сделать не возможно?
...
Рейтинг: 0 / 0
28.11.2012, 19:47
    #38056979
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
Альтаир,

можно, но 2 листинга тормозного кода для русского хмл я писать не готов
...
Рейтинг: 0 / 0
28.11.2012, 23:45
    #38057192
Альтаир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с key
Альтаир,

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


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