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

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

Жанры

Технология 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. Опер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прорвемся, опера!

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

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

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит

Отморозки

Земляной Андрей Борисович
Фантастика:
научная фантастика
7.00
рейтинг книги
Отморозки

Волхв

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

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

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

Полководец поневоле

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

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

(Не)зачёт, Дарья Сергеевна!

Рам Янка
8. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
(Не)зачёт, Дарья Сергеевна!

(Не) Все могут короли

Распопов Дмитрий Викторович
3. Венецианский купец
Фантастика:
попаданцы
альтернативная история
6.79
рейтинг книги
(Не) Все могут короли

Совок

Агарев Вадим
1. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
8.13
рейтинг книги
Совок

Сын Петра. Том 1. Бесенок

Ланцов Михаил Алексеевич
1. Сын Петра
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Сын Петра. Том 1. Бесенок

1941: Время кровавых псов

Золотько Александр Карлович
1. Всеволод Залесский
Приключения:
исторические приключения
6.36
рейтинг книги
1941: Время кровавых псов