Создание алфавитных указателей средствами XSLT

HTML и CSSXSLTJavaScriptИзображенияСофтEtc
Дмитрий Филатов

17 марта 2006


Задача. Написать универсальный шаблон для формирования алфавитного указателя из несортированных данных.

Чтобы не переписывать шаблон в будущем, сразу усложним задачу, считая, что

— исходное множество имеет произвольную структуру;
— исходные данные не отсортированы;
— количество колонок заранее неизвестно;
— буквенные блоки равномерно распределены по колонкам.

Как это будет выглядеть
Если алфавитный указатель сверстан в несколько колонок, есть два варианта, как их заполнить:

Вертикально

А

  • Александров
  • Алферова

Б

  • Бутыркина

В

  • Владимирова
  • Владин
  • Власова
  • Володарский
  • Володина

Г

  • Гомиашвили
  • Гончар
  • Гусев

Д

  • Дербенев
  • Драгин

К

  • Коркин
  • Кривошеев
  • Кузьмин

Л

  • Лифанов

Н

  • Набоков

О

  • Орестов
  • Орлова

П

  • Пупкин
  • Путин

Ф

  • Феактистов
  • Фролов

Я

  • Ягудин
  • Якушева


Горизонтально

А

  • Александров
  • Алферова

Б

  • Бутыркина

В

  • Владимирова
  • Владин
  • Власова
  • Володарский
  • Володина

Г

  • Гомиашвили
  • Гончар
  • Гусев

Д

  • Дербенев
  • Драгин

К

  • Коркин
  • Кривошеев
  • Кузьмин

Л

  • Лифанов

Н

  • Набоков

О

  • Орестов
  • Орлова

П

  • Пупкин
  • Путин

Ф

  • Феактистов
  • Фролов

Я

  • Ягудин
  • Якушева

Обработка произвольного множества
Решение должно быть универсальным, поэтому необходимо обрабатывать исходное множество способом, не зависящим от его структуры. Для этого, например, будем передавать его в шаблон указателя в виде параметра nodelist. Также в виде параметров оформим:

key-name — имя заранее созданного ключа по первой букве (чуть позже рассказано, зачем он нужен, пока же отметим: необходимо, чтобы множество узлов, по которому создается ключ, совпадало с множеством узлов, которое передается в виде параметра nodelist в шаблон);
count-columns — количество колонок, на которое следует разбить множество;
direction — направление заполнения колонок (0 — вертикальное, 1 — горизонтальное).

Пример кода, вызывающего шаблон алфавитного указателя:

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	
	<xsl:import href="alpha-indexes.xslt" />
	
	<!-- Ключ для множества необходимых узлов по первой букве -->
	<xsl:key name="items-key" match="/list/item" use="substring(., 1, 1)" />
	
	<xsl:template match="/list">	
		<!-- Вызов общего шаблона (четыре вертикально заполненные колонки) -->
		<xsl:call-template name="make-indexes">
			<xsl:with-param name="nodelist" select="item" />
			<xsl:with-param name="key-name" select="'items-key'" />
			<xsl:with-param name="count-columns" select="4" />
			<xsl:with-param name="direction" select="0" />
		</xsl:call-template>
	</xsl:template>	
</xsl:stylesheet>