![]() |
Дмитрий Филатов
17 марта 2006 |
|
![]() |
Задача. | Написать универсальный шаблон для формирования алфавитного указателя из несортированных данных. | ![]() |
![]() |
![]() |
Чтобы не переписывать шаблон в будущем, сразу усложним задачу, считая, что
— исходное множество имеет произвольную структуру;
— исходные данные не отсортированы;
— количество колонок заранее неизвестно;
— буквенные блоки равномерно распределены по колонкам.
Пример исходных данных
|
Пример целиком |
Как это будет выглядеть
Если алфавитный указатель сверстан в несколько колонок, есть два варианта, как их заполнить:
А
Б
В
|
Г
Д
К
|
Л
Н
О
|
П
Ф
Я
|
А
| Б
| В
| Г
|
Д
| К
| Л
| Н
|
О
| П
| Ф
| Я
|
Обработка произвольного множества
Решение должно быть универсальным, поэтому необходимо обрабатывать исходное множество способом, не зависящим от его структуры. Для этого, например, будем передавать его в шаблон указателя в виде параметра nodelist. Также в виде параметров оформим:
key-name — имя заранее созданного ключа по первой букве (чуть позже рассказано, зачем он нужен, пока же отметим: необходимо, чтобы множество узлов, по которому создается ключ, совпадало с множеством узлов, которое передается в виде параметра nodelist в шаблон);
count-columns — количество колонок, на которое следует разбить множество;
direction — направление заполнения колонок (0 — вертикальное, 1 — горизонтальное).
Пример кода, вызывающего шаблон алфавитного указателя:
|
Отдельные интересные фрагменты шаблона alpha-indexes.xsl нужно рассмотреть подробнее. Все внутренние шаблоны должны уметь обрабатывать произвольные узлы. Для этого указываем соответствующее выражение XPath:
|
См. шаблон alpha-indexes.xslt |
Генерация множества буквенных блоков
Вся хитрость приведенной конструкции в том, что если функция Строки с горизонтальным заполнением
Здесь стоит объяснить, для чего используется внешний цикл Колонки с вертикальным заполнением
Однако не все так просто. Рассмотрим задачу размещения двенадцати блоков в пяти колонках. Количество блоков в полностью заполненной колонке будет равно трем, соответственно, все множество блоков при таком разбиении уместится в четырех колонках, что не удовлетворяет условию задачи. Поэтому нужно принять во внимание этот фактор, и генерировать недостающие колонки по мере необходимости. Код разбиения, учитывающий этот момент, довольно объемный и поэтому здесь не приводится. Кроме того, шаблон для генерации колонок должен подсчитывать, сколько блоков будет в каждой из колонок (для передачи в последующий шаблон, генерирующий блоки в колонке). Множество блоков в колонке для варианта с вертикальным заполнением
Формирование содержимого блока
|
См. также Grouping using the Muenchian method |
© 19952023 Студия Артемия Лебедева
|