parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Вывод в несколько столбцов посредством xsl трансформирования.

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) &gt; $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>&#x0025;</xsl:text>
	</xsl:variable>

	<table width="100&#x0025;" cellspacing="0" cellpadding="0" border="0">
		<xsl:text disable-output-escaping="yes">&lt;tr&gt;</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">&lt;/tr&gt;&lt;tr&gt;</xsl:text>
				</xsl:when>
				<xsl:when test="position() = last()">
<!-- если элемент последний, то завершаем строку -->
					<xsl:text disable-output-escaping="yes">&lt;/tr&gt;</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>
Второй шаблон содержит вызовы различных шаблонов в зависимости от входного параметра.
Если необходимо больше вариантов – дополните список.
Если передан вызов не внесённого в список шаблона, будет вызван шаблон «default_».