| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
G_Z 26.09.2004 02:42 / 26.09.2004 03:00
Одной из самых частых задач вывода данных является вывод однородных данных в несколько столбцов.<xsl:template name="columns_out">
<xsl:param name="limit" select="2"/>
<xsl:param name="node_set"/>
<xsl:param name="call"/>
<xsl:variable name="width">
<xsl:choose>
<xsl:when test="count($node_set) > $limit">
<xsl:value-of select="round(100 div $limit)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round(100 div count($node_set))"/>
</xsl:otherwise>
</xsl:choose>
<xsl:text>%</xsl:text>
</xsl:variable>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<xsl:text disable-output-escaping="yes"><tr></xsl:text>
<xsl:for-each select="$node_set">
<td width="{$width}">
<xsl:call-template name="caller">
<xsl:with-param name="call">
<xsl:value-of select="$call"/>
</xsl:with-param>
</xsl:call-template>
</td>
<xsl:choose>
<xsl:when test="position() mod $limit = 0">
<!-- если номер столбца кратен лимиту, делаем перевод строки -->
<xsl:text disable-output-escaping="yes"></tr><tr></xsl:text>
</xsl:when>
<xsl:when test="position() = last()">
<!-- если элемент последний, то завершаем строку -->
<xsl:text disable-output-escaping="yes"></tr></xsl:text>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template name="caller">
<xsl:param name="call"/>
<xsl:choose>
<xsl:when test="$call = 'work'">
<xsl:call-template name="work"/>
</xsl:when>
<xsl:when test="$call = 'list_item'">
<xsl:call-template name="list_item"/>
</xsl:when>
<!-- вызовы прочих шаблонов
<xsl:when test="$call = ''">
<xsl:call-template name=""/>
</xsl:when>
/вызовы прочих шаблонов -->
<xsl:otherwise>
<xsl:call-template name="default_"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="default_">
<xsl:text><b>Ошибка, вызван дефолтный шаблон</b></xsl:text>
</xsl:template>«Метод» состоит из двух шаблонов. Если бы не ограничения xsl 1.0 на динамику вызова шаблонов, можно было бы ограничиться одним, но пока два.<xsl:call-template name="columns_out"> <xsl:with-param name="limit" select="количество колонок"/> <xsl:with-param name="node_set" select="выбранное множество узлов"/> <xsl:with-param name="call">шаблон, для вывода данных в ячейке</xsl:with-param> </xsl:call-template>Второй шаблон содержит вызовы различных шаблонов в зависимости от входного параметра.