XSLT - страница 27
>
>
>
>
Однако, с точки зрения XSLT, символы-разделители, используемые для выравнивания элементов, в действительности являются текстовыми узлами. Это означает, что по умолчанию эти пробелы будут скопированы в выходной документ. Понимание принципов работы XSLT с разделителями всегда вызывает большую путаницу, поэтому мы кратко рассмотрим здесь, как обрабатывать символы-разделители, и подробно займемся этим в следующей главе.
В XSLT существует четыре символа-разделителя: пробел, возврат каретки, перевод строки и табуляция. Все эти символы трактуются как разделители. Таким образом, с точки зрения процессора XSLT, входной документ выглядит так:
>
>
>.
>..
>...Earthquakes for Lunch
>..
>..
>...Volcanoes for Dinner
>..
>.
>
Все разделители между элементами трактуются в XSLT как текстовые узлы, содержащие символ-разделитель. Это означает, что в нашу диаграмму нам нужно добавить пять текстовых узлов с символом-разделителем: один перед элементом >
, один после элемента >
, и точно так же один перед элементом >
, один после и один между элементами:
> root
> |
> element:
> |
> |-------------------|------------|
> | | |
> text: whitespace element:
> |
> |-------------------|-------------|-------------------|-------------|
> | | | | |
>text: whitespace element:
> | |
> text: "Earthquakes for Lunch" text: "Volcanoes for Dinner"
Такие узлы-разделители, как эти, представляют собой текстовые узлы, не содержащие ничего, кроме символа-разделителя. Поскольку процессоры XSLT по умолчанию сохраняют эти разделители, вас не должно удивлять их появление в результирующих документах. Такие дополнительные разделители обычно не представляют проблемы в документах HTML, XML и XHTML, и здесь в тексте результирующих документов я их не отображаю — для того, чтобы правильно показать выравниванием структуру документа. Мы рассмотрим, как процессоры XSLT могут удалять узлы-разделители из документов, а также как процессоры могут выравнивать результирующие документы. Заметьте, что текстовые узлы, содержащие символы, отличные от символов-разделителей, не считаются узлами-разделителями, поэтому они никогда не будут удалены из документов.
Следует отметить еще один момент: сами атрибуты трактуются как узлы. Хотя узлы-атрибуты не считаются дочерними узлами тех элементов, в которых они появляются, элемент считается их родительским узлом. (В этом отличие данной модели от модели XML DOM, в которой атрибуты не являются детьми и не имеют родителей.) Если я добавлю атрибут в такой элемент:
>
>
>
>
> Earthquakes for Lunch
>
>
> Volcanoes for Dinner
>
>
>
то в дереве документа он отобразится следующим образом:
> root
> |
> element:
> |
> |-------------------|------------|
> | | |
> text: whitespace element:
> |
> |-------------------|-------------|-------------------|-------------|
> | | | | |
>text: whitespace element:
> | |
> text: Earthquakes for Lunch |--------------------------|
> | |