Символ-разделитель
Символ-разделитель
Пример 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 могут удалять узлы-разделители из документов, а также как процессоры могут выравнивать результирующие документы. Заметьте, что текстовые узлы, содержащие символы, отличные от символов-разделителей, не считаются узлами-разделителями, поэтому они никогда не будут удалены из документов.
Следует отметить еще один момент: сами атрибуты трактуются как узлы. Хотя узлы-атрибуты не считаются дочерними узлами тех элементов, в которых они появляются, элемент считается их родительским узлом. (В этом отличие данной модели от модели XML DOM, в которой атрибуты не являются детьми и не имеют родителей.) Если я добавлю атрибут в такой элемент:
<?xml version="1.0"?>
<library>
<book>
<title>
Earthquakes for Lunch
</title>
<title pub_date="2001">
Volcanoes for Dinner
</title>
</book>
</library>
то в дереве документа он отобразится следующим образом:
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 attribute: pub_date="2001"
У каждого узла есть ряд установленных свойств, связанных с ним в XSLT. В следующем списке перечислены виды свойств, которые создатели процессоров XSLT отслеживают для каждого узла:
• Имя. Имя узла;
• Строка-значение. Текст узла;
• Базовый URI. Базовый URI узла (XML-вариант URL);
• Дети. Список дочерних узлов; ноль, если детей нет;
• Родитель. Узел-родитель данного узла;
• Имеет атрибут. Определяет атрибуты узла элемента, если таковые имеются;
• Имеет пространство имен. Определяет узлы пространства имен узла-элемента.
При работе с деревьями следует принять во внимание еще одно соображение; процессоры XSLT работают поверх разборщиков XML, и так как правила для разборщиков XML и процессоров XSLT слегка различаются, это может привести к проблемам. В некоторых случаях данный аспект может быть важен, поэтому в следующем разделе он кратко рассмотрен.