Алексей Валиков - Технология XSLT
format-number(123456789.0123,'0000,000,00') → '1,23,45,67,89'
Дробная часть числа, представленная нетерминалом NFFraction, начинается символом-разделителем целой и дробной части NFFractionDelim (по умолчанию "."), продолжается последовательностью символов обязательных позиций цифр NFReqDigit и заканчивается последовательностью символов необязательных позиций NFOptDigit:
[NF 6] NFFraction ::= NFFractionDelim NFReqDigit* NFOptDigit*
Примерыformat-number(1234.567,'#.00') → '1234.57'
format-number(1234.567,'#.00#') → '1234.567'
format-number(1234.567,'#.0000') → '1234.5670'
Продукция NFChar, использующаяся при определении префикса (NFPrefix) и суффикса (NFSuffix), может содержать любые неформатирующие символы:
[NF 7] NFChar ::= (Char - NFSymbol)
К специальным форматирующим символам относятся следующие:
□ символ обязательной позиции цифры (по умолчанию "0");
□ символ необязательной позиции цифры (по умолчанию "#");
□ символ-разделитель образцов форматирования для положительного и отрицательного числа (по умолчанию ";");
□ символ-разделитель целой и дробной части (по умолчанию ".");
□ символ процента (по умолчанию "%").
Перечислим их продукции:
[NF 8] NFSymbol ::= NFReqDigit
| NFOptDigit
| NFSubpatternDelim
| NFFractionDelim
| NFGroupDelim
| NFPercent
[NF 9] NFReqDigit ::= '0'
[NF 10] NFOptDigit ::= '#'
[NF 11] NFSubpatternDelim ::= ';'
[NF 12] NFFractionDelim ::= '.'
[NF 13] NFGroupDelim ::= ','
[NF 14] NFPercent ::= '%'
Синтаксические правила, которые мы привели выше, пока не являются стандартными. Они корректно передают синтаксис образца форматирования, но являются более строгими, чем определения в документации языка Java.
Элемент xsl:decimal-format
Синтаксис элемента задан конструкцией вида:
<xsl:decimal-format
name="имя"
decimal-separator="символ"
grouping-separator="символ"
infinity="строка"
minus-sign="символ"
NaN="строка"
percent="символ"
per-mille="символ"
zero-digit="символ"
digit="символ"
pattern-sераrator="символ"/>
XSLT позволяет изменять специальные символы, влияющие на форматирование строки. Именованный набор таких символов и некоторых других указаний называется десятичным форматом и определяется элементом xsl:decimal-format. От атрибутов этого элемента зависит, как будут обрабатываться символы образца форматирования и как число будет отображаться на выходе:
Атрибут name элемента xsl:decimal-format задает расширенное имя десятичного формата. Если имя не указано, это означает, что элемент xsl:decimal-format определяет десятичный формат по умолчанию.
Остальные атрибуты контролируют интерпретацию форматирующего образца и вывод строкового представления числа следующим образом:
□ decimal-separator — задает символ, разделяющий целую и дробную части числа. Значением этого атрибута по умолчанию является символ ".", с Unicode-кодом #x2e. Атрибут decimal-separator рассматривается как специальный символ образца форматирования. Кроме того, он будет использован как разделяющий символ при выводе;
□ grouping-separator — задает символ, группирующий цифры в целой части записи числа. Такие символы используются, например, для группировки тысяч ("1,234,567.89"). Значением по умолчанию является символ ",", код #x2c. grouping-separator рассматривается как специальный символ образца форматирования. Помимо этого, он будет использован как разделяющий символ групп цифр при выводе числа;
□ percent — задает символ процента. Значением по умолчанию является символ "%", код #x25. Этот символ будет распознаваться в образце форматирования и использоваться при выводе;
□ per-mille — задает символ промилле. Значением по умолчанию является символ "‰", код #х2030. Символ промилле распознается в образце форматирования и используется в строковом представлении числа;
□ zero-digit — задает символ нуля. Значением по умолчанию является символ "0", код #x30;. В качестве цифр при отображении числа будут использоваться символ нуля и 9 символов, следующих за ним. Символ нуля распознается в образце форматирования и используется при выводе строкового представления числа;
□ digit — определяет символ, который используется в образце форматирования для определения позиции необязательного символа. Значением по умолчанию является символ "#". Этот символ распознается как форматирующий символ необязательной цифры. Он не включается в строковое представление числа;
□ pattern-separator — определяет символ, который используется в образце форматирования для разделения положительного и отрицательного форматов числа. Он не включается в строковое представление числа. Значением этого атрибута по умолчанию является символ ";";
□ infinity — задает строку, которая будет представлять бесконечность. Значением по умолчанию является строка "Infinity";
□ NaN — задает строку, которая будет представлять не-числа. Значением по умолчанию является строка "NaN";
□ minus-sign — задает символ, который будет использоваться для обозначения отрицательных чисел. Значением по умолчанию является символ "-", код #x2D.
Элемент xsl:decimal-format не имеет смысла без функции format-number. Все, на что влияют его атрибуты — это формат, который будет использоваться при преобразовании чисел в строку функцией format-number.
ПримерыОпределение десятичного формата:
<xsl:decimal-format
name="format1"
decimal-separator=","
minus-sign="N"
grouping-separator=":"
infinity="∞"
NaN="not-a-number"
percent="%"
digit="$"
pattern-separator="|"/>
Примеры функций format-number:
format-number(123456.78, '$,0000', 'format1) → '123456,7800'
format-number(-123456.78, '$,00$$', 'format1') → 'N123456,78'
format-number(123456.78, '$,0000|$,0000-', 'format1') → '123456,7800'
format-number(-123456.78, '$,00001$,0000-', 'format1') → '123456,7800-'
format-number(-123456.78, '000:000:000,00$$', 'format1') → 'N000:123:456,78'
format-number('zero', '000:000:000,00$$', 'format1') -> 'not-a-number'
format-number(1 div 0, '$,$', 'format1') → '∞'
format-number(-1 div 0, '$,$', 'format1') → 'N∞'
Определение десятичного формата:
<xsl:decimal-format name="format2" zero-digit="/"/>
Примеры функций format-number:
format-number(123456789, '#', 'format2') → '012345678'
format-number(123456789, '#') → '123456780'
Определение десятичного формата:
<xsl:decimal-format name="format3" zero-digit="1"/>
Примеры функций format-number:
format-number(123456789, '#', 'format3') → '23456789:'
format-number(12345.06789, '#.#####', 'format3') → '23456.1789:'
Десятичный формат, определяемый элементом xsl:decimal-format, в отличие от многих других элементов не может переопределяться в преобразованиях со старшим порядком импорта. Элементы xsl:decimal-format должны определять десятичные форматы с различными именами (за исключением тех случаев, когда значения их атрибутов полностью совпадают).
Контроль вывода документа
Несмотря на то, что XSLT-процессоры должны лишь только преобразовывать логические модели документов, организованные в виде деревьев, многие из них имеют также возможность выдавать результат преобразования в виде последовательности символов.
Элемент xsl:output
Синтаксис этого элемента приведен ниже:
<xsl:output
method = "xml" | "html" | "text" | "имя"
version = "токен"
encoding = "строка"
omit-xml-declaration = "yes" | "no"
standalone = "yes" | "no"
doctype-public = "строка"
doctype-system = "строка"
cdata-section-elements = "имена"
indent = "yes" | "no"
media-type = "строка"/>
Элемент верхнего уровня xsl:output позволяет указывать, каким образом должно быть выведено результирующее дерево.
Главным атрибутом элемента xsl:output является атрибут method, который определяет, какой метод должен использоваться для вывода документа. Значением этого атрибута может быть любое имя, но при этом техническая рекомендация XSLT определяет только три стандартных метода вывода — "xml", "html" и "text". В том случае, если процессор поддерживает нестандартный метод вывода, его реализация полностью зависит от производителя.