Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > XML, XSL, XSLT > XSLT Преобразование


Автор: Mcross 05.07.16, 07:02
Приветствую!
Имеется XML
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <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>


И XSL шаблон
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?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:template match="shop_group" mode="subgroup-2">
          <div class="sub_li_list-2">
             <xsl:if test="position() != 1">
                <xsl:attribute name="class">sub_li_list-2 bordered-top</xsl:attribute>
             </xsl:if>        
             <!-- Если есть подгруппы -->
             <xsl:if test="shop_group">
                <!-- выводим подгруппы 3 уровня -->
                <xsl:if test="count(ancestor::*) < 3">
                   <div class="sub_group_list_2">
                      <xsl:apply-templates select="shop_group" mode="subgroup-2"/>
                   </div>
                </xsl:if>
             </xsl:if>
          </div>
       </xsl:template>
    </xsl:stylesheet>


Который преобразует это все в
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <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>


Теперь суть вопроса, необходимо выводить сначала группы, а после них их подгруппы.
в таком виде :
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
       <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>


Подскажите пожалуйста, как это сделать?

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)