<pre>One little rabbit
Two little rabbits
Three little rabbits</pre>
Запишем шаблон для обработки элемента pre
:
<xsclass="underline" template match="pre">
<xsclass="underline" copy>
<xsclass="underline" apply-templates mode="replace"/>
</xsclass="underline" copy>
</xsclass="underline" 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-разметки для каждого из элементов этой последовательности в отдельный шаблон:
<xsclass="underline" template name="item">
<xsclass="underline" param name="item"/>
<item><xsclass="underline" copy-of select="$item"/></item>
</xsclass="underline" template>
Тогда головной размечающий шаблон запишется в виде.
<xsclass="underline" template name="markup" match="text()" mode="CSV">
<xsclass="underline" param name="str" select="."/>
<xsclass="underline" param name="delimiter" select="','"/>
<xsclass="underline" choose>
<xsclass="underline" when test="contains($str,$delimiter)">
<xsclass="underline" call-template name="item">
<xsclass="underline" with-param name="item"
select="substring-before($str, $delimiter)"/>
</xsclass="underline" call-template>
<xsclass="underline" call-template name="markup">
<xsclass="underline" with-param name="str"
select="substring-after($str, $delimiter)"/>
</xsclass="underline" call-template>
<xsclass="underline" with-param name="delimiter" select="$delimiter"/>
</xsclass="underline" when>
<xsclass="underline" otherwise>
<xsclass="underline" call-template name="item">
<xsclass="underline" with-param name="item" select="$str"/>
</xsclass="underline" call-template>
</xsclass="underline" otherwise>
</xsclass="underline" choose>
</xsclass="underline" template>
На вход шаблон markup принимает два параметра — str
, строка, которую нужно разметить (по умолчанию — значение текущего узла) и delimiter
— строка, разделяющая отдельные значения в str
(по умолчанию — запятая ",
").
Шаблон, форматирующий содержимое элемента data
, будет в таком случае выглядеть следующим образом:
<xsclass="underline" template match="data">
<xsclass="underline" copy>
<xsclass="underline" apply-templates mode="CSV"/>
</xsclass="underline" copy>
</xsclass="underline" template>
Результат этого преобразования будет иметь следующий вид:
<data>
<item>a</item>
<item> b</item>
<item> c</item>
<item> d</item>
<item> e</item>
<item> f</item>
</data>
Обратим внимание на то, что в элементах item
присутствуют лишние пробелы, которые в начальной последовательности шли за запятыми. Избавиться от них можно, указав в качестве разделяющей строки символ ",
":
<xsclass="underline" template match="data">
<xsclass="underline" copy>
<xsclass="underline" apply-templates mode="CSV">
<xsclass="underline" with-param name="delimiter" select="', '"/>
</xsclass="underline" apply-templates>
</xsclass="underline" copy>
</xsclass="underline" template>
Результатом, как и следовало ожидать, будет:
<data>
<item>a</item>
<item>b</item>
<item>c</item>
<item>d</item>
<item>e</item>
<item>f</item>
</data>
Кстати сказать, того же эффекта можно было добиться, изменив шаблон item
, который отвечает за XML-представление каждого из элементов последовательности.
Глава 12
Развитие технологий
Как известно, успех технологии зависит не только от того, насколько продумана и проработана она была. Ее широкое распространение невозможно без поддержки и заинтересованности ведущих производителей программного обеспечения. В этом смысле XSLT очень повезло: имплементациями языка с самых ранних черновых вариантов занимались такие крупные разработчики, как Microsoft, Oracle, IBM, Adobe, Lotus и многие другие. Поддержка Apache XML Project помогла XSLT завоевать популярность и среди open-source сообщества (open-source — разработки с "открытым" исходным кодом).
Так или иначе, сейчас следует лишь констатировать стабильный рост популярности XSLT. Количество XSLT-процессоров уже исчисляется десятками, а число разработчиков — пожалуй, что и тысячами.
Повышенный интерес помог в чрезвычайно короткий срок (менее года) изучить на практике недостатки и достоинства нового языка и приступить к разработке последующих версий, которые бы учитывали эти практические результаты. В декабре 2000 года была выпущена версия 1.1,. в которой было не только исправлено большинство основных проблем первой версии XSLT, но и включены очень важные дополнения — такие, например, как определение интерфейсов расширений для языков Java и JavaScript/ECMAScript. В августе 2001 года версии 1.1 дали статус Final Draft и положили на полку — она никогда не будет стандартом (технической рекомендацией Консорциума W3).
Нужно сказать, что по количеству доработок и дополнений версия XSLT 1.1 могла вполне претендовать на роль нового стандарта XSLT. Однако, в такой напряженной области информационных технологий, как XML, приходится считаться с другими разработками, ибо все они взаимосвязаны. На решение прекратить продвижение XSLT 1.1 и перейти к 2.0 во многом повлияли такие проекты, как XML Schema и XQuery.
XML Schema — это долгожданный XML-язык, описывающий структуру XML-документа, своего рода более мощный вариант DTD. XML Schema, в частности, позволяет описывать простые и сложные типы данных элементов и атрибутов, ограничивать количества повторений, определять в XML-документах первичные и внешние ключи и многое другое. Помимо этого, XML Schema определяется в XML-синтаксисе, что позволяет использовать для обработки схем стандартные XML-инструменты. Спецификация XML Schema получила статус технической рекомендации Консорциума W3 в мае 2001 года.