powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / проблема с key
21 сообщений из 21, страница 1 из 1
проблема с key
    #38051844
Альтаир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер. Делаю 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
проблема с key
    #38051850
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Альтаир, Если я Вас правильно понял
Код: xml
1.
<xsl:key name="total" match="/Документ/ОбъемОборота/Оборот" use="@ПN"/>
...
Рейтинг: 0 / 0
проблема с key
    #38051891
Альтаир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ID подразделения - это Документ/ОбъемОборота/Оборот/СведПроизвИмпорт/@ИдПроизвИмп

Нужно вначале сгруппировать по Оборот/@П000000000003 и внутри по ID/
...
Рейтинг: 0 / 0
проблема с key
    #38051904
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда, что-то вроде этого
Код: 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
проблема с key
    #38051914
Альтаир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то есть я так понимаю, что нужно сортировать по коду а внутри него складывать суммы по всем производителям, то есть

Код: 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
проблема с key
    #38051917
Альтаир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

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

Код: 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
проблема с key
    #38054118
Альтаир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В итоге получилось сделать так:
Код: 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
проблема с key
    #38054148
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Альтаирдва повторяющихся значения, хотя дубли убираю строкойА если так
Код: 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
проблема с key
    #38054246
Альтаир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

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

ужасный ужасный ужасный 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
проблема с key
    #38056890
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
один фор лишний, пока пытался понять что вам надо...
Код: 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
проблема с key
    #38056899
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кдючи пишутся от рута без попыток вставить переменные, иначе они не работают.
...
Рейтинг: 0 / 0
проблема с key
    #38056934
Альтаир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mage.lan,

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

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

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


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