XSL / РАЗНЫЕ МЕЛОЧИ В XSL

Заметка создана: 24 января 2035 г.

Разное

<img src="{dir}{image_large}" alt="{name}" width="{image_large_width}" height="{image_large_height}" /> 
<xsl:variable name="var_compare_id" select="."/>
<xsl:text disable-output-escaping="yes" select="."> </xsl:text>
<xsl:text> </xsl:text>
<xsl:value-of disable-output-escaping="yes" select="property_value[tag_name='short_name']/value" />
<xsl:if test="description !=''">
  <xsl:value-of disable-output-escaping="yes" select="description" />
</xsl:if>
<xsl:if test="position() mod 3 = 0 and position() != last()">
  <xsl:text disable-output-escaping="yes">
  &lt;/tr&gt;
  &lt;tr valign="top"&gt;
  </xsl:text>
</xsl:if>

<xsl:if test="property_value[tag_name='link']/value !=''">
   <xsl:value-of disable-output-escaping="yes" select="property_value[tag_name='link']/value" />
</xsl:if>

Дополнительное свойство - ссылка

property_value[tag_name='link']/value !=''

<xsl:if test="property_value[tag_name='link']/value !=''">
   <xsl:value-of disable-output-escaping="yes" select="property_value[tag_name='link']/value" />
</xsl:if>

<xsl:if test="property_value[tag_name='link']/value !=''">
<a href="{property_value[tag_name='link']/value}" target="_parent" >
  <img src="{dir}{image_small}" alt="{name}"/>
</a>
</xsl:if>

<xsl:if test="property_value[tag_name='short_name']/value !=''">
   <xsl:value-of disable-output-escaping="yes" select="property_value[tag_name='short_name']/value" />
</xsl:if>

Дополнительное свойство - изображение

<xsl:if test="property_value[tag_name='img']/file !=''">
<a href="{property_value[tag_name='img']/file}">
  <img src="{dir}{property_value[tag_name='img']/file}" alt="{name}"
width="{property_value[tag_name='img']/file_width}" height="{property_value[tag_name='img']/file_height}"/>
</a>
</xsl:if>

Ограничение количества групп в выпадающем меню

<!-- Если есть подгруппы -->
<xsl:if test="count(shop_group) > 0 and 1 > count(ancestor::shop_group)">
<ul class="left_menu gray_link gray" id="{@id}" style="display: none;">
<xsl:apply-templates select="shop_group"/>
</ul>
</xsl:if>

Выбираем последний элемент списка и назначаем ему класс last

<xsl:if test="position() mod 4 = 0 and position() > 3">
<xsl:attribute name="class">last</xsl:attribute>
</xsl:if>

Выбираем первый элемент списка и назначаем ему класс first

<xsl:if test="position() mod 1 = 0 and position() < 2">
<xsl:attribute name="class">first</xsl:attribute>
</xsl:if>

Ссылка на все товары производителя в карточке товара

<xsl:if test="shop_producer/node()">
<xsl:variable name="shop_produser_id" select="shop_producer/@id" />
<a href="{/shop/url}producer-{$shop_produser_id}" class="button">Другие товары этого производителя</a>
</xsl:if>

Ограничиваем текст по количеству знаков

<xsl:variable name="myConcatString" select="description"/>
<xsl:value-of disable-output-escaping="yes" select="substring($myConcatString, 1, 800)" /><xsl:text>...</xsl:text>

Вставляем код JAVASCRIPT в XSL

<SCRIPT>
<xsl:comment>
<xsl:text disable-output-escaping="yes">
<![CDATA[
.........код скрипта......................
]]>
</xsl:text>
</xsl:comment>
</SCRIPT>        

Шаблон для условия

      <xsl:choose>
<xsl:when test="">
...
</xsl:when>
<xsl:otherwise>
...
</xsl:otherwise>
</xsl:choose>

Если нет изображения, то скрываем блок на boostrap 5

<div class="d-none">
<xsl:if test="image_small != ''">
<xsl:attribute name="class">col-xs-3 col-sm-3 col-md-3 col-lg-3</xsl:attribute>
</xsl:if>
<xsl:if test="image_small != ''">
<div>
<a href="{url}">
<img src="{dir}{image_small}" alt="{name}"/>
</a>
</div>
</xsl:if>

Меняем адрес ссылки, если есть Дополнительное свойство - Ссылка на материал

<xsl:variable name="link">
<xsl:choose>
<xsl:when test="property_value[tag_name='link']/value !=''">
<xsl:value-of disable-output-escaping="yes" select="property_value[tag_name='link']/value" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="url" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="property_value[tag_name='link']/value !=''">
<a href="{property_value[tag_name='link']/value}" >
<img src="{dir}{image_small}" class="news_img" alt="" />
</a>
</xsl:when>
<xsl:otherwise>
<img src="{dir}{image_small}" class="news_img" alt="" />
</xsl:otherwise>
</xsl:choose>

Определяем позицию
Добавляем атрибут

<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="position() mod 2 = 0">right</xsl:when>
<xsl:otherwise>left</xsl:otherwise>
</xsl:choose>
</xsl:attribute>

Последний элемент строки

<xsl:if test="position() = last()">
<xsl:attribute name="style">background-image: none</xsl:attribute>
</xsl:if>
<xsl:if test="position() = last()">
<xsl:attribute name="class">last</xsl:attribute>
</xsl:if>

Для меню

<xsl:variable name="position">
<xsl:choose>
<xsl:when test="$count div position() <= 1">4</xsl:when>
<xsl:otherwise>3</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="position() mod $floor = 0 and position() != last()">
<xsl:text disable-output-escaping="yes">
</ul>
<ul>
</xsl:text>
</xsl:if>

Перевод строки после n-элемента

<xsl:if test="position() mod 4 = 0 and position() != last()">
<xsl:text disable-output-escaping="yes">
</ul>
<ul class="shop_table">
</xsl:text>
</xsl:if>
<xsl:if test="position() mod 3 = 0 and position() != last()">
<span class="table_row"></span>
</xsl:if>
<xsl:if test="position() mod 3 = 0 and position() != last()">
<xsl:attribute name="style">background-image: none</xsl:attribute>
</xsl:if>

В списках

<!-- Перевод строки после каждого 2-го элемента -->
<xsl:if test="((position() - 2) mod 2 = 0) and position() != last()">
<xsl:text disable-output-escaping="yes">
</div>
<div class="wrapper">
</xsl:text>
</xsl:if>

В таблице

<xsl:template match="shop_item">
<td>
.............
</td>
<xsl:if test="position() mod 3 = 0">
<xsl:text disable-output-escaping="yes"></tr><tr></xsl:text>
</xsl:if>
</xsl:template>
<div id="gallery" class="board" style="max-width: {$image_width + 50}px">

Вывод сообщение "В данном разделе магазина товаров нет", если раздел пустой

<xsl:if test="count(shop_item) = 0 and .//shop_group[@id=$group]/items_total_count = 0" >В данном разделе
товаров нет</xsl:if>

Вставляем значение дополнительного свойства в ссылку для изображения

<!-- Изображение для информационного элемента (если есть) -->
<xsl:choose>
<xsl:when test="property_value[tag_name='url']/value != ''">
<a href="{property_value[tag_name = 'url']/value}" target="_parent">
<img src="{dir}{image_small}" align="left"/>
</a>
</xsl:when>
<xsl:otherwise>
<img src="{dir}{image_small}" align="left"/>
</xsl:otherwise>
</xsl:choose>

Выводим массив дополнительных свойств - изображения (file)

<xsl:if test="property_value[tag_name='img']/file != ''">
<ul>
<xsl:for-each select="property_value[tag_name='img']">
<li><a href="{../dir}{file}" ><img src="{../dir}{file_small}" alt="{name}" /></a></li>
</xsl:for-each>
</ul>
</xsl:if>
<xsl:for-each select="property_value[tag_name='dopfoto']">
<a href="{../dir}{file}" target="_blank"><img src="{../dir}{file_small}" /></a>
</xsl:for-each>

Вставляем дату и время в XSL шаблон 

<dt>
<xsl:value-of select="substring-before(date, '.')"/>
<xsl:variable name="month_year" select="substring-after(date, '.')"/>
<xsl:variable name="month" select="substring-before($month_year, '.')"/>
<xsl:choose>
<xsl:when test="$month = 1"> января </xsl:when>
<xsl:when test="$month = 2"> февраля </xsl:when>
<xsl:when test="$month = 3"> марта </xsl:when>
<xsl:when test="$month = 4"> апреля </xsl:when>
<xsl:when test="$month = 5"> мая </xsl:when>
<xsl:when test="$month = 6"> июня </xsl:when>
<xsl:when test="$month = 7"> июля </xsl:when>
<xsl:when test="$month = 8"> августа </xsl:when>
<xsl:when test="$month = 9"> сентября </xsl:when>
<xsl:when test="$month = 10"> октября </xsl:when>
<xsl:when test="$month = 11"> ноября </xsl:when>
<xsl:otherwise> декабря </xsl:otherwise>
</xsl:choose>
<xsl:value-of select="substring-after($month_year, '.')"/><xsl:text> г.</xsl:text>
</dt>

Заменяем запятую на точку в цене (каталог товаров)

В самом начале шаблона вывода товаров определяем формат вывода
имеется 

<xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>
добавляем
<xsl:decimal-format name="my1" decimal-separator="." grouping-separator=" "/>

в выводе цены вставляем код

<xsl:value-of select="format-number(price, '### ##0.00', 'my1')"/>

Откладываем в корзину минимальное количество товара по умолчанию

1. Создаем Допсвойство "Минимальное количество" min_quantity, тип строка.
  В карточке товара в Допсвойстве "Минимальное количество" указываем минимальное количество для заказа, например, 10шт.

2. В XSL-шаблоне "ИнтернетМагазинКаталогТоваров" или "ИнтернетМагазинТовар" создаем переменную quantum, которая из Допсвойства min_quantity выделяет только числа

  

3. Вставляем значение переменной $quantum в скрипт кнопки "В корзину"

ПРИМЕР
<div class="actions">
<xsl:variable name="string" select="property_value[tag_name='min_quantity']/value"/>
<!-- Выделяем из строки числа -->
<xsl:variable name="quantum" select="translate($string, translate($string,'0123456789,',''),'')" />
<a data-animation="fadeAndPop" data-reveal-id="modalCart" id="add_to_cart_{@id}" href="#">
<button class="button btn-cart" onclick="return $.bootstrapAddIntoCart('{/shop/url}cart/', {@id}, {$quantum}); yaCounter31644173.reachGoal('addtocart'); return true;" title="В корзину" type="button">
<i class="fa fa-shopping-cart bg-color5">
<b></b>
</i>
<span class="bg-color3"><span>В корзину</span></span>
</button>
</a>
</div>

Обработка даты - приведение к числу для последующего сравнения с другой датой

<xsl:variable name="datetime" select="datetime" />
<xsl:value-of select="concat(substring($datetime, 7, 4), substring($datetime, 4, 2), substring($datetime, 1, 2), substring($datetime, 12, 2), substring($datetime, 15, 2), substring($datetime, 18, 2) )" disable-output-escaping="yes" />

Пересобираем URL (удаление первых трех символов)


<xsl:variable name="url">
<xsl:for-each select="url">
<xsl:variable name="link">
<xsl:value-of select="."/>
</xsl:variable>
<xsl:value-of select='substring($link, 4, string-length($link) - 1)'/>
</xsl:for-each>
</xsl:variable>
<a href="/en{$url}">... </a>

Меняем формат вывода даты


<div class="date">
<xsl:variable name="month_year" select="substring-after(date, '.')"/>
<xsl:variable name="month" select="substring-before($month_year, '.')"/>
<xsl:variable name="time1" select="substring-after(datetime, ' ')"/>
<xsl:variable name="time2" select="substring-after($time1, ':')"/>
<xsl:variable name="hour" select="substring-before($time1, ':')"/>
<xsl:variable name="minutes" select="substring-before($time2, ':')"/>
<span><xsl:value-of select="substring-before(date, '.')"/>.<xsl:value-of select="$month"/> / <xsl:value-of select="$hour"/>:<xsl:value-of select="$minutes"/></span>
</div>

СОРТИРОВКА ТОВАРОВ ОТ МИНИМАЛЬНОЙ ЦЕНЫ ПО УМОЛЧАНИЮ



В XSL-шаблоне МагазинКаталогТоваров заменяем код          
<!--===== Выводим товары магазина =====-->
<div class="row products-grid">
<xsl:apply-templates select="shop_item"/>
</div>
на этот
<!--===== Выводим товары магазина =====-->
<div class="row products-grid">
<xsl:apply-templates select="shop_item">
<xsl:sort select="price" order="ascending" data-type="number"/>
</xsl:apply-templates>
</div>
 
Для сортировки товаров по умолчанию от максимальной цены заменить ascending на descending
Сортировка Допсвойств по id 
<xsl:apply-templates select="property_value[not(file/node())]">
<xsl:sort select="property_id" order="ascending" data-type="number"/>
</xsl:apply-templates>

Случайный вывод элементов


<xsl:template match="/">
<xsl:for-each select="shop_item">
<xsl:value-of select="generate-id()"/> <br/>
</xsl:for-each>
</xsl:template>

Выводим надпись "НОВИНКА" для товаров, загруженных за последние 30 дней


<xsl:variable name="сurrent_date" select="/shop/сurrent_date"/>
<xsl:variable name="date" select="translate(date, translate(date, '0123456789', ''), '')"/>
<xsl:variable name="difference_date" select="$сurrent_date - $date" />
<xsl:if test="number($difference_date) < 30">
<div class="ribbon-wrapper-new">НОВИНКА</div>
</xsl:if>

Предварительно добавляем в ТДС Интернет-магазина вывод текущей даты
Текущая дата в Каталоге товаров

Меняем высоту блока, в зависимости от размера файла изображения из Допсвойства


<div id="sub-menu" class="dropdown-menu">

<xsl:if test="property_value[tag_name='img']/file !=''">
<xsl:attribute name="style">height:<xsl:value-of disable-output-escaping="yes" select="20+(property_value[tag_name='img']/file/@height)" />px</xsl:attribute>
// добавляем к высоте картинки 20px, если нужно, изменить параметр
</xsl:if>
.........
</div>
XSL