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

на главную

Жанры

Технология XSLT

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

Шрифт:

В этом разделе мы рассмотрим иной подход к реализации операций над множествами, основанный на очень простом определении принадлежности узла множеству. Узел

node
принадлежит множеству
nodeset
тогда и только тогда, когда выполняется равенство

count($nodeset) = count($node | $nodeset)

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

Таблица 11.1. Операции над множествами

Операция Графическое
представление
XPath-выражение
Объединение
$A | $B
Пересечение
$А[count(.|$B)=count($B)]
Разность
$A[count(.|$B)!=count($B)]
Симметрическая разность
$A[count(.|$B)!=count($B)] | $B[count(.|$A)!=count($A)]

Приведенные выше методы были разработаны Майклом Кеем (Michael Kay, Software AG), Оливером Беккером (Oliver Becker, Humboldt-Universitat zu Berlin), Кеном Холманом (Ken Holman, Crane Softwrights Ltd.) и публикуются с любезного разрешения авторов.

Перенос строк и элементы BR

Большинству читателей, скорее всего, хорошо знаком такой элемент языка HTML, как

BR
, который используется для обозначения разрыва строки. В обычных текстовых файлах для той же самой цели используются символы с кодами
#xA
,
#xD
или их комбинации в зависимости от платформы. При совместном использовании неразмеченного текста и HTML часто возникает задача преобразования символов перевода строки в элементы
BR
и наоборот.

Замену элемента

BR
на текстовый узел, содержащий перевод строки, можно проиллюстрировать следующим тривиальным шаблоном.

Листинг 11.16. Шаблон замены элементов BR на перенос строки

<xsl:template match="BR">

 <xsl:text>&#xA;</xsl:text>

</xsl:template>

Гораздо сложнее написать шаблон, делающий обратную операцию, — замену символов переноса строки на элементы BR. В XSLT нет встроенного механизма для замены подстроки в строке (тем более на элемент), поэтому нам придется создать для этой цели собственный шаблон.

Для этой цели мы можем воспользоваться функциями

substring-before
и
substring-after
. Функция
substring-before($str, $search-for)
возвратит часть строки
str
, которая предшествует первому вхождению в нее подстроки
search-for
, а функция
substring-after($str, $search-for)
последующую часть. То есть заменить первое вхождение можно шаблоном вида

<!-- ...
– ->

<xsl:value-of select = "substring-before($str, $search-for)"/>

<xsl:copy-of select = "$replace-with"/>

<xsl:value-of select = "substring-after($str, $search-for)"/>

<!-- ...
– ->

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

Листинг 11.17. Шаблон для замены подстроки в строке

<xsl:template name="replace" match="text" mode="replace">

 <xsl:param name="str" select="."/>

 <xsl:param name="search-for" select="'&#xA;'"/>

 <xsl:param name="replace-with">

<xsl:element name="BR"/>

<xsl:text>&#xA;</xsl:text>

 </xsl:param>

 <xsl:choose>

<xsl:when test="contains($str, $search-for)">

<xsl:value-of select="substring-before($str, $search-for)"/>

<xsl:copy-of select="$replace-with"/>

<xsl:call-template name="replace">

<xsl:with-param name="str"

select="substring-after($str, $search-for)"/>

<xsl:with-param name="search-for" select="$search-for"/>

<xsl:with-param name="replace-with " select="$replace-with"/>

</xsl:call-template>

</xsl:when>

<xsl:otherwise>

<xsl:value-of select="$str"/>

</xsl:otherwise>

 </xsl:choose>

</xsl:template>

Шаблон, приведенный в этом листинге, может быть вызван двумя способами: элементом

xsl:apply-templates
в режиме
replace
(в этом случае он будет обрабатывать текстовые узлы выбранного множества), или при помощи именного вызова элементом
xsl:call-template
. Шаблон принимает на вход три параметра.

□ Параметр

str
, содержащий строку, в которой нужно произвести замену. По умолчанию этому параметру присваивается текстовое значение текущего узла.

□ Параметр

search-for
, содержащий подстроку, которую требуется найти и заменить в строке
str
. По умолчанию замене будут подлежать символы переноса строки, "
&#хА;
".

□ Параметр

replace-with
, содержащий объект, на который следует заменять подстроки
search-for
. По умолчанию эти подстроки будут заменяться на элемент
BR
и следующий за ним перенос строки, добавленный для лучшей читаемости.

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

Проиграем?

Юнина Наталья
Любовные романы:
современные любовные романы
6.33
рейтинг книги
Проиграем?

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Сумеречный стрелок

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

Кремлевские звезды

Ромов Дмитрий
6. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кремлевские звезды

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

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

Камень. Книга 4

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

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Действуй, дядя Доктор!

Юнина Наталья
Любовные романы:
короткие любовные романы
6.83
рейтинг книги
Действуй, дядя Доктор!

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

(Бес) Предел

Юнина Наталья
Любовные романы:
современные любовные романы
6.75
рейтинг книги
(Бес) Предел

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

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

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8