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

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

Жанры

Технология XSLT

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

Шрифт:

Мы опишем два способа объединения документов и преобразований. Первый основывается на использовании инструкции

xml-stylesheet
для того, чтобы закрепить за документом преобразование, находящееся внутри него самого. Во втором способе обрабатываемый документ включается в преобразование как пользовательский элемент верхнего уровня и обрабатывается при помощи функции
document('')
с пустым строковым параметром.

Включение преобразования в документ

Корневой элемент преобразования

xsl:stylesheet
может быть включен в преобразуемый документ со всеми дочерними элементами верхнего уровня и так далее. Для того чтобы использовать это преобразование, псевдоатрибут
href
инструкции по обработке
xml-stylesheet
должен указывать на идентификатор элемента
xsl:stylesheet
, определенный в его атрибуте
id
.

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

<?xml version="1.0"?>

<?xml-stylesheet type="text/xml" href="#"?>

<page>

 <title>Main page</title>

 <content>Main content</content>

 <xsl:stylesheet

id="transform"

version="1.0"

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

<xsl:template match="/">

<body title="{page/title}">

<xsl:text><xsl:value-of select="page/content"/></xsl:text>

</body>

</xsl:template>

<xsl:template match="xsl:stylesheet"/>

 </xsl:stylesheet>

</page>

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

<body title="Main page">

 Main content

</body>

Поскольку элемент

xsl:stylesheet
включен в преобразуемый документ, он также подвергнется преобразованию. Для того чтобы избежать этого, в преобразование включается шаблонное правило, которое указывает, что элементы
xsl:stylesheet
следует игнорировать:

<xsl:template match="xsl:stylesheet"/>

К сожалению, приходится констатировать тот факт, что описанную возможность (хотя она и включена в спецификацию языка XSLT) поддерживают очень немногие процессоры и поэтому пока что на нее не следует полагаться.

Включение документа в преобразование

Другой возможностью объединения документов и преобразований является включение элемента документа в преобразование в виде элемента верхнего уровня.

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

document
, так же, как если бы документ преобразования был внешним документом. Функция
document
,
которой в качестве параметра была передана пустая строка, возвращает множество, состоящее из корневого узла самого преобразования. То есть, если документ был включен в преобразование в качестве элемента верхнего уровня с именем, к примеру,
user:input
, получить доступ к нему можно при помощи выражения

document('')/xsl:stylesheet/user:input

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

<whatever/>

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

<xsl:stylesheet

 version="1.0"

 xmlns:user="urn:user"

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

 exclude-result-prefixes="user">

 <input xmlns="urn:user">

<a/>

<b/>

 </input>

 <xsl:template match="/">

<xsl:apply-templates

select="document('')/xsl:stylesheet/user:input"/>

</xsl:template>

 <xsl:template match="user:a">

<A/>

 </xsl:template>

 <xsl:template match="user:b">

<B/>

 </xsl:template>

 <xsl:template match="user:input">

<output>

<xsl:apply-templates/>

</output>

 </xsl:template>

</xsl:stylesheet>

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

<output>

 <A/>

 <B/>

</output>

Следует обратить внимание на следующие особенности этого примера.

□ Элементы верхнего уровня в обязательном порядке должны иметь ненулевое пространство имен. Поэтому мы включили элемент

input
и все его дочерние узлы в пространство имен
urn:user
. В листинге 4.23 эти элементы выделены полужирным шрифтом.

□ В шаблонах, которые обрабатывают элементы включенного документа, должны указываться паттерны, соответствующие расширенным именам этих элементов, то есть не

input
, a
user:input
.

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

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф

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

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

Начальник милиции. Книга 3

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

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Адаптация

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

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

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

Курсант: назад в СССР 9

Дамиров Рафаэль
9. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: назад в СССР 9

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

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

Кодекс Охотника. Книга IX

Винокуров Юрий
9. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга IX

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Купец V ранга

Вяч Павел
5. Купец
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Купец V ранга

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

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

Студиозус

Шмаков Алексей Семенович
3. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус

Черный дембель. Часть 2

Федин Андрей Анатольевич
2. Черный дембель
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Черный дембель. Часть 2