UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: sam от 03 Ноября 2014, 17:03:02

Название: Объекты каталога - характеристики коротко
Отправлено: sam от 03 Ноября 2014, 17:03:02
Здравствуйте! У меня такой вопрос: как можно в объектах каталога вывести, например, 5 строк (tr) из характеристик товара через XSLT, т.е. без JS (правда, варианта с JS тож нет у меня)?

Заранее спасибо!
Название: Re:Объекты каталога - характеристики коротко
Отправлено: admin от 07 Ноября 2014, 21:11:35
То есть, вы выводите характеристики, каждая характеристика формирует tr элемент и характеристик может быть больше чем 5?
Название: Re:Объекты каталога - характеристики коротко
Отправлено: sam от 07 Ноября 2014, 21:39:50
Перефразирую свой вопрос с пояснениями:
Реализовал страницу объекта в каталоге со вкладками с помощью css и html, без использования какого-либо скрипта (вкладки: описание/характеристики и комментарии). В каждой вкладке вывожу соответствующую информацию (вызываю через xsl-вызов). Так вот, во вкладке "описание" кроме самого описания хочу вывести еще часть характеристик (примерно 5-6 строк). А вот как это реализовать понятия не имею. Характеристики (полные) вызываются следующим вызовом:

<xsl:apply-templates select=".//group[@name = '&group-parameter;']" mode="table" />

Как-то можно ведь сделать так, чтобы выводились не все строки из характеристик во вкладке "описание", а как и писал выше, всего первые 5-6 строк (tr)? Полные характеристики вывожу во вкладке "характеристики" вызовом выше.
Название: Re:Объекты каталога - характеристики коротко
Отправлено: admin от 08 Ноября 2014, 01:00:33
чтобы вывести часть  характеристик

выпишете
<xsl:apply-templates select=".//group[@name = '&group-parameter;']" mode="table_short" />

и добавляете шаблон
<xsl:template match="group" mode="table_short">
<table class="object">
<thead>
<tr>
<th colspan="2">
<xsl:value-of select="concat(title, ':')" />
</th>
</tr>
</thead>
<tbody umi:element-id="{../../@id}">
<xsl:apply-templates select="property[position() &lt; 6]" mode="table" />
</tbody>
</table>
</xsl:template>

соответственно, выводится будут только первые 5 property
Название: Re:Объекты каталога - характеристики коротко
Отправлено: sam от 08 Ноября 2014, 01:46:47
Спасибо! XSLT само волшебство, а Вы волшебник, который взмахом волшебной палочки воплощает всё в реальность.

А можно ведь выводить еще определенные строчки из характеристик, т.е. не первые 5, а например, 1-я 3-я 6-я 10-я и т.д., чтобы выводить основные характеристики?
Название: Re:Объекты каталога - характеристики коротко
Отправлено: admin от 08 Ноября 2014, 04:56:02
тут нет волшебства, только код.

да, можно привязыватся и к порядку. Например? вывод каждого четногоproperty
<xsl:apply-templates select="property[position() mod 2 = 0]" mode="table" />
Название: Re:Объекты каталога - характеристики коротко
Отправлено: sam от 08 Ноября 2014, 16:11:48
За четные и нечетные спасибо! А как на счет определенных строк - любая строка из списка, например, 1-я, 2-я, 5-я и т.д., т.е. любая строка на выбор?
Название: Re:Объекты каталога - характеристики коротко
Отправлено: admin от 08 Ноября 2014, 17:45:47
[position() = 4]

P.S. почитайте в википедии или в интернете про xpath, многие вопросы прояснятся
Название: Re:Объекты каталога - характеристики коротко
Отправлено: sam от 08 Ноября 2014, 22:43:16
Спасибо! Теперь понятно - сделал так:

<xsl:apply-templates select="property[position() = 5]" mode="table" />
<xsl:apply-templates select="property[position() = 6]" mode="table" />
<xsl:apply-templates select="property[position() = 7]" mode="table" />
<xsl:apply-templates select="property[position() = 11]" mode="table" />
<xsl:apply-templates select="property[position() = 12]" mode="table" />

Главное, что так я могу вызвать любую строку из таблицы.
Название: Re:Объекты каталога - характеристики коротко
Отправлено: sam от 11 Ноября 2014, 23:25:26
admin помог мне, и я решил в долгу не оставаться - поделюсь личным опытом:
вариант, который я описал выше и думал, что решает мою задачу, оказался отнюдь не верным решением. А всё потому, что  через property[position() = номер] когда делаешь вызовы, в разных категориях вызываются разные строки, т.е. категорий несколько, и характеристики у них разные, и содержимое этих характеристик тоже отличаются, соответственно таким вызовом везде получается всё неправильно. Другими словами, содержимое шаблона table_short подгоняешь под одну категорию, а в других категориях уже получается не совсем то, что надо.

Как я решил эту задачу? Всё очень просто - строки надо вызывать не по номеру позиции, а по названию (//property[@name = 'name']), т.е так, как ниже:

<xsl:apply-templates select="//property[@name = 'property_name']" mode="table" />

При таком вызове можно вызывать любую строку из любой категории в любом количестве, т.е., например, категория "ноутбуки" - вызываешь необходимые краткие характеристики; "смартфоны" - точно также, вызываешь свои характеристики; и т.д., и все эти строки в одном файле. Если какие-то строки совпадают в категориях, они выводятся в них, а если чего-то нет, то и выводиться эта строка не будет.