Пэйджинг объектов, которые фильтруются с помощью usel на XSLT
Задача
Сделать разбивку на страницы объектов, которые фильтруются с помощью usel.
Идея решения
Будем использовать тэг <limit> и макрос %system numpages()%.
Решение
1. В usel-запросе необходимо описать условие аналогичное следующему:
<limit page="{1}">5</limit>
где {1} - это номер страницы, который будет передаваться, а 5 - количество объектов на странице.
2. Опишим параметр, который будет передавать номер страницы. Его описание должно быть до тэга <xsl:template match="/">
<xsl:param name="p" />
3. Для использования макроса %system numpages()% нам необходимо знать общее количество товаров, которые отобраны с помощью usel-запроса. Запишем данное число в переменную:
<xsl:variable name="total" select="document('usel://test')/udata/total"/>
Это выражение необходимо описывать в самом начале шаблона.
4. В нужном месте опишем пэйджинг с помощью следующего выражения:
<xsl:apply-templates select="document(concat('udata://system/numpages/', $total, '/5'))/udata/items" mode="page"/>
где 5 - кол-во товаров на странице.
5. Напишем шаблон для обработки пэйджинга:
<xsl:template match="items/item" mode="page"> <a href="{@link}"><xsl:value-of select="."/></a> </xsl:template>
6. Опишем вызов usel-запроса и передадим в него значение страницы:
<xsl:apply-templates select="document(concat('usel://test/', $p, '/'))/udata"/>
7. Осталось вывести объекты отобранные с помощью usel-запроса. Например, если это объекты каталога, то можно сделать так:
<xsl:template match="udata" mode="test"> <xsl:apply-templates select="item" mode="test"/> </xsl:template> <xsl:template match="udata/item" mode="test"> <xsl:value-of select="@name"/> </xsl:template>