|
element: <book>
|
|-------------------------------|
| |
element: <title> element: <title>
| |
text: 'Earthquakes for Lunch' text: 'Volcanoes for Dinner'
Как видим, корневой узел расположен на самом верху дерева, за которым следует узел корневого элемента, ему соответствует элемент <library>
. За ним следует узел <book>
, у которого есть два дочерних узла <title>
. Эти два узла <title>
являются внуками элемента <library>
. Родители, дедушки и прадедушки узла, назад до и включая корневой узел, являются
При помощи этой модели в виде дерева можно представить любой хорошо сформированный XML- документ. Но XSLT не ограничивается работой только с такими документами. В хорошо сформированных документах должен существовать один элемент, содержащий все остальные, но в соответствии с рекомендацией XSLT это не обязательно. В XSLT корневой узел может иметь столько детей, сколько их может иметь элемент, — например, несколько узлов элементов или текстовых узлов. Таким образом, XSLT может работать с фрагментами документа, а не только с хорошо сформированными документами.
ФРАГМЕНТЫ РЕЗУЛЬТИРУЮЩЕГО ДЕРЕВА
Помимо работы с фрагментами входного дерева, процессоры могут включать в вывод специальный тип данных, в XSLT 1.0 называемый фрагментом результирующего дерева (result tree fragment). Этот тип данных, однако, не был включен в рабочий проект XSLT 1.1 (см. главу 7), поэтому он, скорее всего, не будет входить в состав XSLT 2.0.
В действительности, рассмотренная только что диаграмма дерева не дает полной картины того, как она выглядит с точки зрения процессора XSLT. Я исключил один тип узлов, который вызывает большую путаницу при изучении XSLT — текстовые узлы, содержащие только символ-разделитель (whitespace). Теперь самое время заняться ими.
Символ-разделитель
Пример XML-документа, с которым мы до сих пор работали, выровнен так, чтобы показать иерархическую структуру его элементов:
<?xml version='1.0'?>
<library>
<book>
<title>
Earthquakes for Lunch
</title>
<title>
Volcanoes for Dinner
</title>
</book>
</library>
Однако, с точки зрения XSLT, символы-разделители, используемые для выравнивания элементов, в действительности являются текстовыми узлами. Это означает, что по умолчанию эти пробелы будут скопированы в выходной документ. Понимание принципов работы XSLT с разделителями всегда вызывает большую путаницу, поэтому мы кратко рассмотрим здесь, как обрабатывать символы-разделители, и подробно займемся этим в следующей главе.
В XSLT существует четыре символа-разделителя: пробел, возврат каретки, перевод строки и табуляция. Все эти символы трактуются как разделители. Таким образом, с точки зрения процессора XSLT, входной документ выглядит так:
<?xml version='1.0'?>
<library>
.<book>
..<title>
...Earthquakes for Lunch
..</title>
..<title>
...Volcanoes for Dinner
..</title>
.</book>
</library>
Все разделители между элементами трактуются в XSLT как текстовые узлы, содержащие символ- разделитель. Это означает, что в нашу диаграмму нам нужно добавить пять текстовых узлов с символом- разделителем: один перед элементом <book>
, один после элемента <book>
, и точно так же один перед элементом <title>
, один после и один между элементами:
root
|
element: <library>
|
|-------------------|------------|
| | |
text: whitespace element: <book> text: whitespace
|
|-------------------|-------------|-------------------|-------------|
| | | | |
text: whitespace element: <title> text: whitespace element: <title> text: whitespace
| |
text: 'Earthquakes for Lunch' text: 'Volcanoes for Dinner'
Такие узлы-разделители, как эти, представляют собой текстовые узлы, не содержащие ничего, кроме символа-разделителя. Поскольку процессоры XSLT по умолчанию сохраняют эти разделители, вас не должно удивлять их появление в результирующих документах. Такие дополнительные разделители обычно не представляют проблемы в документах HTML, XML и XHTML, и здесь в тексте результирующих документов я их не отображаю — для того, чтобы правильно показать выравниванием структуру документа. Мы рассмотрим, как процессоры XSLT могут удалять узлы-разделители из документов, а также как процессоры могут выравнивать результирующие документы. Заметьте, что текстовые узлы, содержащие символы, отличные от символов-разделителей, не считаются узлами-разделителями, поэтому они никогда не будут удалены из документов.
Следует отметить еще один момент: сами атрибуты трактуются как узлы. Хотя узлы-атрибуты не считаются дочерними узлами тех элементов, в которых они появляются, элемент считается их родительским