Guest User

Ran

a guest
Jan 11th, 2017
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
XML 19.51 KB | None | 0 0
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xsl:stylesheet>
  3. <xsl:stylesheet version="1.0"
  4.     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  5.     xmlns:hostcms="http://www.hostcms.ru/"
  6.     exclude-result-prefixes="hostcms">
  7.    
  8.     <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"/>
  9.    
  10.     <!-- СписокЭлементовИнфосистемы -->
  11.    
  12.     <xsl:template match="/">
  13.         <xsl:apply-templates select="/informationsystem"/>
  14.     </xsl:template>
  15.    
  16.     <xsl:variable name="n" select="number(25)"/>
  17.    
  18.     <xsl:template match="/informationsystem">
  19.        
  20.         <!-- Получаем ID родительской группы и записываем в переменную $group -->
  21.         <xsl:variable name="group" select="group"/>
  22.        
  23.         <!-- Если в находимся корне - выводим название информационной системы -->
  24.         <xsl:choose>
  25.             <xsl:when test="$group = 0">
  26.                 <!-- Описание выводится при отсутствии фильтрации по тэгам -->
  27.                 <xsl:if test="count(tag) = 0 and page = 0 and description != ''">
  28.                     <div hostcms:id="{@id}" hostcms:field="description" hostcms:entity="informationsystem" hostcms:type="wysiwyg"><xsl:value-of disable-output-escaping="yes" select="description"/></div>
  29.                 </xsl:if>
  30.             </xsl:when>
  31.             <xsl:otherwise>
  32.                 <xsl:choose>
  33.                     <xsl:when test=".//informationsystem_group[@id=$group]/property_value[tag_name = 'Change_h1' and value != '']/value">
  34.                         <h1><xsl:value-of disable-output-escaping="yes" select=".//informationsystem_group[@id=$group]/property_value[tag_name = 'Change_h1']/value"/></h1>
  35.                     </xsl:when>
  36.                     <xsl:otherwise>
  37.                         <h1><xsl:value-of disable-output-escaping="yes" select=".//informationsystem_group[@id=$group]/name"/></h1>
  38.                     </xsl:otherwise>
  39.                 </xsl:choose>          
  40.            
  41.                 <!--<h1 hostcms:id="{$group}" hostcms:field="name" hostcms:entity="informationsystem_group">
  42.                     <xsl:value-of disable-output-escaping="yes" select=".//informationsystem_group[@id=$group]/name"/> # <xsl:value-of select="/informationsystem/page + 1" disable-output-escaping="yes" />
  43.                 </h1>-->
  44.                
  45.                 <!-- Описание выводим только на первой странице -->
  46.                 <xsl:if test="page = 0 and .//informationsystem_group[@id=$group]/description != ''">
  47.                     <div hostcms:id="{$group}" hostcms:field="description" hostcms:entity="informationsystem_group" hostcms:type="wysiwyg"><xsl:value-of disable-output-escaping="yes" select=".//informationsystem_group[@id=$group]/description"/></div>
  48.                 </xsl:if>
  49.                
  50.                 <!-- Путь к группе -->
  51.                 <p>
  52.                     <xsl:apply-templates select=".//informationsystem_group[@id=$group]" mode="breadCrumbs"/>
  53.                 </p>
  54.             </xsl:otherwise>
  55.         </xsl:choose>
  56.        
  57.         <!-- Обработка выбранных тэгов -->
  58.         <xsl:if test="count(tag)">
  59.         <p class="h2">Метка — <strong><xsl:value-of select="tag/name" disable-output-escaping="yes" /></strong>.</p>
  60.             <xsl:if test="tag/description != ''">
  61.                 <p><xsl:value-of select="tag/description" disable-output-escaping="yes" /></p>
  62.             </xsl:if>
  63.         </xsl:if>
  64.        
  65.         <!-- Отображение подгрупп данной группы, только если подгруппы есть и не идет фильтра по меткам -->
  66.         <xsl:if test="count(tag) = 0 and count(.//informationsystem_group[parent_id=$group]) &gt; 0">
  67.             <div class="group_list">
  68.                 <xsl:apply-templates select=".//informationsystem_group[parent_id=$group][position() mod $n = 1]" mode="groups"/>
  69.             </div>
  70.         </xsl:if>
  71.        
  72.         <!-- Отображение записи информационной системы -->
  73.         <div class="news_list">
  74.             <xsl:apply-templates select="informationsystem_item"/>
  75.         </div>
  76.        
  77.         <!-- Строка ссылок на другие страницы информационной системы -->
  78.         <xsl:if test="ОтображатьСсылкиНаСледующиеСтраницы=1">
  79.             <div>
  80.                 <!-- Ссылка, для которой дописываются суффиксы page-XX/ -->
  81.                 <!-- <xsl:variable name="link">
  82.                     <xsl:value-of select="/informationsystem/url"/>
  83.                     <xsl:if test="$group != 0">
  84.                         <xsl:value-of select="/informationsystem//informationsystem_group[@id = $group]/url"/>
  85.                     </xsl:if>
  86.                 </xsl:variable> -->
  87.                
  88.                 <xsl:if test="total &gt; 0 and limit &gt; 0">
  89.                    
  90.                     <xsl:variable name="count_pages" select="ceiling(total div limit)"/>
  91.                    
  92.                     <xsl:variable name="visible_pages" select="5"/>
  93.                    
  94.                     <xsl:variable name="real_visible_pages"><xsl:choose>
  95.                             <xsl:when test="$count_pages &lt; $visible_pages"><xsl:value-of select="$count_pages"/></xsl:when>
  96.                             <xsl:otherwise><xsl:value-of select="$visible_pages"/></xsl:otherwise>
  97.                     </xsl:choose></xsl:variable>
  98.                    
  99.                     <!-- Считаем количество выводимых ссылок перед текущим элементом -->
  100.                     <xsl:variable name="pre_count_page"><xsl:choose>
  101.                             <xsl:when test="page - (floor($real_visible_pages div 2)) &lt; 0">
  102.                                 <xsl:value-of select="page"/>
  103.                             </xsl:when>
  104.                             <xsl:when test="($count_pages - page - 1) &lt; floor($real_visible_pages div 2)">
  105.                                 <xsl:value-of select="$real_visible_pages - ($count_pages - page - 1) - 1"/>
  106.                             </xsl:when>
  107.                             <xsl:otherwise>
  108.                                 <xsl:choose>
  109.                                     <xsl:when test="round($real_visible_pages div 2) = $real_visible_pages div 2">
  110.                                         <xsl:value-of select="floor($real_visible_pages div 2) - 1"/>
  111.                                     </xsl:when>
  112.                                     <xsl:otherwise>
  113.                                         <xsl:value-of select="floor($real_visible_pages div 2)"/>
  114.                                     </xsl:otherwise>
  115.                                 </xsl:choose>
  116.                             </xsl:otherwise>
  117.                     </xsl:choose></xsl:variable>
  118.                    
  119.                     <!-- Считаем количество выводимых ссылок после текущего элемента -->
  120.                     <xsl:variable name="post_count_page"><xsl:choose>
  121.                             <xsl:when test="0 &gt; page - (floor($real_visible_pages div 2) - 1)">
  122.                                 <xsl:value-of select="$real_visible_pages - page - 1"/>
  123.                             </xsl:when>
  124.                             <xsl:when test="($count_pages - page - 1) &lt; floor($real_visible_pages div 2)">
  125.                                 <xsl:value-of select="$real_visible_pages - $pre_count_page - 1"/>
  126.                             </xsl:when>
  127.                             <xsl:otherwise>
  128.                                 <xsl:value-of select="$real_visible_pages - $pre_count_page - 1"/>
  129.                             </xsl:otherwise>
  130.                     </xsl:choose></xsl:variable>
  131.                    
  132.                     <xsl:variable name="i"><xsl:choose>
  133.                             <xsl:when test="page + 1 = $count_pages"><xsl:value-of select="page - $real_visible_pages + 1"/></xsl:when>
  134.                             <xsl:when test="page - $pre_count_page &gt; 0"><xsl:value-of select="page - $pre_count_page"/></xsl:when>
  135.                             <xsl:otherwise>0</xsl:otherwise>
  136.                     </xsl:choose></xsl:variable>
  137.                    
  138.                     <p>
  139.                         <xsl:call-template name="for">
  140.                             <xsl:with-param name="limit" select="limit"/>
  141.                             <xsl:with-param name="page" select="page"/>
  142.                             <xsl:with-param name="items_count" select="total"/>
  143.                             <xsl:with-param name="i" select="$i"/>
  144.                             <xsl:with-param name="post_count_page" select="$post_count_page"/>
  145.                             <xsl:with-param name="pre_count_page" select="$pre_count_page"/>
  146.                             <xsl:with-param name="visible_pages" select="$real_visible_pages"/>
  147.                         </xsl:call-template>
  148.                     </p>
  149.                     <div style="clear: both"></div>
  150.                 </xsl:if>
  151.             </div>
  152.         </xsl:if>
  153.        
  154.         <xsl:if test="count(informationsystem_group_properties) and group != 0">
  155.             <div style="margin: 10px 0px;">
  156.                 <h2>Атрибуты группы инфоэлементов</h2>
  157.                
  158.                 <xsl:if test="count(informationsystem_group[@id = //group]/property[parent_id = 0])">
  159.                     <table border="0">
  160.                         <xsl:apply-templates select="informationsystem_group[@id = //group]/property[parent_id = 0]"/>
  161.                     </table>
  162.                 </xsl:if>
  163.                
  164.                 <xsl:apply-templates select="informationsystem_group_properties"/>
  165.             </div>
  166.         </xsl:if>
  167.        
  168.         <div style="clear: both"></div>
  169.        
  170.         <!-- Rss -->
  171.        
  172.     </xsl:template>
  173.    
  174.     <!-- Вывод строки со значением свойства -->
  175.     <xsl:template match="property">
  176.         <tr>
  177.             <td style="padding: 5px" bgcolor="#eeeeee">
  178.                 <b><xsl:value-of select="name"/></b>
  179.             </td>
  180.             <td style="padding: 5px" bgcolor="#eeeeee">
  181.                 <xsl:choose>
  182.                     <xsl:when test="type = 1">
  183.                         <a href="{file_path}">Скачать файл</a>
  184.                     </xsl:when>
  185.                     <xsl:when test="type = 7">
  186.                         <xsl:choose>
  187.                             <xsl:when test="value = 1">
  188.                                 <input type="checkbox" checked="" disabled="" />
  189.                             </xsl:when>
  190.                             <xsl:otherwise>
  191.                                 <input type="checkbox" disabled="" />
  192.                             </xsl:otherwise>
  193.                         </xsl:choose>
  194.                     </xsl:when>
  195.                     <xsl:otherwise>
  196.                         <xsl:value-of disable-output-escaping="yes" select="value"/>
  197.                     </xsl:otherwise>
  198.                 </xsl:choose>
  199.             </td>
  200.         </tr>
  201.     </xsl:template>
  202.    
  203.     <!-- Шаблон выводит рекурсивно ссылки на группы инф. элемента -->
  204.     <xsl:template match="informationsystem_group" mode="breadCrumbs">
  205.     </xsl:template>
  206.    
  207.     <!-- Шаблон выводит группы свойств для группы инфосистемы -->
  208.     <xsl:template match="informationsystem_group_properties">
  209.        
  210.     <p><b><xsl:value-of select="information_propertys_groups_dir_name"/></b></p>
  211.        
  212.         <xsl:variable name="dir_id" select="@id"/>
  213.        
  214.         <xsl:if test="count(//informationsystem_group[@id = //group]/property[parent_id = $dir_id])">
  215.             <table border="0">
  216.                 <xsl:apply-templates select="//informationsystem_group[@id = //group]/property[parent_id = $dir_id]"/>
  217.             </table>
  218.         </xsl:if>
  219.        
  220.         <xsl:if test="count(informationsystem_group_properties)">
  221.             <blockquote>
  222.                 <xsl:apply-templates select="informationsystem_group_properties"/>
  223.             </blockquote>
  224.         </xsl:if>
  225.     </xsl:template>
  226.    
  227.     <!-- Шаблон выводит ссылки подгруппы информационного элемента -->
  228.     <xsl:template match="informationsystem_group" mode="groups">
  229.         <ul>
  230.             <xsl:for-each select=". | following-sibling::informationsystem_group[position() &lt; $n]">
  231.                 <li>
  232.                     <xsl:if test="image_small!=''">
  233.                         <a href="{url}" target="_blank">
  234.                             <img src="{dir}{image_small}" align="middle"/>
  235.                 </a><xsl:text> </xsl:text></xsl:if>
  236.             <a href="{url}"><xsl:value-of disable-output-escaping="yes" select="name"/></a><xsl:text> </xsl:text><span class="count">(<xsl:value-of select="items_total_count"/>)</span>
  237.                 </li>
  238.             </xsl:for-each>
  239.         </ul>
  240.     </xsl:template>
  241.    
  242.     <!-- Шаблон вывода информационного элемента -->
  243.     <xsl:template match="informationsystem_item">
  244.        
  245.         <!-- Дата время -->
  246.        
  247.        
  248.         <div class="stroka">
  249.             <a href="{url}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="informationsystem_item">
  250.                 <xsl:value-of disable-output-escaping="yes" select="name"/>
  251.             </a>
  252.            
  253.             <!-- Изображение для информационного элемента (если есть) -->
  254.             <xsl:if test="image_small!=''">
  255.                 <a href="{url}" class="news_title">
  256.                     <img src="{dir}{image_small}" class="news_img" alt="" align="left"/>
  257.                 </a>
  258.             </xsl:if>
  259.            
  260.             <xsl:if test="description != ''">
  261.                 <div hostcms:id="{@id}" hostcms:field="description" hostcms:entity="informationsystem_item" hostcms:type="wysiwyg"><xsl:value-of disable-output-escaping="yes" select="description"/></div>
  262.             </xsl:if>
  263.         </div>
  264.        
  265.         <xsl:if test="count(tag) &gt; 0 or count(comment) &gt; 0 or count(siteuser) &gt; 0">
  266.             <dd class="tags" style="text-indent:0">
  267.                 <xsl:if test="count(tag) &gt; 0">
  268.                     <img src="/images/tag.png" /><span><xsl:apply-templates select="tag"/></span>
  269.                 </xsl:if>
  270.                
  271.                 <xsl:if test="count(siteuser) &gt; 0">
  272.                 <img src="/images/user.png" /><span><a href="/users/info/{siteuser/login}/"><xsl:value-of select="siteuser/login"/></a></span>
  273.                 </xsl:if>
  274.                
  275.                 <xsl:if test="count(comment) &gt; 0">
  276.                     <img src="/images/comment.png" alt="Есть комментарии" />
  277.                     <span><a href="{url}#comments">
  278.                             <xsl:value-of select="comments_count"/><xsl:text> </xsl:text>
  279.                             <xsl:call-template name="declension"> <xsl:with-param name="number" select="comments_count"/>
  280.                     </xsl:call-template></a></span>
  281.                 </xsl:if>
  282.             </dd>
  283.         </xsl:if>
  284.        
  285.         <div>
  286.             <div class="clear"></div>
  287.             <hr /></div>
  288.        
  289.     </xsl:template>
  290.    
  291.     <!-- /// Метки для информационного элемента /// -->
  292.     <xsl:template match="tag">
  293.         <a href="{/informationsystem/url}tag/{urlencode}/" class="tag">
  294.             <xsl:value-of select="name"/>
  295.         </a>
  296. <xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if></xsl:template>
  297.    
  298.     <!-- Цикл для вывода строк ссылок -->
  299.     <xsl:template name="for">
  300.        
  301.         <xsl:param name="limit"/>
  302.         <xsl:param name="page"/>
  303.         <xsl:param name="pre_count_page"/>
  304.         <xsl:param name="post_count_page"/>
  305.         <xsl:param name="i" select="0"/>
  306.         <xsl:param name="items_count"/>
  307.         <xsl:param name="visible_pages"/>
  308.        
  309.         <xsl:variable name="n" select="ceiling($items_count div $limit)"/>
  310.        
  311.         <xsl:variable name="start_page"><xsl:choose>
  312.                 <xsl:when test="$page + 1 = $n"><xsl:value-of select="$page - $visible_pages + 1"/></xsl:when>
  313.                 <xsl:when test="$page - $pre_count_page &gt; 0"><xsl:value-of select="$page - $pre_count_page"/></xsl:when>
  314.                 <xsl:otherwise>0</xsl:otherwise>
  315.         </xsl:choose></xsl:variable>
  316.        
  317.         <xsl:if test="$i = $start_page and $page != 0">
  318.             <span class="ctrl">
  319.                 ← Назад
  320.             </span>
  321.         </xsl:if>
  322.        
  323.         <xsl:if test="$i = ($page + $post_count_page + 1) and $n != ($page+1)">
  324.             <span class="ctrl">
  325.                 Вперед →
  326.             </span>
  327.         </xsl:if>
  328.        
  329.         <xsl:if test="$items_count &gt; $limit and ($page + $post_count_page + 1) &gt; $i">
  330.             <!-- Заносим в переменную $group идентификатор текущей группы -->
  331.             <xsl:variable name="group" select="/informationsystem/group"/>
  332.            
  333.             <!-- Путь для тэга -->
  334.             <xsl:variable name="tag_path">
  335.                 <xsl:choose>
  336.                     <!-- Если не нулевой уровень -->
  337.                     <xsl:when test="count(/informationsystem/tag) != 0">tag/<xsl:value-of select="/informationsystem/tag/urlencode"/>/</xsl:when>
  338.                     <!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
  339.                     <xsl:otherwise></xsl:otherwise>
  340.                 </xsl:choose>
  341.             </xsl:variable>
  342.            
  343.             <!-- Определяем группу для формирования адреса ссылки -->
  344.             <xsl:variable name="group_link">
  345.                 <xsl:choose>
  346.                     <!-- Если группа не корневая (!=0) -->
  347.                     <xsl:when test="$group != 0">
  348.                         <xsl:value-of select="/informationsystem//informationsystem_group[@id=$group]/url"/>
  349.                     </xsl:when>
  350.                     <!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
  351.                     <xsl:otherwise><xsl:value-of select="/informationsystem/url"/></xsl:otherwise>
  352.                 </xsl:choose>
  353.             </xsl:variable>
  354.            
  355.             <!-- Определяем адрес ссылки -->
  356.             <xsl:variable name="number_link">
  357.                 <xsl:choose>
  358.                     <!-- Если не нулевой уровень -->
  359.                     <xsl:when test="$i != 0">page-<xsl:value-of select="$i + 1"/>/</xsl:when>
  360.                     <!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
  361.                     <xsl:otherwise></xsl:otherwise>
  362.                 </xsl:choose>
  363.             </xsl:variable>
  364.            
  365.             <!-- Выводим ссылку на первую страницу -->
  366.             <xsl:if test="$page - $pre_count_page &gt; 0 and $i = $start_page">
  367.                 <a href="{$group_link}{$tag_path}" class="page_link" style="text-decoration: none;">←</a>
  368.             </xsl:if>
  369.            
  370.             <!-- Ставим ссылку на страницу-->
  371.             <xsl:if test="$i != $page">
  372.                 <xsl:if test="($page - $pre_count_page) &lt;= $i and $i &lt; $n">
  373.                     <!-- Выводим ссылки на видимые страницы -->
  374.                     <a href="{$group_link}{$number_link}{$tag_path}" class="page_link">
  375.                         <xsl:value-of select="$i + 1"/>
  376.                     </a>
  377.                 </xsl:if>
  378.                
  379.                 <!-- Выводим ссылку на последнюю страницу -->
  380.                 <xsl:if test="$i+1 &gt;= ($page + $post_count_page + 1) and $n &gt; ($page + 1 + $post_count_page)">
  381.                     <!-- Выводим ссылку на последнюю страницу -->
  382.                     <a href="{$group_link}page-{$n}/{$tag_path}" class="page_link" style="text-decoration: none;">→</a>
  383.                 </xsl:if>
  384.             </xsl:if>
  385.            
  386.             <!-- Ссылка на предыдущую страницу для Ctrl + влево -->
  387.             <xsl:if test="$page != 0 and $i = $page">
  388.                 <xsl:variable name="prev_number_link">
  389.                     <xsl:choose>
  390.                         <!-- Если не нулевой уровень -->
  391.                         <xsl:when test="($page) != 0">page-<xsl:value-of select="$i"/>/</xsl:when>
  392.                         <!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
  393.                         <xsl:otherwise></xsl:otherwise>
  394.                     </xsl:choose>
  395.                 </xsl:variable>
  396.                
  397.                
  398.             </xsl:if>
  399.            
  400.             <!-- Ссылка на следующую страницу для Ctrl + вправо -->
  401.            
  402.            
  403.             <!-- Не ставим ссылку на страницу-->
  404.             <xsl:if test="$i = $page">
  405.                 <span class="current">
  406.                     <xsl:value-of select="$i+1"/>
  407.                 </span>
  408.             </xsl:if>
  409.            
  410.             <!-- Рекурсивный вызов шаблона. НЕОБХОДИМО ПЕРЕДАВАТЬ ВСЕ НЕОБХОДИМЫЕ ПАРАМЕТРЫ! -->
  411.             <xsl:call-template name="for">
  412.                 <xsl:with-param name="i" select="$i + 1"/>
  413.                 <xsl:with-param name="limit" select="$limit"/>
  414.                 <xsl:with-param name="page" select="$page"/>
  415.                 <xsl:with-param name="items_count" select="$items_count"/>
  416.                 <xsl:with-param name="pre_count_page" select="$pre_count_page"/>
  417.                 <xsl:with-param name="post_count_page" select="$post_count_page"/>
  418.                 <xsl:with-param name="visible_pages" select="$visible_pages"/>
  419.             </xsl:call-template>
  420.         </xsl:if>
  421.     </xsl:template>
  422.    
  423.     <!-- Склонение после числительных -->
  424.     <xsl:template name="declension">
  425.        
  426.         <xsl:param name="number" select="number"/>
  427.        
  428.         <!-- Именительный падеж -->
  429.         <xsl:variable name="nominative">
  430.             <xsl:text>комментарий</xsl:text>
  431.         </xsl:variable>
  432.        
  433.         <!-- Родительный падеж, единственное число -->
  434.         <xsl:variable name="genitive_singular">
  435.             <xsl:text>комментария</xsl:text>
  436.         </xsl:variable>
  437.        
  438.        
  439.         <xsl:variable name="genitive_plural">
  440.             <xsl:text>комментариев</xsl:text>
  441.         </xsl:variable>
  442.        
  443.         <xsl:variable name="last_digit">
  444.             <xsl:value-of select="$number mod 10"/>
  445.         </xsl:variable>
  446.        
  447.         <xsl:variable name="last_two_digits">
  448.             <xsl:value-of select="$number mod 100"/>
  449.         </xsl:variable>
  450.        
  451.         <xsl:choose>
  452.             <xsl:when test="$last_digit = 1 and $last_two_digits != 11">
  453.                 <xsl:value-of select="$nominative"/>
  454.             </xsl:when>
  455.             <xsl:when test="$last_digit = 2 and $last_two_digits != 12
  456.                 or $last_digit = 3 and $last_two_digits != 13
  457.                 or $last_digit = 4 and $last_two_digits != 14">
  458.                 <xsl:value-of select="$genitive_singular"/>
  459.             </xsl:when>
  460.             <xsl:otherwise>
  461.                 <xsl:value-of select="$genitive_plural"/>
  462.             </xsl:otherwise>
  463.         </xsl:choose>
  464.     </xsl:template>
  465. </xsl:stylesheet>
Advertisement
Add Comment
Please, Sign In to add comment