• Техногрет
  • Создание алфавитных указателей средствами 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>