Новости | 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>Второй шаблон содержит вызовы различных шаблонов в зависимости от входного параметра.