Чтение онлайн

на главную - закладки

Жанры

Технология XSLT

Валиков Алексей Н.

Шрифт:

xmlns:rot="java:de.fzi.xslt.rot"

в Xalan — как:

xmlns:rot="xalan://de.fzi.xslt.rot"

в Oracle XSLT Processor — как:

xmlns:rot="http://www.oracle.com/XSL/Transform/java/de.fzi.xslt.rot"

При этом сами вызовы во всех трех случаях будут одинаковыми:

rot:X($x, $y, $angle)

для метода X или

rot:Y($x, $y, $angle)

для метода Y.

Функция function-available

При

использовании функций расширения всегда есть вероятность того, что это расширение в силу каких-либо причин поддерживаться данным процессором не будет. Чаще всего это случается, во-первых, когда процессор просто физически не в состоянии вызвать эту функцию (например, процессор, написанный на C++, вряд ли будет содержать средства для выполнения Java-кода), во-вторых, когда расширение недоступно (например, процессор не в состоянии найти указанный Java-класс или динамическую библиотеку), и в-третьих, когда пространство имен объявлено неверно (например, с URI
java:de.fzi.xslt.rot
вместо
xalan://de.fzi.xslt.rot
). Результатом обращения к неподдерживаемому расширению будет, естественно, ошибка.

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

function-available
(от англ. function is available — функция доступна)

boolean function-available(string)

Функция

function-available
принимает на вход строку, представляющую имя функции и возвращает
true
, если эта функция может быть вызвана и
false
— если нет.

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

QName
, то есть иметь вид
имя
или
префикс:имя
. В первом случае
function-available
проверяет, реализована ли в данном процессоре стандартная функция с таким именем, например
function-available('concat')
скорее всего, возвратит
true
.

В случае, если аргумент

function-available
имеет вид
префикс:имя
, функция
function-available
проверяет доступность указанной функции расширения. Например, для того, чтобы проверить, может ли в данном контексте быть вызвана функция
rot:X
, необходимо вычислить выражение

function-available('rot:X')

В данном случае

true
будет означать, что функция
rot:X
может быть вызвана,
false
— что функция в силу каких-то причин недоступна.

Функция

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

Пример

Для того чтобы обеспечить работоспособность расширения, реализованного классом

de.fzi.xslt.rot
в наиболее распространенных XSLT-процессорах, написанных на Java (как-то: Saxon, Xalan и Oracle XSLT Processor), прежде всего необходимо объявить соответствующие пространства имен:

<xsl:stylesheet

 version="1.0"

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

 xmlns="http://www.w3.org/2000/svg"

 xmlns:saxon="java:de.fzi.xslt.rot"

 xmlns:xalan="xalan://de.fzi.xslt.rot"

 xmlns:oracle="http://www.oracle.com/XSL/Transform/java/de.fzi.xslt.rot"

 exclude-result-prefixes="saxon xalan oracle">

...

Префикс

saxon
соответствует интерфейсу расширений в XSLT-процессоре Saxon, префикс
xalan
— процессору Xalan и префикс
oracle
— Oracle XSLT Processor.

Теперь осталось только найти поддерживаемый вариант расширения и произвести соответствующий вызов.

Листинг 10.9

<xsl:choose>

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

<line

x1="{saxon:X($x1, $y1, $alpha) + 100}"

y1="{saxon:Y($x1, $y1, $alpha) + 100}"

x2="{saxon:X($x2, $y2, $alpha) + 100}"

y2="{saxon:Y($x2, $y2, $alpha) + 100}"/>

 </xsl:when>

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

<line

x1="{xalan:X($x1, $y1, $alpha) + 100}"

y1="{xalan:Y($x1, $y1, $alpha) + 100}"

x2="{xalan:X($x2, $y2, $alpha) + 100}"

y2="{xalan:Y($x2, $y2, $alpha) + 100}"/>

 </xsl:when>

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

<line

x1="{oracle:X($x1, $y1, $alpha) + 100}"

y1="{oracle:Y($x1, $y1, $alpha) + 100}"

x2="{oracle:X($x2, $y2, $alpha) + 100}"

y2="{oracle:Y($x2, $y2, $alpha) + 100}"/>

 </xsl:when>

 <xsl:otherwise>

<xsl:message terminate="yes">

<xsl:text>Necessary extension function is not available.</xsl:text>

<xsl:text>&#xA;Supported processors are:</xsl:text>

<xsl:text>&#xA;Saxon, Xalan, Oracle XSLT Processor.</xsl:text>

Поделиться:
Популярные книги

Отморозок 2

Поповский Андрей Владимирович
2. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 2

Ротмистр Гордеев

Дашко Дмитрий Николаевич
1. Ротмистр Гордеев
Фантастика:
фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Ротмистр Гордеев

Фараон

Распопов Дмитрий Викторович
1. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Фараон

Мастер темных Арканов 5

Карелин Сергей Витальевич
5. Мастер темных арканов
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Мастер темных Арканов 5

Хозяйка лавандовой долины

Скор Элен
2. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Хозяйка лавандовой долины

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Метатель. Книга 2

Тарасов Ник
2. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 2

Брачный сезон. Сирота

Свободина Виктория
Любовные романы:
любовно-фантастические романы
7.89
рейтинг книги
Брачный сезон. Сирота

Чайлдфри

Тоцка Тала
Любовные романы:
современные любовные романы
6.51
рейтинг книги
Чайлдфри

Имперский Курьер

Бо Вова
1. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Имперский Курьер

Барон Дубов 4

Карелин Сергей Витальевич
4. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 4

Эволюционер из трущоб. Том 7

Панарин Антон
7. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 7

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости