powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT Преобразование
9 сообщений из 9, страница 1 из 1
XSLT Преобразование
    #39267784
Mcross
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!
Есть 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.
40.
41.
42.
43.
44.
45.
<shop id="1">
  <shop_group id="1">
     <parent_id>0</parent_id>
     <shop_group id="11">
        <parent_id>1</parent_id>
     </shop_group>
     <shop_group id="12">
        <parent_id>1</parent_id>
     </shop_group>
     <shop_group id="13">
        <parent_id>1</parent_id>
     </shop_group>
  </shop_group>
  <shop_group id="2">
     <shop_id>1</shop_id>
     <parent_id>0</parent_id>
     <shop_group id="21">
        <parent_id>2</parent_id>
     </shop_group>
     <shop_group id="22">
        <shop_id>1</shop_id>
        <parent_id>2</parent_id>
     </shop_group>
     <shop_group id="23">
        <shop_id>1</shop_id>
        <parent_id>2</parent_id>
     </shop_group>
  </shop_group>
  <shop_group id="3">
     <shop_id>1</shop_id>
     <parent_id>0</parent_id>
     <shop_group id="31">
        <shop_id>1</shop_id>
        <parent_id>3</parent_id>
     </shop_group>
     <shop_group id="32">
        <shop_id>1</shop_id>
        <parent_id>3</parent_id>
     </shop_group>
     <shop_group id="33">
        <shop_id>1</shop_id>
        <parent_id>3</parent_id>
     </shop_group>
  </shop_group>  
</shop>


И 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.
40.
41.
42.
43.
44.
45.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
  
  <!-- МагазинГруппыТоваровНаГлавной -->
  
  <xsl:template match="/">
     <xsl:apply-templates select="/shop"/>
  </xsl:template>
  
  <xsl:variable name="n" select="number(3)"/>
  
  <!-- Шаблон для магазина -->
  <xsl:template match="/shop">
     <div class="group_list_m">
           <xsl:apply-templates select="shop_group[position() mod $n = 1]"/>
           <div class="clear"></div>
     </div>
  </xsl:template>
  
  <!-- Шаблон для групп товара -->
  <xsl:template match="shop_group">
     <div class="sub-main">
        <xsl:for-each select=". | following-sibling::shop_group[position() < $n]">
           <div id="group_{shop_group/@id}" class="group_list_item" data-visible="none">
              .....
           </div>
           <!-- Если есть подгруппы -->
           <div style="display: none;" id="sub-level-1" class="sub_group_{shop_group/@id} sub-level-1">
              <xsl:apply-templates select="shop_group" mode="subgroup"/>
           </div>               
        </xsl:for-each>         
     </div>
  </xsl:template>
  
  <!-- Шаблон для групп товара -->
  <xsl:template match="shop_group" mode="subgroup">
     <div>
        <div class="sub_group_{shop_group/@id} sub-level-2">
           <xsl:apply-templates select="shop_group" mode="subgroup-2"/>
        </div>
     </div>
  </xsl:template>
</xsl:stylesheet>


Преобразуется всё в
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<div class="group_list_m">
   <div class="sub-main">
      <div id="group_1" class="group_list_item" data-visible="none">
      </div>
      <div id="sub-level-1" class="sub_group_1 sub-level-1">
      </div>
      <div id="group_2" class="group_list_item" data-visible="none">
      </div>
      <div id="sub-level-1" class="sub_group_2 sub-level-1">
      </div>
      <div id="group_3" class="group_list_item" data-visible="none">
      </div>
      <div id="sub-level-1" class="sub_group_3 sub-level-1">
      </div>      
   </div>  
</div>


Суть вопроса в том, как мне вывести сначала группы, а после их подгруппы
Вот так
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  <div class="sub-main">
      <div id="group_1" class="group_list_item" data-visible="none">
      </div>
      <div id="group_2" class="group_list_item" data-visible="none">
      </div>
      <div id="group_3" class="group_list_item" data-visible="none">
      </div>
      <div id="sub-level-1" class="sub_group_1 sub-level-1">
      </div>  
      <div id="sub-level-1" class="sub_group_2 sub-level-1">
      </div>      
      <div id="sub-level-1" class="sub_group_3 sub-level-1">
      </div>      
   </div>


Подскажите пожалуйста как это сделать?
...
Рейтинг: 0 / 0
XSLT Преобразование
    #39267858
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!-- МагазинГруппыТоваровНаГлавной -->
  
  <xsl:template match="/">
     <xsl:apply-templates select="/shop"/>
  </xsl:template>
  
  <xsl:variable name="n" select="number(3)"/>
  
  <!-- Шаблон для магазина -->
  <xsl:template match="/shop">
     <div class="group_list_m">
       <div class="sub-main">
           <xsl:apply-templates select="shop_group[position() mod $n = 1]"/>
           <xsl:apply-templates select="shop_group[position() mod $n = 1]" mode="subgroup"/>
           <div class="clear"></div>
       </div>
     </div>
  </xsl:template>
  
  <!-- Шаблон для групп товара -->
  <xsl:template match="shop/shop_group">
        <xsl:for-each select=". | following-sibling::shop_group[position() < $n]">
           <div id="group_{shop_group/@id}" class="group_list_item" data-visible="none">
              .....
           </div>
        </xsl:for-each>         
     </div>
  </xsl:template>
  
  <xsl:template match="shop/shop_group" mode="subgroup">
        <xsl:for-each select=". | following-sibling::shop_group[position() < $n]">
           <!-- Если есть подгруппы -->
           <div style="display: none;" id="sub-level-1" class="sub_group_{shop_group/@id} sub-level-1">
              <xsl:apply-templates select="shop_group"/>
           </div>               
        </xsl:for-each>         
     </div>
  </xsl:template>
  
  <!-- Шаблон для групп товара -->
  <xsl:template match="shop_group/shop_group">
     <div>
        <div class="sub_group_{shop_group/@id} sub-level-2">
           <xsl:apply-templates select="shop_group" mode="subgroup-2"/>
        </div>
     </div>
  </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
XSLT Преобразование
    #39267875
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mcross,

Код: 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.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
  <!-- МагазинГруппыТоваровНаГлавной -->
  
  <xsl:template match="/">
     <xsl:apply-templates select="/shop"/>
  </xsl:template>
  
  <xsl:variable name="n" select="number(3)"/>
  
  <!-- Шаблон для магазина -->
  <xsl:template match="/shop">
     <div class="group_list_m">
           <xsl:apply-templates select="shop_group[position() mod $n = 1]"/>
           <div class="clear"></div>
     </div>
  </xsl:template>
  
  <!-- Шаблон для групп товара -->
  <xsl:template match="shop_group">
     <div class="sub-main">
        <xsl:for-each select=". | following-sibling::shop_group[position() &lt; $n]">
           <div id="group_{@id}" class="group_list_item" data-visible="none">
           </div>
        </xsl:for-each>
    <!-- Если есть подгруппы -->
        <xsl:for-each select="shop_group">
           <div id="sub-level-{position()}" class="sub_group_{position()} sub-level-1">
           </div> 
          </xsl:for-each>
     </div>
  </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
XSLT Преобразование
    #39267889
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

вообще то такие шаблоны как мы с тобой написали не есть хорошие....во-первых на выходе на валидный html получился(но это проблема заказчика - id должен быть уникальным), есть каноническая рекурсия, когда не зависимо от количества вложений - всего один шаблон отрабатывает.
...
Рейтинг: 0 / 0
XSLT Преобразование
    #39267912
Mcross
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Спасибо за ваш ответ!
Всё работает!

Я сам дурак и не уточнил сразу что групп будет больше 3, и нужно чтоб вывод шёл вот так
Код: html
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.
  <div class="sub-main">
      <div id="group_1" class="group_list_item" data-visible="none">
      </div>
      <div id="group_2" class="group_list_item" data-visible="none">
      </div>
      <div id="group_3" class="group_list_item" data-visible="none">
      </div>
      <div id="sub-level-1" class="sub_group_1 sub-level-1">
      </div>  
      <div id="sub-level-1" class="sub_group_2 sub-level-1">
      </div>      
      <div id="sub-level-1" class="sub_group_3 sub-level-1">
      </div>      
   </div>
  <div class="sub-main">
      <div id="group_4 class="group_list_item" data-visible="none">
      </div>
      <div id="group_5" class="group_list_item" data-visible="none">
      </div>
      <div id="group_6" class="group_list_item" data-visible="none">
      </div>
      <div id="sub-level-1" class="sub_group_4 sub-level-1">
      </div>  
      <div id="sub-level-1" class="sub_group_5 sub-level-1">
      </div>      
      <div id="sub-level-1" class="sub_group_6 sub-level-1">
      </div>      
   </div>
......
...
Рейтинг: 0 / 0
XSLT Преобразование
    #39267917
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mcross,

на выходе html не валидный получается у тебя...ID должен быть уникальным а class надо делать одинаковым, у тебя в мультиклассы все разные....я не думаю, что в стилях CSS ты будешь обращаться ко всем разным мультиклассам...
...
Рейтинг: 0 / 0
XSLT Преобразование
    #39267923
Mcross
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фридрих,
HTML дело десятое, там эти id для наглядности и в рабочую версию не попадут.
...
Рейтинг: 0 / 0
XSLT Преобразование
    #39268381
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mcross,

это конечно не мое дело, но я разрабатывал небольшой интернет магазин на файлах без SQL...так вот я не рекомендую тебе делать такой 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.
<?xml version="1.0" encoding="UTF-8"?>
<shop id="Куртки">
  <ware id="0001">
    <articul>1287-4562-5682</articul>
    <name>Товар 1</name>
    <prise>126.99</prise>
  </ware>
  <ware id="0002">
    <articul>1287-4562-5682</articul>
    <name>Товар 1</name>
    <prise>126.99</prise>
  </ware>
  <ware id="0003">
    <articul>1287-4562-5682</articul>
    <name>Товар 1</name>
    <prise>126.99</prise>
  </ware>
  <ware id="0004">
    <articul>1287-4562-5682</articul>
    <name>Товар 1</name>
    <prise>126.99</prise>
  </ware>
  <ware id="0005">
    <articul>1287-4562-5682</articul>
    <name>Товар 1</name>
    <prise>126.99</prise>
  </ware>
</shop>


поверь тебе потом самому будет проще работать, а именно: сортировать, группировать, фильтровать - главное артикул номер разработать правильно и через артикул выводить как угодно....ИМХО
...
Рейтинг: 0 / 0
XSLT Преобразование
    #39268488
Mcross
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фридрих,

Спасибо за совет!

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


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