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

на главную

Жанры

Технология XSLT

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

Шрифт:

В качестве примера отформатируем содержание следующего элемента:

<pre>One little rabbit

Two little rabbits

Three little rabbits</pre>

Запишем шаблон для обработки элемента

pre
:

<xsl:template match="pre">

 <xsl:copy>

<xsl:apply-templates mode="replace"/>

 </xsl:copy>

</xsl:template>

Результат

его выполнения будет иметь следующий вид:

<pre>One little rabbit<BR/>

Two little rabbits<BR/>

Three little rabbits</pre>

Данные, разделенные запятыми (CSV)

Рекурсивную методику замены, которую мы представили выше, можно использовать для того, чтобы разметить данные, разделенные запятыми (или CSV, comma-separated values). CSV — это старый простой формат представления данных, в котором они просто перечисляются через запятую, например:

a, b, с, d, e, f, g

и так далее. Формат CSV был одним из первых шагов к созданию языков разметки: данные в нем уже размечались запятыми.

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

<data>a, b, с, d, e, f</data>

Для того чтобы решение было как можно более общим, вынесем создание XML-разметки для каждого из элементов этой последовательности в отдельный шаблон:

<xsl:template name="item">

 <xsl:param name="item"/>

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

</xsl:template>

Тогда головной размечающий шаблон запишется в виде.

Листинг 11.18. Шаблон, размечающий данные в строковом формате

<xsl:template name="markup" match="text" mode="CSV">

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

 <xsl:param name="delimiter" select="','"/>

 <xsl:choose>

<xsl:when test="contains($str,$delimiter)">

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

<xsl:with-param name="item"

select="substring-before($str, $delimiter)"/>

</xsl:call-template>

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

<xsl:with-param name="str"

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

</xsl:call-template>

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

</xsl:when>

<xsl:otherwise>

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

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

</xsl:call-template>

</xsl:otherwise>

 </xsl:choose>

</xsl:template>

На

вход шаблон markup принимает два параметра —
str
, строка, которую нужно разметить (по умолчанию — значение текущего узла) и
delimiter
— строка, разделяющая отдельные значения в
str
(по умолчанию — запятая "
,
").

Шаблон, форматирующий содержимое элемента

data
, будет в таком случае выглядеть следующим образом:

<xsl:template match="data">

 <xsl:copy>

<xsl:apply-templates mode="CSV"/>

 </xsl:copy>

</xsl:template>

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

<data>

 <item>a</item>

 <item> b</item>

 <item> c</item>

 <item> d</item>

 <item> e</item>

 <item> f</item>

</data>

Обратим внимание на то, что в элементах

item
присутствуют лишние пробелы, которые в начальной последовательности шли за запятыми. Избавиться от них можно, указав в качестве разделяющей строки символ "
,
":

<xsl:template match="data">

 <xsl:copy>

<xsl:apply-templates mode="CSV">

<xsl:with-param name="delimiter" select="', '"/>

</xsl:apply-templates>

 </xsl:copy>

</xsl:template>

Результатом, как и следовало ожидать, будет:

<data>

 <item>a</item>

 <item>b</item>

 <item>c</item>

 <item>d</item>

 <item>e</item>

 <item>f</item>

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

Кровь Василиска

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

Венецианский купец

Распопов Дмитрий Викторович
1. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
7.31
рейтинг книги
Венецианский купец

Сопряжение 9

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

На три фронта

Бредвик Алекс
3. Иной
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
На три фронта

Авиатор: назад в СССР 11

Дорин Михаил
11. Покоряя небо
Фантастика:
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 11

Санек

Седой Василий
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Санек

Лорд Системы 8

Токсик Саша
8. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 8

Мерзавец

Шагаева Наталья
3. Братья Майоровы
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
5.00
рейтинг книги
Мерзавец

Игра топа. Между двух огней

Вяч Павел
2. Игра топа
Фантастика:
фэнтези
7.57
рейтинг книги
Игра топа. Между двух огней

Провинциал. Книга 2

Лопарев Игорь Викторович
2. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 2

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

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

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Крестоносец

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

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

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