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

на главную

Жанры

Технология XSLT

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

Шрифт:

<xsl:otherwise>

<xsl:value-of select="following-sibling::точка[1]/@y"/>

</xsl:otherwise>

</xsl:choose>

</xsl:variable>

<xsl:variable name="x2" select="number($x2r)"/>

<xsl:variable name="y2" select="number($y2r)"/>

<line

x1="{$x1 * math:cos($alpha-radian) -

$y1 * math:sin($alpha-radian) + 100}"

y1="{$x1 * math:sin($alpha-radian) +

$y1 * math:cos($alpha-radian) + 100}"

x2="{$x2 * math:cos($alpha-radian) -

$y2 * math:sin($alpha-radian) + 100}"

y2="{$x2 * math:sin($alpha-radian) +

$y2 * math:cos($alpha-radian) + 100}"/>

 </xsl:template>

</xsl:stylesheet>

Результатом

этого преобразования будет следующий документ.

Листинг 10.7. Результирующий SVG-документ

<!DOCTYPE svg

 PUBLIC "-//W3C//DTD SVG 1.0//EN"

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

<svg

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

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

 width="200"

 height="200">

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

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

<line

x1="81.68060041188197" y1="31.70359014757173"

x2="168.29640985242827" y2="81.68060041188197"/>

<line

x1="168.29640985242827" y1="81.68060041188197"

x2="118.31939958811803" y2="168.29640985242827"/>

<line

x1="118.31939958811803" y1="168.29640985242827"

x2="31.70359014757173" y2="118.31939958811803"/>

<line

x1="31.70359014757173" y1="118.31939958811803"

x2="81.68060041188197" y2="31.70359014757173"/>

 </g>

</svg>

Визуальное представление этого документа демонстрирует рис. 10.2, где представлен поворот, выполненный на 30°:

Рис. 10.2. Визуальное представление полученного SVG-документа

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

math
, которое было в него включено:

<svg

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

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

 width="200"

 height="200">

 ...

Это

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

<xsl:stylesheet

 version="1.0"

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

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

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

 exclude-result-prefixes="math">

 ...

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

Листинг 10.8. Класс, вычисляющий координаты точки после поворота

package de.fzi.xslt;

public class rot {

 public static double X(double x, double y, double degree) {

double radian = Math.PI * degree / 180;

return x * Math.cos(radian) - y * Math.sin(radian);

 }

 public static double Y(double x, double y, double degree) {

double radian = Math.PI * degree / 180;

return x * Math.sin(radian) + y * Math.cos(radian);

 }

}

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

xsl:stylesheet
:

<xsl:stylesheet

 version="1.0"

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

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

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

 exclude-result-prefixes="rot">

Создание элемента

line
теперь может быть записано в виде:

<line

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

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

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

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

Как мы отмечали выше, интерфейсы использования функций расширения весьма различаются между разными процессорами даже в случае такого переносимого языка, как Java. Отличия могут быть и в форме вызовов функций, и в форме объявлений пространств имен. Например, в процессоре Saxon пространство имен для класса

de.fzi.xslt.rot
может быть объявлено как:

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

Неудержимый. Книга 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