69062

Форматирование чисел в XSLT

Лекция

Информатика, кибернетика и программирование

XSLT предоставляет мощные возможности для форматирования строкового представления чисел при помощи функции format-number и элемента xsl:decimal-format. Запись функции имеет следующий вид: строка format-number(число, строка-формата, имя-decimal-format)

Русский

2014-09-29

204 KB

2 чел.

 21

Лекция 4-10

5.3.16. Форматирование чисел в XSLT

5.3.17. Использование ключей в XSLT

5.3.18. Переменные, параметры и функции в XSLT

 5.3.18.1. Переменные в XSLT

 5.3.18.2. Вызов именованных правил шаблона

 5.3.18.3. Параметры в XSLT

 5.3.18.4. Функции стилей в XSLT

5.3.19. Дополнительные функции XSLT

 5.3.19.1. Функция document()

 5.3.19.2. Функция current()

 5.3.19.3. Функция generate-id()

 5.3.19.4. Функция system-property()

 5.3.19.5. Функция unparsed-entity-uri()

5.3.20. Использование расширений в XSLT

 5.3.20.1. Средства расширения XSLT

 5.3.20.2. Инициатива EXSLT

 5.3.20.3. Средства расширения в процессоре MSXML

 5.3.20.4. Средства расширения в процессоре Saxon

5.3.16. Форматирование чисел в XSLT

XSLT предоставляет мощные возможности для форматирования строкового представления чисел при помощи функции format-number и элемента xsl:decimal-format.

Запись функции имеет следующий вид:

строка format-number(число, строка-формата, имя-decimal-format)

Первым параметром функции является число, которое необходимо преобразовать в строку, применив при этом форматирование. Вторым параметром является строка-формата – образец, в соответствии с которым будет форматироваться число. Третий, необязательный параметр указывает имя элемента xsl:decimal-format, который следует применять.

Образец форматирования в XSLT определяется точно так же, как в классе DecimalFormat языка Java.

Прежде всего, образец форматирования может состоять из двух частей: первая часть определяет форматирование положительного числа, вторая часть – отрицательного.

В случае если вторая часть образца форматирования опущена, отрицательные числа форматируются точно так же, как и положительные, но им предшествует префикс отрицательного числа (по умолчанию, символ "-").

Используемые в строке формата символы делятся на форматирующие и неформатирующие.

К форматирующим символам относятся следующие символы:

  •  символ обязательной позиции цифры (по умолчанию "0");
  •  символ необязательной позиции цифры (по умолчанию "#");
  •  символ-разделитель образцов форматирования для положительного и отрицательного числа (по умолчанию ";");
  •  символ-разделитель целой и дробной части (по умолчанию ".");
  •  символ процента (по умолчанию "%").

Форматирующие символы при формировании выходной строки рассматриваются как шаблоны преобразования строки.

Все остальные символы считаются неформатирующими и выводятся в возвращаемой функцией строке без изменения.

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

Префикс или суффикс образца форматирования могут содержать символ процента. Если суффикс содержит символ процента, число должно быть умножено на 100 и выведено со знаком процента. Наличие символа процента в префиксе на форматирование не влияет.

Префикс задает строку, которая будет предшествовать числу, это может быть последовательность любых неформатирующих символов плюс символ процента. Аналогично, суффикс будет следовать за числом, и он тоже не может содержать форматирующих символов (за исключением символа процента).

Целая часть числа может начинаться несколькими символами, показывающими позиции, в которых цифры необязательны (по умолчанию "#"), и состоит из символов, показывающих позиции обязательных цифр (по умолчанию"0"), а также может содержать символы, показывающие позицию символа-разделителя групп цифр (по умолчанию ",").

Некоторые  процессоры  позволяют  указывать  несколько  символов-разделителей. Однако даже в этом случае они учитывают только последний из этих символов.

Дробная часть числа начинается символом-разделителем целой и дробной части (по умолчанию "."), продолжается последовательностью символов обязательных позиций цифр и заканчивается последовательностью символов необязательных позиций.

Примеры вызова функции format-number:

format-number(-1234.567,'#.00;negative #.00')  

'negative 1234.57'.

format-number(0.45,'0.##%')  '45.00%'.

format-number(1234.56,'000,00')  '0,12,35'.

format-number (1234.567, '#.00'')  '1234.57'.

format-number(1234.567,'#.0000')  '1234.5670'.

В XSLT можно изменять специальные символы, влияющие на форматирование строки. Именованный набор таких символов и некоторых других указаний называется десятичным форматом и определяется элементом xsl:decimal-format. Этот элемент используется только на верхнем уровне (вне правил шаблона).

Этот элемент имеет следующий синтаксис:

<xsl:decimal-format

name="имя"

decimal-separator="символ"

grouping-separator="символ"

infinity="строка"

minus-sign="символ"

NaN="строка"

percent="символ"

per-mille="символ"

zero-digit="символ"

digit="символ"

pattern-separator="символ"

/>

Атрибут name задает расширенное имя десятичного формата. Это имя может указываться в качестве третьего параметра при вызове функции format-number. Если имя не указано, это означает, что элемент xsl:decimal-format определяет десятичный формат по умолчанию.

Остальные атрибуты контролируют интерпретацию форматирующего образца и вывод строкового представления числа следующим образом:

  •  decimal-separator – задает символ, разделяющий целую и дробную части числа. Значением этого атрибута по умолчанию является символ ".". Атрибут  рассматривается как специальный символ образца форматирования. Кроме того, он будет использован как разделяющий символ при выводе;
  •  grouping-separator – задает символ, группирующий цифры в целой части записи числа. Такие символы используются, например, для группировки тысяч("1, 234"). Значением по умолчанию является символ ",". Атрибут рассматривается как специальный символ образца форматирования. Помимо этого, он будет использован как разделяющий символ групп цифр при выводе числа;
  •  percent – задает символ процента. Значением по умолчанию является символ "%". Этот символ будет распознаваться в образце форматирования, и использоваться при выводе;
  •  per-mille – задает символ промилле. Значением по умолчанию является символ "". Символ промилле распознается в образце форматирования и используется в строковом представлении числа;
  •  zero-digit – задает символ нуля. Значением по умолчанию является символ "0". В качестве цифр при отображении числа будут использоваться символ нуля и 9 символов, следующих за ним. Символ нуля распознается в образце форматирования и используется при выводе строкового представления числа;
  •  digit – определяет символ, который используется в образце форматирования для определения позиции необязательного символа. Значением по умолчанию является символ "#". Этот символ распознается как форматирующий символ необязательной цифры. Он не включается в строковое представление числа;
  •  pattern-separator – определяет символ, который используется в образце форматирования для разделения положительного и отрицательного форматов числа. Он не включается в строковое представление числа. Значением этого атрибута по умолчанию является символ ";";
  •  infinity – задает строку, которая будет представлять бесконечность. Значением по умолчанию является строка "infinity";
  •  NaN – задает строку, которая будет представлять не-числа. Значением по умолчанию является строка "NaN";
  •  minus-sign – задает символ, который будет использоваться для обозначения отрицательных чисел. Значением по умолчанию является символ "-".

Примеры использования элемента decimal-format:

Определение десятичного формата:

<xsl:decimal-format name="euro"

decimal-separator="," grouping-separator="."/>

меняет символы разделителей дробной и целой части, а также групп цифр, принятые в США, на европейские, например, при вызове функции в следующем элементе:

<xsl:value-of

select="format-number(26825.8, '#.###,00', 'euro')"/>,

Вызов этой функции возвратит значение 26.825,80.

5.3.17. Использование ключей в XSLT

Ключи дают возможность работать с документами, имеющими неявную структуру перекрестных ссылок. В XML атрибуты типа ID, IDREF и IDREFS создают механизм, позволяющий делать в документах XML перекрестные ссылки явными. В XSLT этот механизм реализуется с помощью функции id из XPath. Однако этот механизм имеет ряд ограничений:

  •  тип атрибута ID должен быть объявлен в DTD (поэтому, если это объявление сделано во внешнем DTD, то и распознаваться тип атрибута будет только тогда, когда процессор XML прочтет этот внешний набор DTD);
  •  документ может иметь только один набор уникальных ID, т.е. не может быть несколько независимых наборов уникальных атрибутов ID;
  •  идентификатор элемента может быть задан лишь в атрибуте, т.е. не может быть задан ни содержимым элемента, ни элементом, являющимся непосредственным потомком;
  •  значение атрибута должно быть именем XML (например, он не может содержать пробелов);
  •  элемент может содержать не более одного идентификатора;
  •  любой конкретный идентификатор может принадлежать только одному элементу.

Из-за этих ограничений документы XML иногда имеют структуру перекрестных ссылок, которая не была явно декларирована атрибутами ID/IDREF/IDREFS.

Для решения этой проблемы в XSLT введено понятие ключа. Работа с ключами обеспечивается с помощью элемента верхнего уровня xsl:key, который определяет в преобразовании именованный ключ, и функции key, которая возвращает множество узлов, идентифицирующихся заданными значениями ключей.

Элемент имеет xsl:key следующий синтаксис:

<xsl:key

name="имя"

match="образец"

use="выражение"

collation="URI" 

/>

Элемент xsl:key определяет в преобразовании ключ именем, заданным в значении атрибута name. Каждое имя ключа можно рассматривать как отдельное, независимое пространство идентификаторов.

Значением ключа для каждого узла документа, соответствующего образцу match, будет результат вычисления выражения, заданного в атрибуте use (для каждого узла, соответствующего шаблону, это выражение вычисляется отдельно). Значением ключа может быть произвольная строка и это не обязательно должно быть имя (в частности значением ключа для атрибутов match="from" и use="@*" значением ключа будут значения всех атрибутов элемента from).

Ни атрибут use, ни атрибут match не могут содержать переменных.

Атрибут collation задает ссылку на ресурс, содержащий правила сравнения строк.

В документе может быть несколько ключей, относящихся к одному и тому же узлу и имеющих одно и то же название, но с различными значениями ключа.

В документе может быть несколько ключей, имеющих одно и то же название ключа, одно и то же значение, но относящихся к различным узлам.

Для обращения в правилах шаблона к множествам узлов по значениям их ключей, в XSLT используется функция key, имеющая следующий вид:

набор-узлов key(строка, объект).

Функция помещает в возвращаемый набор-узлов все узлы, для которых значение их ключа с именем строка (определенного в элементе xsl:key) равно значению объекта.

Пример использования ключей:

Вывести таблицу отправителей сообщений в message.xml, отправителем для которых является абонент sidorov@mail.com. Преобразование XSLT:

<?xml version="1.0" encoding="Windows-1251"?>

<xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="html"

   encoding="Windows-1251" indent="yes"/>   

 <xsl:key name="to-list" match="to" use="@address" />

 <xsl:template match="/">

   <html>

 <head>

   <title>Использование ключей</title>

 </head>

 <body>

   <h4>

Отправители сообщений для sidorov@mail.com:

       </h4>

  <table border="2">

     <tr>

   <th>Номер сообщения</th>

   <th>Отправитель</th>

     </tr>

   <xsl:for-each

     select="key('to-list', 'sidorov@mail.com')">

   <tr>

     <td align="center">

   <xsl:number count="header"/>

 </td>

   <td>

   <xsl:value-of

    select="preceding-sibling::from/@address"/>

</td>

      </tr>

 </xsl:for-each>

  </table>

</body>

</html>

 </xsl:template>

</xsl:stylesheet>

В результате выполнения этого преобразования будет выведена следующая таблица:

Отправители сообщений для sidorov@mail.com:

Номер сообщения

Отправитель

2

ivanov@mail.com

5.3.18. Переменные, параметры и функции в XSLT

Переменные и параметры в XSLT похожи между собой и сильно отличаются от переменных в других языках программирования.

5.3.18.1. Переменные в XSLT

Переменные в XSLT не могут быть изменены, т.е. фактически они эквиваленты переменным с модификатором const в C или переменным с модификатором final в Java. По этой причине в XSLT нет оператора присваивания, а переменные и параметры только инициализируются при объявлении.

Для объявления переменных в XSLT служит элемент xsl:variable, который может как присутствовать в теле правила шаблона, так и быть элементом верхнего уровня. Синтаксис этого элемента в XSLT определен следующим образом:

<xsl:variable

name="имя"

select="выражение"

as="тип-переменной"

>

 <!--

 Содержимое: конструктор последовательности 

 -->  

</xsl:variable>

Элемент xsl:variable связывает имя, указанное в обязательном атрибуте name, со значением выражения, указанного в необязательном атрибуте select или с деревом, которое является результатом выполнения правила шаблона, содержащегося в этом элементе. В том случае, если объявление переменной было произведено элементом верхнего уровня, переменная называется глобальной переменной. Переменные, определенные элементами xsl:variable в правилах шаблона (то есть не на верхнем уровне) называются локальными переменными.

Необязательный атрибут as задает тип переменной (один из типов XPath).

Значение присваиваемого выражения вычисляется в зависимости от того, как был определен элемент xsl:variable:

  •  если в элементе xsl:variable определен атрибут select, то значением присваиваемого выражения будет результат вычисления выражения, указанного в этом атрибуте;
  •  если атрибут select не определен, но сам элемент xsl:variable имеет дочерние узлы (иными словами, содержит шаблон), значением определяемой переменной будет результирующий фрагмент дерева, полученный в результате выполнения содержимого xsl:variable;
  •  если атрибут select не определен и при этом сам элемент xsl:variable пуст, значением параметра по умолчанию будет пустая строка.

Использовать значения, присвоенные переменным при инициализации, можно, указывая впереди имени переменной символ "$", например для переменной x$x.

Имя переменной соответствует синтаксическому правилу QName, т.е. может иметь вид имя или префикс:имя. Как правило, имена переменным даются без префиксов, однако в том случае, если префикс все же указан, переменная ассоциирует с некоторым объектом не простое, а расширенное имя. Соответственно, обращение к объекту должно будет производиться также посредством расширенного имени.

Каждая из переменных имеет собственную область видимости (scope), т.е. область, в которой может быть использовано ее значение. Область видимости определяется следующим образом:

  •  областью видимости глобальной переменной является все преобразование, то есть значение переменной, объявленной элементом верхнего уровня, может быть использовано в преобразовании где угодно. К такой переменной можно обращаться даже до ее объявления, единственным ограничением является то, что переменная не должна определяться через собственное значение – явно или неявно.
  •  локальную переменную можно использовать только после ее объявления и только в том же родительском элементе, которому принадлежит объявляющий элемент xsl:variable. В терминах XPath область видимости локальной переменной будет определяться выражением

following-sibling:node()/descendant-or-self:node().

Пример определения глобальных переменных:

<xsl:stylesheet 

version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="ID" select="4"/>

<xsl:variable name="leaf" select="//item[@id=$ID]"/>

<xsl:variable name="path"

select="$leaf/ancestor-or-self::item"/>

</xsl:stylesheet>

Пример определения локальных переменных:

<xsl:stylesheet

version="l.0"

xmlns:xsl="... ">

<xsl:template match="/">

<xsl:variable

name="i"

select="2"/>

<xsl:variable

name="j"

select="$i - 1"/>

</xsl:template>

</xsl:stylesheet>

В XSLT действует то же правило, что и во многих других языках программирования: нельзя дважды определять переменную с один и тем же именем, за исключением следующих случаев:

  •  имена двух глобальных переменных могут совпадать в том и только том случае, когда они имеют разный порядок импорта. Например, если переменные с одинаковыми именами определены в разных преобразованиях, одно из них может быть импортировано. В этом случае переменная будет иметь значение, которое задано элементом xsl:variable со старшим порядком импорта.
  •  допускается совпадение имен локальной и глобальной переменных – в этом случае в области видимости локальной переменной будет использоваться локальное значение, в области видимости глобальной (но не локальной) – глобальное значение.
  •  две локальные переменные могут иметь совпадающие имена в том и только том случае, если их области видимости не пересекаются.

Переменные в XSLT используются в следующих основных случаях:

  •  переменные могут содержать значения выражений, которые много раз используются в преобразовании (это избавит процессор от необходимости пересчитывать выражение каждый раз по-новому);
  •  переменной может присваиваться результат преобразования, что позволяет манипулировать уже сгенерированными частями документа;
  •  переменные могут использоваться для более прозрачного доступа к внешним документам.

Пример использования переменной:

<xsl:variable name="links" select="//a[@href]"/>

Используя затем в шаблоне имя переменной – $links,  можно избежать многократной записи одного и того же выражения (особенно если оно является громоздким). Кроме того, если необходимо изменить значение переменной, это  изменение делается только в элементе xsl:variable.

5.3.18.2. Вызов именованных правил шаблона

Для вызова именованных правил шаблона (с атрибутом name) в XSLT используется элемент xsl:call-templates, который имеет следующий синтаксис:

<xsl:call-template

name="имя">

 <!--

 Содержимое: элементы xsl:with-param 

 -->

</xsl:call-template>

Обязательный атрибут name указывает имя правила шаблона, который вызывается этой инструкцией. Например, правило шаблона с именем "head", приведенное выше, может быть вызван следующим образом:

<xsl:call-template name="head"/>.

При вызове xsl:call-template не изменяет контекста преобразования, Фактически, вызов именованного правила шаблона эквивалентен замене в тексте преобразования элемента xsl:call-template на тело вызываемого шаблона.

Если именованное правило шаблона имеет атрибут match, то  его можно вызывать как с помощью  элемента xsl:apply-templates, так и с помощью элемента xsl:call-template.

Между вызовом  правила шаблона с помощью элемента  xsl:apply-templates и с помощью элемента  xsl:call-template существуют следующие основные отличия:

  •  элемент xsl:apply-templates применяет подходящие правила шаблона к узлам определенного множества, а xsl:call-template просто выполняет тело фиксированного именованного правила шаблона;
  •  при вызове правила шаблона инструкцией xsl:apply-templates происходит изменение контекста – обрабатываемое множество узлов становится текущим списком узлов преобразования, а обрабатываемый узел – текущим  узлом, а xsl:call-template не изменяет контекст преобразования;
  •  элемент xsl:apply-templates позволяет использовать различные режимы, а элемент xsl:call-template выполняет правило шаблона с заданным именем вне зависимости от того, в каком режиме происходит обработка и каково значение атрибута mode этого правила;
  •  если для обработки определенного узла подходит несколько правил шаблона, то при выполнении xsl:apply-template процессор будет выбирать наиболее подходящий из них, а для xsl:call-template всегда будет выполнять то единственное правило преобразования, который имеет указанное имя;
  •  если в преобразовании не определено правило шаблона для обработки некоторого узла, но к нему элементом xsl:apply-templates все же применяются правила шаблона (процессор будет использовать правило обработки по умолчанию), а если элемент xsl:call-template вызывает отсутствующий шаблон, процессор выдаст сообщение об ошибке, потому что не сможет найти правило с заданным именем;

при использовании xsl:apply-templates процессор игнорирует значения атрибутов name элементов xsl:template, а при использовании xsl:call-template принимает во внимание только значение атрибута name, игнорируя атрибуты match, mode и priority.

5.3.18.3. Параметры в XSLT

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

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

Работа с параметрами обеспечивается двумя элементами: xsl:param, который объявляет в правиле шаблона новый параметр и xsl:with-param, который указывает значение параметра при вызове правила.

Элемент xsl:param имеет следующий синтаксис:

<xsl:param

 name="имя"

 select="выражение"

 as="тип-переменной"

required="yes" | "no"

  tunnel="yes" | "no"

>

 <!--

 Содержимое: конструктор последовательности 

-->

</xsl:param>

Элемент xsl:template, задающий в преобразовании правило шаблона, может включать несколько элементов xsl:param, которые и будут определять параметры этого правила. Кроме этого, xsl:param может указываться в виде элемента верхнего уровня: в этом случае он будет определять глобальный параметр.

Элемент xsl:param объявляет параметр с именем, которое задается обязательным атрибутом name. Имя параметра может иметь расширенную форму, например "user:param", но обычно параметрам дают простые имена. Все остальные атрибуты являются необязательными.

Если параметр не задается при вызове и если параметр не является обязательным, то значение параметра задается либо с помощью выражения в атрибуте select, либо в конструкторе последовательности.

Необязательный атрибут as задает тип переменной (один из типов XPath).

Атрибут required задает тип параметра: обязательный ("yes") или необязательный ("no").  Если параметр является параметром функции, то он по умолчанию является обязательным и атрибут required задавать не надо.

Атрибут tunnel задает, является ли параметр туннельным ("yes") или нет ("no"). Туннельный параметр автоматически передается вызванным шаблоном тому шаблону, который, в свою очередь вызывается вызванным шаблоном. По умолчанию значение этого атрибута равно "no".

Параметру может быть присвоено значение по умолчанию, т.е. значение, которое будет использоваться в случае, если параметра с таким именем правилу шаблона передано не было. Значение по умолчанию вычисляется следующим образом:

  •  если в элементе xsl:param определен атрибут select, то значением по умолчанию будет результат вычисления выражения, указанного в этом атрибуте;
  •  если атрибут select не определен, но сам элемент xsl:param имеет дочерние узлы, то значением определяемого параметра по умолчанию будет фрагмент дерева, полученного в результате выполнения содержимого xsl:param;
  •  если атрибут select не определен и при этом сам элемент xsl:param пуст, то значением параметра по умолчанию будет пустая строка.

Примеры объявления параметров:

1. Элемент

<xsl:param name="x" select="2 * 2"/>

создаст параметр, значением которого по умолчанию будет 4.

2. Элемент

<xsl:param name="x"/>

то есть, когда в нем нет ни атрибута select, ни содержимого, присвоит параметру пустую строку, то есть будет эквивалентно

<xsl:param name="x" select="''"/>

Точно так же, как и в случае с переменными, значение заданного в правиле шаблона параметра можно использовать в выражениях, добавляя перед именем параметра префикс "$". К примеру, значение параметра x может быть получено с помощью обращения $x.

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

Для того чтобы передать в правило шаблона определенные значения параметров, элементы, которые вызывают этот шаблон, должны содержать один или несколько элементов xsl:with-param. Глобальные параметры, объявленные элементами xsl:param верхнего уровня, также могут быть переданы преобразованию, однако конкретный механизм реализации этой передачи целиком и полностью зависит от реализации конкретного процессора.

Элемент xsl:with-param имеет следующий синтаксис:

<xsl:with-param

name="имя"

select="выражение"

 as="тип-переменной"

  tunnel="yes" | "no"

>

 <!--

 Содержимое: конструктор последовательности 

--> 

</xsl:with-param>

Как видно из синтаксиса, элемент xsl:with-param идентичен элементу xsl:param (отличаются только их имена). Действуют они также практически одинаково: элемент xsl:with-param тоже связывает с именем параметра значение, и при выполнении шаблона это значение будет использоваться вместо значения параметра по умолчанию.

Таким образом, значение параметра, заданного в шаблоне, выбирается в соответствии со следующими положениями:

  •  если в элементе, который вызывает этот шаблон, присутствует элемент xsl:with-param, передающий значение этого параметра, в шаблоне будет использоваться переданное значение;
  •  если в элементе, который вызывает этот шаблон, элемента xsl:with-param, с соответствующим именем нет, в качестве значения параметра будет использоваться значение по умолчанию.

Элемент xsl:with-param может использоваться только в качестве дочернего элемента xsl:apply-templates и xsl:call-template.

Параметры могут быть использованы как в именованных, так и в неименованных правилах шаблона. Именованные правила с параметрами ведут себя как функции, т.е. они могут вызываться с определенными параметрами вне зависимости от контекста, только чтобы выполнить какие-либо действия с переданными значениями. В случае обычных, неименованных правил, параметры могут предоставлять некую дополнительную информацию.

Пример использования параметра в именованном шаблоне:

Пусть задан шаблон с именем day-name, который выводит сокращение названия для недели по его номеру. Номер дня передается в шаблон параметром с именем day-number.

<xsl:template name="day-name">

<xsl:param name="day-number" select="0"/>

</xsl:template>

Вызов шаблона выполняется с помощью следующего элемента:

<xsl:call-template name="day-name">

<xsl:with-param name="day-number" select="l"/>

</xsl:call-template>

Пример использования параметра в неименованном шаблоне:

<xsl:template match="menuitem">

<xsl:param name="current" select="1"/>

</xsl:template>

Вызов этого шаблона выполняется с помощью следующего элемента:

<xsl:template match="menu">

<xsl:apply-templates select="menuitem">

<xsl:with-param name="current"/>

</xsl:apply-templates>

</xsl:template>.

Поскольку при вызове атрибут select не указан, будет использовано значение по умолчанию (select="l").

5.3.18.4. Функции стилей в XSLT

Элемент-объявление xsl:function определяет функцию стилей, которая имеет следующий синтаксис:

<xsl:function

  name="имя"

  as="тип"

  override="yes" | "no"

>

  <!--

 Содержимое: элементы xsl:param,

 конструктор последовательности 

-->

</xsl:function>

Функция стилей может быть вызвана в любом выражении XPath документа XSLT.

Обязательный атрибут name задает имя функции.

Необязательный атрибут as задает тип возвращаемого функцией значения (один из типов XPath 2.0). Если этот атрибут задан, полученное в функции значение преобразуется к заданному типу. Если такое преобразование невозможно, генерируется сообщение об ошибке. Если  атрибут as не задан,  полученное в функции значение возвращается без преобразования.

В XSLT допустимы функции с одинаковыми именами. Если функции с одинаковыми именами имеют разное количество параметров, то вызов функции выполняется по количеству заданных аргументов. Если у нескольких функций совпадают их имена и количество параметров, то преимущественный вызов функции задается с помощью необязательного атрибута override. Если значение этого атрибута равно "yes", то будет вызвана эта функция, если "no" – другая функция с тем же именем и с тем же количеством параметров.

Содержимое элемента xsl:function состоит из 0 и более элементов xsl:param, за которыми конструктор последовательности, определяющей значение, возвращаемое функцией.

5.3.19. Дополнительные функции XSLT

Помимо рассмотренных выше функций format-number и key, а также унаследованных от XPath функций, в XSLT определены следующие функции:

  •  document() – для доступа к узлам во внешнем документе XML:
  •  current() – возвращает текущий узел;
  •  generate-id() – возвращает строку, которая уникальным образом идентифицирует узел;
  •  system-property() – возвращает значение системного свойства;
  •  unparsed-entity-uri() – возвращает URI неанализируемой сущности;
  •  function-available() – возвращает true, если функция поддерживается процессором XSLT, иначе false;
  •  element-available() – возвращает true, если элемент поддерживается процессором XSLT, иначе false.

5.3.19.1. Функция document()

Функция document() позволяет обращаться к внешним документам по их URI и имеет следующее описание:  

набор-узлов document(объект, базовый-набор-узлов).

Функция document() возвращает множество узлов. В простейшем случае это множество будет состоять из корневого узла внешнего документа, но функцию document() можно использовать в более сложных выражениях XPath, например, в выражениях фильтрации. Так функция

<xsl:copy-of

select="document('http://www.w3.org')/html/body/a"/>

скопирует все элементы a, находящиеся в теле (/html/body) внешнего документа.

URI, которые передаются функции document(), могут быть как абсолютными, так и относительными, например, вызов document('doc.xml') возвратит корень документа doc.xml, находящегося в том же каталоге, что и само преобразование.

Функция document() позволяет менять «точку отсчета» относительных URI. Если в качестве второго аргумента функции document() передано множество узлов, то относительные идентификаторы ресурсов будут отсчитываться от базового адреса первого (в порядке просмотра документа) узла этого множества.

Базовым URI узла дерева является:

  •  если элемент или инструкция по обработке принадлежит внешней сущности, базовым URI соответствующего узла будет URI внешней сущности;
  •  иначе базовым URI является URI документа;
  •  базовым URI текстового узла, узла атрибута, комментария или пространства имен является базовый URI родительского элемента.

Если в качестве параметра функции document() задать пустую строку:

document(''),

то функция возвратит корневой узел самого преобразования, т.е. при помощи document() можно получать доступ к информации, хранящейся в самом преобразовании.

Пример использования функции document():

Добавление нового сообщения в документ XML message.xml. Новое сообщение также представляет собой действительный документ XML newmessage.xml:

<?xml version="1.0" encoding="Windows-1251"?>

<!DOCTYPE message SYSTEM "message.dtd">

<message>

<header>

<from address="sidorov@mail.com"/>

<to address="ivanov@mail.com"/>

<subject>О встрече</subject>

</header>

<body>Давай перенесем на 11.00.</body>

</message>.

Правило преобразования XSLT будет иметь следующий вид:

<?xml version="1.0" encoding="Windows-1251"?>

<xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="xml"

   encoding="Windows-1251" indent="yes"/>   

 <xsl:template match="/">

   <xsl:text disable-output-escaping="yes">

 &lt;!DOCTYPE message SYSTEM "message.dtd"&gt;

   </xsl:text>

   <xsl:element name="message">

 <xsl:copy-of    

       select="document('message.xml')/message/*"/>

<xsl:copy-of   

 select="document('newmessage.xml')/message/*"/>

 </xsl:element>

 </xsl:template>

</xsl:stylesheet>.

В результате выполнения преобразования в выходном документе XML в элементе message будут содержаться три сообщения. 

5.3.19.2. Функция current()

Функция current() возвращает множество, состоящее из текущего узла преобразования, и имеет следующее описание:

набор-узлов current().

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

Предположим, что нужно выбрать элементы to со значением атрибута address, равным значению этого атрибута у текущего узла.

Путь выборки будет выглядеть как to[предикат], где предикат должен определять условие равенства атрибутов текущего узла и выбираемого узла. Предикат будет вычисляться в контексте проверяемого элемента to, поэтому все относительные пути выборки типа @address или ./@address или self::to/@address будут отсчитываться именно от проверяемого элемента. В этом случае узел контекста и текущий узел преобразования – не одно и то же.

Для того чтобы обратиться в предикате именно к текущему узлу, следует использовать функцию current():

to[@address=current()/@address].

Это выражение выберет все дочерние элементы to текущего узла, значение атрибута address которых будет таким же, как и у него.

5.3.19.3. Функция generate-id()

Функция generate-id() возвращает уникальный строковый идентификатор первого в порядке просмотра документа узла, передаваемого ей в виде аргумента. Описание функции имеет следующий вид:

строка generate-id(набор-узлов).

Если аргумент опущен, функция возвращает уникальный идентификатор контекстного узла. Если аргументом является пустое множество, функция должна возвращать пустую строку.

Функция generate-id() обладает следующими свойствами:

  •  функция возвращает для двух узлов один и тот же идентификатор тогда и только тогда, когда эти два узла совпадают (т.е. для разных узлов функция обязательно возвратит разные идентификаторы);
  •  возвращаемый идентификатор состоит только из цифр и букв ASCII и начинается буквой (то есть идентификатор синтаксически является корректным именем XML и может использоваться как имя элемента, атрибута, как значение атрибута ID или в любом другом месте, где могут использоваться имена XML).

Спецификация не определяет никакого стандартного метода реализации функции generate-id(), поэтому каждый процессор может генерировать идентификатор по-своему.

Пример использования функции generate-id():

Присваивание заголовкам сообщений в message.xml уникального идентификатора сообщения в атрибуте id:

<?xml version="1.0" encoding="Windows-1251"?>

<xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="xml"

   encoding="Windows-1251" indent="yes"/>   

 <xsl:template match="@*|node()">

   <xsl:copy>

 <xsl:apply-templates select="@*|node()"/>

   </xsl:copy>

 </xsl:template>

 <xsl:template match="header">

   <xsl:copy>

     <xsl:attribute name="id">

   <xsl:value-of select="generate-id()"/>

  </xsl:attribute>

 <xsl:apply-templates select="@*|node()"/>

   </xsl:copy>

 </xsl:template>

</xsl:stylesheet>.

В результате выполнения этого преобразования в процессоре MSXML элементы заголовков первого и второго сообщений будут выглядеть следующим образом:

<header id="IDA4ASKB">

<header id="IDAHBSKB">,

а в процессоре Saxon:

<header id="d0e5">

<header id="d0e18">.

5.3.19.4. Функция system-property()

Функция system-property() возвращает значение свойства, которое определяется ее строковым параметром, и имеет следующее описание:

объект system-property(строка).

Аргумент этой функции должен представлять расширенное имя системного свойства. Если процессор не поддерживает свойство с таким именем, функция должна вернуть пустую строку.

Эта функция предназначена для получения информации об окружении, в котором производится преобразование. В спецификации XSLT указано, что все процессоры в обязательном порядке должны поддерживать следующие системные свойства:

  •  xsl:version – это свойство должно возвращать номер версии языка XSLT, которую поддерживает данный процессор;
  •  xsl:vendor – это свойство должно возвращать текстовую информацию о производителе используемого процессора;
  •  xsl:vendor-url – это свойство должно возвращать URL производителя (как правило, это адрес Web-сайта производителя процессора).

Пример использования функции system-property():

Следующее преобразование копирует содержимое документа message.xml в выходной файл и добавляет комментарий, содержащий значения системных свойств для выполненного преобразования:

<?xml version="1.0" encoding="Windows-1251"?>

<xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="xml"

   encoding="Windows-1251" indent="yes"/>   

 <xsl:template match="/">

   <xsl:comment>

 <xsl:text>&#xA;XSLT Version: </xsl:text>

 <xsl:value-of

  select="format-number(

       system-property('xsl:version'),'0.0')"/>

 <xsl:text>&#xA;XSLT Processor: </xsl:text>

 <xsl:value-of

       select="system-property('xsl:vendor')"/>

 <xsl:text>&#xA;URL: </xsl:text>

 <xsl:value-of

  select="system-property('xsl:vendor-url')"/>

 <xsl:text>&#xA;</xsl:text>

   </xsl:comment>

   <xsl:text>&#xA;</xsl:text>

 <xsl:apply-templates/>

 </xsl:template>

 <xsl:template match="@*|node()">

   <xsl:copy>

 <xsl:apply-templates select="@*|node()" />

   </xsl:copy>

 </xsl:template>

</xsl:stylesheet>.

Для процессора MSXML комментарий будет иметь следующий вид:

<!--

XSLT Version: 1.0

XSLT Processor: Microsoft

URL: http://www.microsoft.com

-->,

а для процессора Saxon:

<!--

XSLT Version: 1.0

XSLT Processor: SAXON 6.5.2 from Michael Kay

URL: http://saxon.sf.net/

-->.

5.3.19.5. Функция unparsed-entity-uri()

Функция unparsed-entity-uri() возвращает уникальный идентификатор ресурса, который соответствует неанализируемой внешней сущности и имеет следующее описание:

строка unparsed-entity-uri(строка).

В качестве аргумента функции задается имя неанализируемой внешней сущности.  

Пример использования функции unparsed-entity-uri():

Следующее преобразование XSLT для message.xml:

<?xml version="1.0" encoding="Windows-1251"?>

<xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="html"

   encoding="Windows-1251" indent="yes"/>   

 <xsl:template match="/">

   <html>

 <head>

   <title>Вывод сообщений с изображениями</title>

 </head>

 <body>

   <xsl:apply-templates select="message"/>

   <hr />

 </body>

   </html>

 </xsl:template>

 <xsl:template match="header">

   <hr />

   <xsl:text>Сообщение </xsl:text>

   <xsl:number count="header"/>

   <xsl:text>. </xsl:text>

   <xsl:apply-templates select="from"/>

<xsl:apply-templates select="to"/>

<xsl:apply-templates select="subject"/>

  </xsl:template>

  <xsl:template match="from">

  <p>От:

<xsl:value-of select="@address"/>

  </p>

  </xsl:template>

  <xsl:template match="to">

  <p>Кому:

<xsl:value-of select="@address"/>

  </p>

  </xsl:template>

  <xsl:template match="subject">

  <p>Тема:

<xsl:value-of select="."/>

  </p>

  </xsl:template>

  <xsl:template match="body">

 <p>Текст:

  <xsl:value-of select="."/>

 </p>

<xsl:variable name="img"

      select="preceding-sibling::header[1]/from/@image"/>

<xsl:for-each

      select="preceding-sibling::header[1]/from/@*">

  <xsl:if test="name() = 'image'">

    <table border="3"><tr><td>

    <xsl:element name="img">

  <xsl:attribute name="src">

    <xsl:value-of

              select="unparsed-entity-uri($img)"/>

      </xsl:attribute>

    </xsl:element>

    </td></tr></table>

  </xsl:if>

</xsl:for-each>

 </xsl:template>

</xsl:stylesheet>

создаст следующий документ HTML:

<html>

 <head>

   <META http-equiv="Content-Type"

     content="text/html; charset=Windows-1251">

   <title>Вывод списка сообщений с изображениями</title>

 </head>

 <body>

   <hr>Сообщение 1. <p>От: ivanov@mail.com</p>

   <p>Кому: petrov@mail.com</p>

   <p>Тема: Поздравление</p>

   <p>Текст: Поздравляю с днем рождения!</p>

   <table border="3"><tr><td>

<img src="file:///d:/images/greeting.gif">

   </td></tr></table>

   <hr>Сообщение 2. <p>От: ivanov@mail.com</p>

   <p>Кому: sidorov@mail.com</p>

   <p>Тема: Напоминание</p>

   <p>Текст: Встречаемся в 10.00.</p>

   <hr>

 <body>

</html>.

5.3.20 Использование расширений в XSLT

5.3.20.1. Средства расширения XSLT

Язык XSLT является специализированным языком программирования, в котором практически отсутствуют стандартные возможности обычных языков программирования, например, работа с текстом, датами и т.д. Разработчики языка отказались от дублирования средств обычных языков программирования в XSLT.  Вместо этого спецификация XSLT позволяет процессорам предоставлять интерфейсы для расширения XSLT и XPath за счет использования других языков программирования, например, Java, JavaScript или C/C++.

Однако использование механизма расширений предъявляет определенные требования и накладывает некоторые ограничения, поскольку реализация механизма расширений в текущей версии языка целиком и полностью зависит от производителей процессоров. Вследствие этого интерфейсы расширения различных процессоров XSLT могут отличаться даже для одного языка программирования. Это в итоге ведет к несовместимости расширений и непереносимости преобразований XSLT между различными процессорами. Кроме того, возможность использования того или иного языка для написания расширений зависит от наличия интерфейса процессора XSLT для этого языка, то есть расширения привязывают преобразования к строго определенному процессору или, в лучшем случае, группе процессоров.

Существуют два способа расширения XSLT: при помощи функций и элементов расширения. Не изменяя структуры преобразований, два эти способа позволяют использовать при обработке документов возможности традиционных языков, что часто бывает очень полезно, а иногда и просто необходимо.

Обычно, если при выполнении преобразования XSLT процессор встречает незнакомый элемент (например, дескриптор HTML), то он просто копирует его в выходной документ. Если же встречается незнакомая функция, то процессор либо выдает ошибку, либо игнорирует вызов этой функции. Поэтому для того, чтобы использовать элементы расширения в преобразованиях, необходимо:

  •  задать пространство или пространства имен для элементов и/или функций расширения;
  •  определить это пространство имен в атрибуте extension-element-prefixes элемента xsl:stylesheet или xsl:transform, либо корневого элемента (при использовании упрощенной записи);
  •  использовать в преобразовании элемент или функцию с заданным префиксом.

Кроме того, если в выходном документе необходимо исключить некоторые префиксы из заданного пространства имен расширения их надо задать в атрибуте exclude-result-prefixes элемента xsl:stylesheet или xsl:transform, либо корневого элемента упрощенной записи.

Для того, чтобы определить, поддерживает ли процессор элемент или функцию расширения, в XSLT введены две функции:

булевское-значение element-available(строка)

и

 булевское-значение function-available(строка).

В качестве аргументов этих функций задается имя элемента или функции. Функции возвращают значение true, если элемент или функция доступны в процессоре и false – в противном случае.

Пример использования элементов element-available и function-available:

Следующие фрагменты преобразования проверяют возможность использования элемента xsl:comment и функции sum()для выходного документа HTML:

<xsl:choose>

 <xsl:when test="element-available('xsl:comment')">

   <p>xsl:comment is supported.</p>

 </xsl:when>

 <xsl:otherwise>

  <p>xsl:comment is not supported.</p>

 </xsl:otherwise>

</xsl:choose>

<xsl:choose>

 <xsl:when test="function-available('sum')">

   <p>sum() is supported.</p>

 </xsl:when>

 <xsl:otherwise>

   <p>sum() is not supported.</p>

 </xsl:otherwise>

</xsl:choose>.

Кроме этого, в XSLT определен элемент xsl:fallback, определяющий инструкции, которые будут выполняться, если процессор не поддерживает какой-либо элемент расширения. Этот элемент имеет следующий синтаксис:

<xsl:fallback>

<!-- Содержимое: шаблон -->

</xsl:fallback>.

Пример использования элемента xsl:fallback:

Следующий фрагмент преобразования в случае отсутствия в процессоре элемента xsl:loop выполняет вместо него элемент xsl:for-each:

<xsl:loop select="from">  

   <xsl:fallback>

     <xsl:for-each select="title">  

       <xsl:value-of select="."/>

     </xsl:for-each>  

   </xsl:fallback>  

 </xsl:loop>.

5.3.20.2. Инициатива EXSLT

Как показывает практика, задачи, которые приходится решать при помощи расширений, как правило, совершенно стандартны, например работа с датами.  Для того, чтобы избежать дублирования общих проблем, была создана так называемая инициатива EXSLT (Extended XSLT).

В рамках EXSLT создаются стандартные библиотеки расширений XSLT для различных процессоров. Кроме того, EXSLT активно поддерживается многими разработчиками процессоров XSLT с тем, чтобы обеспечить переносимость преобразований, использующих расширения EXSLT.

Библиотеки расширений EXSLT можно загрузить с сайта http://www.exslt.org.

На данном этапе разработанные в рамках EXSLT библиотеки включают в себя следующие модули:

  •  Common – общие функции и элементы расширения (включает функции exslt:node-set и exslt:object-type и элемент exslt:document).
  •  Math – математические функции.
  •  sets – функции для работы с множествами узлов (пересечение, разность и т.д.);
  •  Functions – элементы для определения пользовательских функций;
  •  Dates and Times – элементы  и функции для работы с временными параметрами;
  •  Strings – модуль для работы со строками;
  •  Regular Expressions – функции для работы с регулярными выражениями.

EXSLT покрывает большинство стандартных задач расширений и, кроме того, библиотеки EXSLT могут послужить хорошим примером программирования расширений.

5.3.20.3. Средства расширения в процессоре MSXML

В процессоре MSXML определен единственный элемент расширения верхнего уровня msxsl:script, используемый для объявления переменных и создания пользовательских функций. Этот элемент имеет следующий синтаксис:

<msxsl:script

  language = "имя-языка"

  implements-prefix = "префикс-пространства-имен">

 <!-- Функция языка сценариев -->

</msxsl:script>.

Атрибут language задает используемый язык сценариев (по умолчанию, язык JScript), а атрибут implements-prefix задает префикс пространства имен для создаваемых переменных или функций.

Пример использования элемента msxsl:script:

В следующем преобразовании используется пользовательская функция isImage(), которая возвращает true, если в элементе from документа message.xml задано два атрибута (т.е. задан атрибут image) и false – в противном случае:   

<?xml version="1.0" encoding="Windows-1251"?>

<xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 xmlns:msxsl="urn:schemas-microsoft-com:xslt"

 xmlns:user="http://mycompany.com/mynamespace">

 <xsl:output method="text" encoding="Windows-1251"/>

 <msxsl:script language="JScript"

   implements-prefix="user">

   function isImage(nodelist) {

 attributesNumber = nodelist(0).attributes.length;

 if(attributesNumber > 1)

   return true;

 else

   return false;

   }

 </msxsl:script>

 <xsl:template match="//header">

   <xsl:apply-templates select="from"/>

 </xsl:template>

 <xsl:template match="from">

   <xsl:text>&#xA;Сообщение </xsl:text>

   <xsl:number count="header"/>

   <xsl:text>. От: </xsl:text>

   <xsl:value-of select="@address"/>

   <xsl:if test="user:isImage(.)">

     <xsl:text> (с изображением)</xsl:text>

   </xsl:if>

 </xsl:template>

 <xsl:template match="text()">

   <xsl:apply-templates/>

 </xsl:template>

</xsl:stylesheet>.

В результате выполнения этого преобразования в MSXML будет выведен следующий текст:

Сообщение 1. От: ivanov@mail.com (с изображением)

Сообщение 2. От: ivanov@mail.com.

5.3.20.4. Средства расширения в процессоре Saxon

В процессоре Saxon определено большое количество функций и элементов расширения. Кроме того, в некоторые элементы XSLT добавлены новые атрибуты.

В процессоре Saxon добавлены следующие функции расширения:

  •  функции, выполняющие операции с наборами узлов: after(), before(), closure(), difference(), distinct(), highest(), intersection(), leading(), line-number(), lowest(), node-set(), range();
  •  математические функции: eval(), evaluate(), expression(), max(), min(), sum();
  •  булевские функции: exists(), for-all(), has-same-nodes(), if(), if-null();
  •  строковые функции: path() и tokenize();
  •  функции для работы с пользовательскими данными:  get-user-data() и set-user-data();
  •  функция get-pseudo-attribute() для инструкций по обработке;
  •  функция systemId() для сущностей.

Кроме того, процессор Saxon поддерживает функции модулей Common, Math, Sets, DatesAndTimes и Functions библиотеки EXSLT.

Элементы расширения процессора Saxon обеспечивают следующие возможности:

  •  изменение значения присвоенной переменной (элемент saxon:assign и дополнительный атрибут saxon:assignable в элементе xsl:variable);
  •  генерацию DTD в выходном документе (элементы dtd:doctype, dtd:element, dtd:attlist, dtd:attribute, dtd:entity и dtd:notation);
  •  вставку ссылки на сущность в выходном документе (элемент entity-ref);
  •  задания функций XSLT для преобразований (элементы saxon:function и saxon:return);
  •  операции итерации над узлами (элементы saxon:group , saxon:item и saxon:while);
  •  выполнение шаблонных правил, написанных на языке Java (элемент saxon:handler);
  •  формирование нескольких выходных документов (элементы saxon:output и xsl:document);
  •  просмотр больших документов по частям (поддеревьям) (элемент saxon:preview);
  •  выполнение пользовательских функций расширения на языке Java (элемент saxon:script и xsl:script).

В некоторые элементы XSLT включены следующие дополнительные атрибуты:

  •  атрибут saxon:trace для разрешения или запрещения трассировки выполнения шаблонных правил (для элементов xsl:stylesheet и xsl:template);
  •  атрибут saxon:allow-avt для разрешения или запрещения использования в атрибуте name значения шаблона имени атрибута (для элемента xsl:call-template);
  •  атрибут saxon:disable-output-escaping для разрешения или запрещения вывода специальных символов в значении атрибута (для элемента xsl:attribute).

Для элементов xsl:output и xsl:document в значениях атрибута method можно использовать следующие дополнительные значения:

  •  значение "fop" в процессор XSL Apache FOP;
  •  значение "xhtml" для вывода документа в формате XHTML;
  •  полное имя класса, реализующего интерфейс SAX2 org.xml.sax.ContentHandler, или подкласса класса com.icl.saxon.output.Emitter для направления вывода в этот класс.   

Кроме того, если значение атрибута method равно "fop", то можно задать два дополнительных атрибута: fop:renderer, определяющего имя класса FOP Renderer и fop:configuration, определяющего имя файла конфигурации  пользователя в  FOP.  

Для элементов xsl:output и xsl:document также определены следующие дополнительные атрибуты:

  •  атрибут saxon:indent-spaces определяет количество отступов (пробелов) для каждого уровня в выходных документах XML и HTML;
  •  атрибут saxon:character-representation для управления выводом в выходном документе символов, не являющихся символами ASCII;
  •  атрибут saxon:omit-meta-tag запрещает или разрешает вывод  дескриптора <meta> в выходном документе HTML;
  •  атрибут saxon:next-in-chain направляет вывод в другой документ.

В процессоре Saxon можно также использовать методы классов библиотеки Java.

Статические методы (методы класса) можно вызывать прямо по их имени, определив для них пространство имен в виде "java:полное-имя-класса" в том же элементе, где используется этот метод или в элементе верхнего уровня, например:

<xsl:value-of select="math:sqrt($arg)"

   xmlns:math="java:java.lang.Math"/>.

Если используются методы объекта, предварительно генерируется объект этого класса с помощью метода new(список-аргументов), а затем к нему применяется необходимый метод. Так, следующие фрагменты кода:

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

     xmlns:date="java:java.util.Date">

 …

   <p><xsl:value-of

    select="date:toString(date:new())"/></p>

сначала создает объект класса Date для текущих даты и времени, используя конструктор без параметров, а затем преобразует созданный объект в строку.

И, наконец, в процессоре Saxon можно создавать собственные элементы расширения.

Файл: file:///web/1/5fan/public_html/www/files/13/5fan_ru_69062_ad5356644b84036367332482c3994882.doc   Создан: 2008-03-16T09:28:00Z Модифицирован: 2008-03-16T09:28:00Z     Автор:


 

А также другие работы, которые могут Вас заинтересовать

41667. Поиск данных и фильтрации в среде программирования Borland C++Builder 288.5 KB
  Компонент Table позволяет не только отображать, редактировать и упорядочивать данные, но и отсортировывать записи по определенным критериям. Фильтрация может задаваться свойствами Filter,Filtered и FilterOptions компонента Table.
41668. Создание теста средствами Excel 286.5 KB
  Наиболее интересными функциями Excel представляются логические, которые в сочетании с функциями обработки текста и арифметическими функциями позволяют создавать тестовые программы по любому предмету.
41669. Теорія множин 224.99 KB
  Об'єкти що складають множини називаються елементами і позначаються малими буквами латинського алфавіту. алфавіту А B C B А Букви російського алфавіту АВ С А А В SCI код А B C А В А C Цілі числа 0. алфавіту C B C B Букви російського алфавіту B C B C SCI код C B B C Цілі числа 0. алфавіту C B C B Букви російського алфавіту А В Δ C А C SCI код А В C B Δ А Цілі числа 0.
41671. Снятие ВАХ полупроводникового диода 100.29 KB
  Обратный ток диода значительно меньше прямого тока обратите внимание на различный масштаб измерения для прямого и обратного тока. Снимите последовательно зависимость Inp=fUnp а затем Iобр=fUo6p для диода. Полученные данные округлённые до сотых значений ампера при прямом включении и до десятых мкА при обратном включении диода занесите в таблицу 1.
41672. Определение электротехнических характеристик автомобильных кислотных аккумуляторных батарей 94.94 KB
  Характеристики АБ: 1 Марка АБ 2 Год выпуска 3 Материал моноблока 4 Материал сепараторов 5 Объем электролита л 6 Количество положительных пластин шт 7 Количество отрицательных пластин шт 8 Масса кг 9 Устанавливается на автомобиле 10 Емкость АБ Ач 11 Номинальное напряжение В 12 Максимальный разрядный ток А 13 Фирма изготовитель Характеристики АБ дать по справочной литературе для АБ. Комплект приборов и инструмента Э401 для ТО АБ обеспечивает проведение следующих операций: измерение уровня электролита в аккумуляторах ...
41673. Ознакомление со средой Autocad 2010 3.14 MB
  Интерфейс начальной настройки utoCD 2010 Ранние версии начиная с utoCD 2002 по utoCD 2008 включительно представляло интерфейс рабочего пространства в классическом виде которое представлено на рис. Рисунок 2 – Классический вид рабочего окна utoCD 2010 Предлагается рассмотреть вид классического интерфейса окна программы. 3 приведена верхняя часть окна Рисунок 3 – Строка заголовка строка меню панель быстрого вызова Рисунок 4 – Окно работы с файлом Данное окно вызывается нажатием на после чего выпадает окно представленное на...
41674. Исследование типовых звеньев 193.53 KB
  3 Контрольные вопросы: Что такое передаточная функция Что такое переходная характеристика Что такое импульсная разгонная характеристика Как параметры каждого типового звена влияют на переходные характеристики системы Назовите основные типовые динамические звенья их передаточные и переходные функции. Что такое характеристическое уравнение Что такое нули и полюса передаточной функции Как их найти Какие показатели качества САР можно определить по переходной характеристике Таблица 1.3 Контрольные вопросы: Что такое передаточная...