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

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

Жанры

Технология XSLT

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

Шрифт:

Приведем пример Java-классов, которые будут аналогичны преобразованиям

home.xsl
и
base.xsl
.

Листинг 5.20. Класс home

public class home {

 public String home {

return "<a href=\"http://www.xsltdev.ru\">www.xsltdev.ru</a>";

 }

}

Листинг 5.21. Класс base

public class base extends home {

 public String home {

return ("Visit " + super.home);

 }

}

В

этом примере вызов родительского метода
super.home
соответствует применению элементом
xsl:apply-imports
импортированного шаблона.

Тело шаблона

Фактически, элемент

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

Пример

Тело следующего шаблона (выделенное полужирным шрифтом):

<xsl:template match="page">

 <body>

<xsl:value-of select="."/>

 </body>

 Комментарии

 <xsl:copy-of select="comment"/>

</xsl:template>

состоит из литерального элемента

body
, текстового узла и элемента
xsl:copy-of
. При выполнении этого шаблона элемент
body
будет выведен как есть (при этом содержимое его будет вычислено); текстовый узел будет скопирован в выходящее дерево; элемент
xsl:copy-of
будет заменен множеством дочерних комментариев текущего узла.

Следует заметить, что текстовый узел в данном случае состоит не только из строки "Комментарии". Он включает также все пробельные символы и символы переноса строки.

Тело шаблона может быть также и пустым. В этом случае результат обработки узлов, соответствующих этому шаблону будет пустым. Например, если в преобразовании содержится шаблон вида

<xsl:template match="comment"/>

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

Тело шаблона может содержать любые текстовые узлы, комментарии, инструкции по обработке и литеральные элементы результата при условии, что не будет нарушен синтаксис XML-документа. Тело шаблона может также содержать следующие элементы XSLT, называемые также инструкциями (не путать с инструкциями по обработке):

□ 

xsl:apply-imports
;

□ 

xsl:apply-templates
;

□ 

xsl:attribute
;

□ 

xsl:call-template
;

□ 

xsl:choose
;

□ 

xsl:comment
;

□ 

xsl:copy
;

□ 

xsl:copy-of
;

□ 

xsl:element
;

□ 

xsl:fallback
;

□ 

xsl:for-each
;

□ 

xsl:if
;

□ 

xsl:message
;

□ 

xsl:number
;

□ 

xsl:param
;

□ 

xsl:processing-instruction
;

□ 

xsl:text
;

□ 

xsl:value-of
;

□ 

xsl:variable
.

Элементы

xsl:param
и
xsl:variable
, которые входят в этот список в преобразовании, могут быть как элементами верхнего уровня, так и инструкциями. В первом случае они определяют глобальные параметры и переменные, во втором — локальные.

Если элементы

xsl:param
используются для определения локальных переменных, они должны быть первыми дочерними элементами
xsl:template
, то есть, строго говоря, определение

<xsl:template name="page">

 <xsl:text>Text</xsl:text>

 <xsl:param name="foo"/>

</xsl:template>

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

<xsl:template name="page">

 <xsl:param name="foo"/>

 <xsl:text>Text</xsl:text>

</xsl:template>

Переменные и параметры

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

В классической книге Монти Бен-Ари "Языки программирования" [Бен-Ари 2000] приводится следующее определение переменной:

Переменная — это имя, присвоенное ячейке памяти или ячейкам, которые могут содержать представление конкретного типа (данных).

Затем следует комментарий:

Значение может изменяться во время выполнения программы.

Если немного сменить уровень абстракции, первая часть этого определения верна и по отношению к параметрам, и переменным XSLT (далее мы будем говорить просто "переменные", поскольку различия между ними на данный момент несущественны). Конечно, где-то там внутри реализации конкретного XSLT-процессора есть память, поделенная на ячейки, в которой процессор хранит информацию. Такие детали нас, естественно, не интересуют, ибо мы больше рассуждаем о логических, чем о физических моделях. В логической же модели переменная представляется как объект определенного типа, с которым связано имя, — по этому имени мы можем обращаться к объекту, использовать его значение и так далее. Иными словами, в XSLT под переменной понимается не более чем ассоциация между значением и именем, и если мы вдруг скажем, что переменная

x
имеет значение
5
, это будет означать, что имя "
x
" связано объектом численного типа, значение которого равно
5
. Заметим небольшую разницу с определением Бен-Ари: мы не говорим о том, что число
5
лежит в какой-то ячейке памяти (хотя, несомненно, оно так и есть) и что этой ячейке присвоено имя "
x
" — мы говорим об ассоциации между объектом и именем и только.

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

Месть бывшему. Замуж за босса

Россиус Анна
3. Власть. Страсть. Любовь
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Месть бывшему. Замуж за босса

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

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

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Темный Лекарь 4

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

Таня Гроттер и Исчезающий Этаж

Емец Дмитрий Александрович
2. Таня Гроттер
Фантастика:
фэнтези
8.82
рейтинг книги
Таня Гроттер и Исчезающий Этаж

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Камень. Книга восьмая

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

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

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

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Последняя Арена 11

Греков Сергей
11. Последняя Арена
Фантастика:
фэнтези
боевая фантастика
рпг
5.00
рейтинг книги
Последняя Арена 11

Хорошая девочка

Кистяева Марина
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Хорошая девочка

Диверсант. Дилогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.17
рейтинг книги
Диверсант. Дилогия

Старая дева

Брэйн Даниэль
2. Ваш выход, маэстро!
Фантастика:
фэнтези
5.00
рейтинг книги
Старая дева

Вонгозеро

Вагнер Яна
1. Вонгозеро
Детективы:
триллеры
9.19
рейтинг книги
Вонгозеро