Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Однако вместо требуемой последовательности мы получим последовательность строчных римских цифр: i, ii, iiiи так далее. Иными словами, некоторые форматирующие токены определяют нумерующую последовательность двусмысленно: одним вариантом является алфавитная последовательность, начинающаяся этим токеном, другим — некая традиционная для данного языка (например, последовательность римских цифр для английского).Для того чтобы различать эти последовательности в двусмысленных ситуациях, в xsl:numberсуществует атрибут letter-value. Если его значением является "alphabetic", нумерующая последовательность является алфавитной, значение "traditional"указывает на то, что следует использовать традиционный для данного языка способ. Если атрибут letter-valueопущен, процессор может сам выбирать между алфавитным и традиционным способами нумерации.
При использовании цифровых форматов нумерации (иными словами, токенов вида 1, 01, 001и так далее) цифры в номере можно разделить на группы, получив, например, такие номера как " 2.00.00" из 20000или " 0-0-0-2" из 2. Для этой цели в xsl:numberиспользуется пара атрибутов grouping-separatorи grouping-size.
Атрибут grouping-separatorзадает символ, который следует использовать для разбивки номера на группы цифр, в то время как grouping-sizeуказывает размер группы. Эти атрибуты всегда должны быть вместе — если хотя бы один из них опущен, второй просто игнорируется.
Элемент xsl:numberвида
format="[00000001]"
grouping-separator="."
grouping-size="2"/>
будет генерировать номера в следующей последовательности:
1→ '[00.00.00.01]'
2→ '[00.00.00.02]'
...
999→ '[00.00.09.99]'
1000→ '[00.00.10.00]'
Пожалуй, следует упомянуть, что в значениях атрибутов format, lang, l etter-value, grouping-sizeи grouping-separatorмогут быть указаны шаблоны значений, иными словами могут использоваться выражения в фигурных скобках. Это может быть полезно, например, для того, чтобы сгенерировать форматирующие токены во время выполнения преобразования.
В следующем шаблоне формат номера секции зависит от значения атрибута formatее родительского узла:
format="{../@format}-1 "
level="multiple"
count="chapter|section"/>
При обработке входящего документа
нумерация секций будет выглядеть как
I-1 First Section
I-2 Second Section
I-3 Third Section
Если же атрибут formatэлемента chapterбудет иметь значение 1, секции будут пронумерованы в виде
1-1 First Section
1-2 Second Section
1-3 Third Section
Форматирование чисел
Мы уже познакомились с функцией языка XPath string, которая конвертирует свой аргумент в строку. Эта функция может преобразовать в строку и численное значение, но возможности ее при этом сильно ограничены.
К счастью, XSLT предоставляет мощные возможности для форматирования строкового представления чисел при помощи функции format-numberи элемента xsl:decimal-format.
Функция format-number
Запись функции имеет следующий вид:
string format-number( number , string , string ?)
Функция format-numberпринимает на вход три параметра. Первым параметром является число, которое необходимо преобразовать в строку, применив при этом форматирование. Вторым параметром является образец, в соответствии с которым будет форматироваться число. Третий параметр указывает название десятичного формата, который следует применять.
Образец форматирования в XSLT определяется точно так же, как в классе DecimalFormatязыка Java. Для того чтобы читателю, не знакомому с Java, не пришлось изучать документацию этого языка, мы приведем полный синтаксис образцов форматирования. Продукции образца форматирования мы будем помечать номерами с префиксом NF, чтобы не путать их с другими продукциями.
Прежде всего, образец форматирования может состоять из двух частей: первая часть определяет форматирование положительного числа, вторая часть — отрицательного. Запишем это в виде EBNF-продукции:
[NF 1] NFPattern ::= NFSubpattern (NFSubpatternDelim NFSubpattern)?
Двум частям образца форматирования соответствуют нетерминалы NFSubpattern, которые разделены нетерминалом NFSubpatternDelim.
В случае если вторая часть образца форматирования опушена, отрицательные числа форматируются точно так же, как и положительные, но им предшествует префикс отрицательного числа (по умолчанию — знак "минус", " -").
format-number(1234.567,'#.00;negative #.00')→ '1234.57'
format-number(-1234.567,'#.00/negative #.00')→ 'negative 1234.57'
format-number(-1234.567,'#.00')→ '-1234.57'
Каждая из частей образца форматирования состоит из префикса ( NFPrefix), целой части ( NFInteger), необязательной дробной части ( NFFractional) и суффикса ( NFSuffix).
[NF 2] NFSubpattern ::= NFPrefix NFinteger NFFractional? NFSuffix
Префикс или суффикс образца форматирования могут содержать символ процента. Если суффикс содержит символ процента, число должно быть умножено на 100и выведено со знаком процента. Наличие символа процента в префиксе на форматирование не влияет.
format-number(0.45,'0.00%')→ '45.00%'
format-number(0.45,'0.##%')→ '45.00%'
format-number(0.45678,'%0.00')→ '%0.46'
format-number(0.45678,'0.####%')→ '45.678%'
Префикс задает строку, которая будет предшествовать числу, это может быть последовательность любых неформатирующих символов ( NFChar) плюс символ процента ( NFPercent). Аналогично, суффикс будет следовать за числом, и он тоже не может содержать форматирующих символов (за исключением символа процента).
[NF 3] NFPrefix ::= (NFChar NFPercent?)*
[NF 4] NFSuffix ::= (NFChar NFPercent?)*
Если мы хотим заключить наше число, к примеру, в квадратные скобки, мы должны будем включить в его образец форматирования префикс " [" и суффикс " ]":
format-number(123456, '[#]')→ '[123456]'
Нетерминал NFintegerопределяет, как будет выглядеть целая часть числа. Он начинается несколькими символами NFOptDigit(по умолчанию " #"), показывающими позиции, в которых цифры необязательны, и состоит из символов NFReqDigit(по умолчанию " 0"), показывающих позиции обязательных цифр, а также символа NFGroupDelim(по умолчанию " ,"), показывающего позицию символа-разделителя групп цифр.
[NF 5] NFInteger ::= NFOptDigit*
(NFReqDigit* NFGroupDelim
| NFGroupDelim NFOptDigit*)?
NFReqDigit+
format-number(1234.56,'#0000')→ '1235'
format-number(1234.56,'00000')→ '01235'
Интервал:
Закладка: