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

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

Жанры

Технология 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>

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

Эволюционер из трущоб

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

Вперед в прошлое 3

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

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

Тринадцатый VII

NikL
7. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VII

Директор

Семин Никита
5. Переломный век
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Директор

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Идеальный мир для Лекаря 25

Сапфир Олег
25. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 25

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Дареная истинная. Хозяйка лавки «С огоньком»

Дари Адриана
3. Драконы Эльвариама
Фантастика:
попаданцы
сказочная фантастика
фэнтези
5.00
рейтинг книги
Дареная истинная. Хозяйка лавки «С огоньком»

Брак по-драконьи

Ардова Алиса
Фантастика:
фэнтези
8.60
рейтинг книги
Брак по-драконьи

Имя нам Легион. Том 8

Дорничев Дмитрий
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 8