Главная » XSLT

Вывод текста в области заданной ширины с заданным выравниванием

Добавлено Дата: 25 December, 2010 категория: XSLT

Задача

Требуется вывести многострочный текст, присутствующий в XML-докумен- те, в области фиксированной ширины. При этом перенос строк должен произво­диться по границам слов.

Решение

Вот решение, в котором перенос и выравнивание достигаются за счет повтор­ного использования шаблона text:justify из рецепта 7.3. Для пущей гибкости ширину области выравнивания можно задавать независимо от ширины области переноса, считая, что по умолчанию они совпадают.

Читать »

Соединения

Добавлено Дата: 25 December, 2010 категория: XSLT

Задача

Требуется соотнести элементы в некотором документе с другими элементами в том же или ином документе.

Решение

Чтобы выполнить соединение, мы рассматриваем все возможные пары элементов (то есть берем декартово произведение) и оставляем только те, которые удовлетворя­ют критерию, по которому выполняется соединение (обычно это равенство).

Читать »

Нахождение позиции начала подстроки

Добавлено Дата: 25 December, 2010 категория: XSLT

Задача

Требуется найти индекс позиции, с которой начинается подстрока, а не текст до или после этой подстроки.

Решение XSLT 1.0

<xsl:template name="str:index-of"> <xsl:param name="input"/> <xsl:param name="substr"/> <xsl:choose>

Читать »

Вычисление статистических функций

Добавлено Дата: 24 December, 2010 категория: XSLT

Задача

Требуется вычислить среднее, дисперсию и стандартное отклонение.

Решение XSLT 1.0

В математической статистике находят применение три вида средних значе­ний: среднее арифметическое, медиана и мода.

Среднее арифметическое вычисляется тривиально – находим сумму, пользу­ясь рецептом 3.6, и делим ее на количество слагаемых.

Читать »

Автоматизация вставки отладочной печати

Добавлено Дата: 24 December, 2010 категория: XSLT

Задача

Требуется преобразовать имеющуюся таблицу стилей в другую, добавив отла­дочную печать.

Решение

Оливер Беккер (Oliver Becker) разработал полезное преобразование, которое принимает на входе любую таблицу стилей, а на выходе возвращает ту же табли­цу, дополненную трассировкой:

Читать »

Расширения EXSLT для работы со строками

Добавлено Дата: 23 December, 2010 категория: XSLT

Задача

У вас есть основательные причины воспользоваться дополнительными функ­циями для обработки строк, но беспокоит вопрос переносимости.

Решение

Не исключено, что ваш процессор XSLT уже реализует строковые функции, определенные сообществом EXSLT (http://www.exslt.org). На момент работы над этой книгой в их число входили следующие функции.

Читать »

Создание обобщенных функций отображения

Добавлено Дата: 21 December, 2010 категория: XSLT

Задача

Требуется создать повторно используемые шаблоны для выполнения опера­ций над элементами набора узлов.

Решение

В этом решении мы рекурсивно обрабатываем элементы, входящие в набор $nodes, вызывая для каждого из них обобщенную функцию $func. Эта функ­ция может иметь параметр $func-param. Значение $func-param по умолча­нию мы получаем из атрибута @param1 метки обобщенной функции. Благодаря этому соглашению значение по умолчанию может зависеть от обобщенной функции:

Читать »

Создание отчета с несколькими колонками

Добавлено Дата: 21 December, 2010 категория: XSLT

Задача

Требует представить данные в виде таблицы с несколькими колонками.

Решение

Есть две разновидности отображения XML в многоколонную таблицу. В пер­вом случае различные элементы или атрибуты отображаются на разные колонки, во втором отображение элемента определяется его относительной позицией.

Читать »

Объединение документов с различными схемами

Добавлено Дата: 20 December, 2010 категория: XSLT

Задача

Имеется несколько документов с разной структурой, а требуется объединить их в один.

Решение

Процедура объединения структурно различных документов зависит от конк­ретного приложения. Поэтому мы не можем предложить одно общее решение. Однако мы попробуем прикинуть, в каких случаях обычно возникает такая необ­ходимость, и приведем решение для каждого случая.

Читать »

Работа с электронными таблицами в формате Excel XML

Добавлено Дата: 20 December, 2010 категория: XSLT

Задача

Требуется экспортировать данные из Excel в XML, но не в том формате, кото­рый предлагает Microsoft.

Решение XSLT 1.0

Пусть есть такая электронная таблица Excel:

Date                      Price                                  Volume

Читать »

Преобразование имеющейся заготовки SVG

Добавлено Дата: 20 December, 2010 категория: XSLT

Задача

Требуется графически отобразить данные, заполнив ими имеющийся SVG- шаблон.

Решение XSLT 1.0

Пусть требуется вывести данные в виде столбчатой диаграммы. Можно представить себе XSLT-преобразование, которое конструирует SVG-пред- ставление такой диаграммы с нуля (см. рецепт 11.2). Однако человеку, кото­рой не очень уверенно владеет графическими манипуляциями, эта задача мо­жет показаться пугающе сложной. Но иногда нужно лишь вывести данные в нескольких фиксированных точках. В таком случае проще заранее создать в SVG-редакторе изображение, которое будет служить шаблоном, в который мы подставим конкретные данные с помощью XSLT. При таком подходе задача существенно упрощается.

Читать »

Генерация кода из UML-моделей, описанных на языке XMI

Добавлено Дата: 19 December, 2010 категория: XSLT

Задача

Требуется сгенерировать код по спецификациям на языке Unified Modeling Language (UML), но результат, который выдает генератор, встроенный в инст­рументальную программу для работы с UML, вам по каким-то причинам не нра­вится.

ПАТТЕРН ПРОЕКТИРОВАНИЯ «СОСТОЯНИЕ»

Читать »

Вычисление юлианского и абсолютного дня, соответствующих заданной дате

Добавлено Дата: 18 December, 2010 категория: XSLT

Задача

Зная дату, требуется найти соответствующий ей юлианский или абсолютный номер дня.

ЮЛИАНСКИЙ ДЕНЬ И ДАТА ПО ЮЛИАНСКОМУ КАЛЕНДАРЮ

Не путайте юлианский день с юлианским календарем. Джозеф Дж. Скали- гер (Joseph J. Scaliger) изобрел юлианский период, так чтобы каждому году можно было сопоставить целое положительное число, не заботясь о том, по какую сторону от начала новой эры он находится. Период начинается 1 января 4713 года до н.э. и длится 7980 лет. В астрономии юлианский период применяет­ся для того, чтобы ассоциировать с каждым днем, начиная с 1 января 4713 года до н.э. уникальное число, которое и называется юлианским днем. Эту главу я начал писать в юлианский день с номером 2 452 376. Любознательный читатель может воспользоваться приведенным рецептом, чтобы узнать соответствующую ему дату. Другую схему абсолютной нумерации дней применили Н. Дершовиц и Э. Рей­нгольд в своих календарных алгоритмах. В ней точкой отсчета является 1 янва­ря 1 года н.э. Номер дня в их системе я называю абсолютным номером дня. Абсолютный день 1 соответствует юлианскому дню 1 721 426.

Читать »

Углубление иерархии XML

Добавлено Дата: 16 December, 2010 категория: XSLT

Задача

Имеется плохо спроектированный документ, которому не помешали бы до­полнительные структурные уровни< ![if !supportFootnotes]>[2].

Решение

Эта задача противоположна рассмотренной в рецепте 8.7. Здесь нужно доба­вить в документ структурные уровни, возможно, для того чтобы организовать элементы по какому-нибудь дополнительному критерию.

Читать »

Для группировки пользуйтесь командой for-each-group, а не методом Мюнха

Добавлено Дата: 16 December, 2010 категория: XSLT

Задача

В XSLT 1.0 нет явной поддержки для группировки, поэтому приходится изоб­ретать косвенные и не слишком понятные методы.

Решение

Всякий раз, когда нужна группировка, пользуйтесь преимуществами весьма мощной команды xsl:for-each-group. У нее есть обязательный атрибут select, значением которого является выражение, отбирающее множество узлов, кото­рые нужно сгруппировать. Чтобы определить критерии разбиения этого множества на группы, задается один из четырех атрибутов группировки. Все они будут рассмотрены ниже. По ходу обработки вы можете пользоваться функцией current-group() для доступа ко всем узлам в текущей группе. Функция current-grouping-key() возвращает значение ключа, определяющего текущую группу, в случае, когда группировка осуществляется по значениям или по соседним узлам. Для группи­ровки по начальному или конечному узлу эта функция не возвращает никакого значения.

Читать »