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

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

Жанры

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

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

Неудержимый. Книга XII

Боярский Андрей
12. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XII

Мастер 5

Чащин Валерий
5. Мастер
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Мастер 5

Идущий в тени 5

Амврелий Марк
5. Идущий в тени
Фантастика:
фэнтези
рпг
5.50
рейтинг книги
Идущий в тени 5

Три `Д` для миллиардера. Свадебный салон

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
7.14
рейтинг книги
Три `Д` для миллиардера. Свадебный салон

Проклятый Лекарь. Род II

Скабер Артемий
2. Каратель
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Проклятый Лекарь. Род II

Вальдиры миры. Кроу-3

Михайлов Дем Алексеевич
3. Кроу
Фантастика:
фэнтези
рпг
8.38
рейтинг книги
Вальдиры миры. Кроу-3

Новый Рал 8

Северный Лис
8. Рал!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Новый Рал 8

Приручитель женщин-монстров. Том 7

Дорничев Дмитрий
7. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 7

Системный Нуб

Тактарин Ринат
1. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Системный Нуб

Объединитель

Астахов Евгений Евгеньевич
8. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Объединитель

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода

Мимик нового Мира 7

Северный Лис
6. Мимик!
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 7

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Приручитель женщин-монстров. Том 2

Дорничев Дмитрий
2. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 2