Вход/Регистрация
Технология XSLT
вернуться

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

Шрифт:
Пример

Если при обработке элементов para мы хотим обрабатывать только дочерние элементы

bold
и никакие другие, шаблон обработки элементов
para
будет записан следующим образом:

<xsl:template match="para">

 <xsl:apply-templates select="bold"/>

</xsl:template>

Результатом обработки документа

<para>

 <bold>text1</bold>

 <para>

<bold>text2</bold>

 </para>

</para>

будет теперь

 <b>text1</b>

Элемент

para
, который во входящем документе включен в другой элемент
para
, не будет обработан по той простой причине, что он не вошел во множество, выбранное XPath-выражением "
bold
". В то же время, если мы запишем

<xsl:template match="para">

 <xsl:apply-templates select="bold|para"/>

</xsl:template>

то результат будет таким же, как и прежде:

 <b>text1</b>

 

<b>text2</b>

 

Следует хорошо понимать разницу между атрибутом

select
элемента
xsl:apply-templates
и атрибутом
match
элемента
xsl:template
. Атрибут
match
содержит не XPath-выражение, а паттерн XSLT; в отличие от атрибута select в
xsl:apply-templates
он не выбирает никакого множества узлов, он используется только для того, чтобы проверить, может ли данный узел обрабатываться этим шаблоном или нет.

Атрибут

select
элемента
xsl:apply-templates
наоборот, содержит не паттерн, а выражение, единственным требованием к которому является то, что оно должно возвращать множество узлов. Например, некорректным будет определение вида

<xsl:apply-templates select="para+1"/>

поскольку выражение

para+1
не может возвратить множество узлов.

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

id
или
key
), выражения с операциями над множествами (именно таким выражением — выражением объединения было выражение
bold|para
), пути выборки, фильтрующие выражения, в общем, любые выражения, которые только могут возвращать множества. Например, для того, чтобы обработать содержимое произвольного внешнего XML-документа, в атрибуте
select
элемента
xsl:apply-template
следует использовать функцию
document
.

Пример

Объявление вида

<xsl:apply-templates select="document('a.xml')//para"/>

применит шаблоны ко всем элементам

para
документа
a.xml
.

Режимы

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

Эта проблема решается в XSLT просто и элегантно. Атрибут

mode
элемента xsl:template задает режим этого шаблона. Точно такой же атрибут есть у элемента
xsl:apply-templates
: в этом элементе он устанавливает режим обработки. При выполнении
xsl:apply-templates
процессор будет применять только те шаблоны преобразования, режим которых совпадает с выбранным режимом обработки.

Пример

В качестве примера приведем преобразование, которое добавляет в XHTML-файл перечень текстовых ссылок, обнаруженных в этом документе. Грубо говоря, XHTML — это XML-версия языка HTML, а значит XSLT вполне подходит для обработки XHTML-документов.

URI пространства имен языка XHTML —

"http://www.w3.org/1999/xhtml"
; этому языку мы назначим префикс "
xhtml
" и, кроме того, сделаем это пространство пространством имен по умолчанию:

<xsl:stylesheet

 version="1.0"

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

 xmlns:xhtml="http://www.w3.org/1999/xhtml"

 xmlns="http://www.w3.org/1999/xhtml">

 ...

</xsl:stylesheet>

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

href
и текст, который она содержит. Для удобочитаемости мы также добавим элемент
br
и символ переноса строки
&#xA;
.

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

 <xsl:copy>

<xsl:copy-of select="@href|text"/>

 </xsl:copy>

  • Читать дальше
  • 1
  • ...
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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