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

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

Жанры

Технология XSLT

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

Шрифт:

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

Функции расширения

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

в преобразованиях обычные функции, например, функцию
concat
:

<xsl:value-of select="concat('para', 'bellum')"/>

Атрибут

select
содержит XPath-выражение
concat('para', 'bellum')
, которое с точки зрения синтаксиса XPath является вызовом функции и соответствует продукции
FunctionCall
:

[XP16] FunctionCall ::= FunctionName

'(' ( Argument ( ',' Argument ) * ) ? ')'

Аргументами функции являются выражения, а имя может быть любым корректным XML-именем (за исключением

node
,
comment
,
processing-instruction
и
text
, которые используются для проверки типа узла):

[XP17] Argument ::= Expr

[XP35] FunctionName ::= QName - NodeType

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

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

Пример

Выражение

round(0.6)

является вызовом функции базовой библиотеки XPath, в то время как выражение

math:round(0.6)

является вызовом функции расширения.

Практически во всех процессорах пространство имен функции расширения является звеном, которое связывает ее с конкретной реализацией.

Пример

<xsl:value-of select="math:round(0.6)" xmlns:math="java:java.lang.Math"/>

Элемент

xsl:value-of
вычисляет выражение
math:round(0.6)
, которое является вызовом функции расширения. Само имя функции состоит из локальной части round и префикса
math
, которому соответствует URI
java:java.lang.Math
. В большинстве XSLT-процессоров вызов такого рода будет означать обращение к статической функции
round
класса
java.lang.Math
.

Простейшим случаем использования расширений в XSLT-процессорах,

написанных на Java, является обращение к стандартным функциям пакетов Java.

Пример

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

Примечание

SVG — это XML-язык для описания масштабируемой векторной графики (от англ. scalable vector graphics). SVG позволяет простым XML-синтаксисом описывать векторную графику. SVG-документы могут показываться в браузерах при помощи таких компонент, как Adobe SVG Viewer или Batik от Apache XML Project.

Листинг 10.3. Входящий документ

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

<точки width="200" height="200">

 <точка x="-50" y="-50"/>

 <точка x=" 50" y="-50"/>

 <точка x=" 50" y=" 50"/>

 <точка x="-50" y=" 50"/>

</точки>

Листинг 10.4. Преобразование

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

<xsl:stylesheet

 version="1.0"

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

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

 <xsl:output

indent="yes"

doctype-public="-//W3C//DTD SVG 1.0//EN"

doctype-system="http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"/>

 <xsl:template match="/">

<svg width="200" height="200">

<desc>Simple line-based figure</desc>

<xsl:apply-templates select="точки"/>

</svg>

 </xsl:template>

 <xsl:template match="точки">

<g style="stroke:black; stroke-width:2">

<xsl:apply-templates select="точка"/>

</g>

 </xsl:template>

 <xsl:template match="точка">

<line

x1="{@x + 100}"

y1="{@y + 100}"

x2="{following-sibling::точка[1]/@x + 100}"

y2="{following-sibling::точка[1]/@y + 100}">

<xsl:if test="position = last">

<xsl:attribute name="x2">

<xsl:value-of

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

Кротовский, побойтесь бога

Парсиев Дмитрий
6. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кротовский, побойтесь бога

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Моя простая курортная жизнь

Блум М.
1. Моя простая курортная жизнь
Проза:
современная проза
5.00
рейтинг книги
Моя простая курортная жизнь

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

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

Отморозок 3

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

Неправильный боец РККА Забабашкин 3

Арх Максим
3. Неправильный солдат Забабашкин
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Неправильный боец РККА Забабашкин 3

Мужчина не моей мечты

Ардова Алиса
1. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.30
рейтинг книги
Мужчина не моей мечты

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Я граф. Книга XII

Дрейк Сириус
12. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я граф. Книга XII

Япона осень

Сухов Лео
6. Антикризисный Актив
Фантастика:
героическая фантастика
попаданцы
5.00
рейтинг книги
Япона осень

Возвышение Меркурия. Книга 2

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

Тайны затерянных звезд. Том 3

Лекс Эл
3. Тайны затерянных звезд
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Тайны затерянных звезд. Том 3

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

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