|

                    element: <book>

                             |

             |-------------------------------|

             |                               |

    element: <title>                element: <title>

             |                               |

text: 'Earthquakes for Lunch' text: 'Volcanoes for Dinner'

Как видим, корневой узел расположен на самом верху дерева, за которым следует узел корневого элемента, ему соответствует элемент <library>. За ним следует узел <book>, у которого есть два дочерних узла <title>. Эти два узла <title> являются внуками элемента <library>. Родители, дедушки и прадедушки узла, назад до и включая корневой узел, являются предками (ancestor) элемента. Узлы, производные от узла (дети, внуки, правнуки и т.д.), называются его потомками (descendant). Узлы одного уровня называются братьями (sibling).

При помощи этой модели в виде дерева можно представить любой хорошо сформированный 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 могут удалять узлы-разделители из документов, а также как процессоры могут выравнивать результирующие документы. Заметьте, что текстовые узлы, содержащие символы, отличные от символов-разделителей, не считаются узлами-разделителями, поэтому они никогда не будут удалены из документов.

Следует отметить еще один момент: сами атрибуты трактуются как узлы. Хотя узлы-атрибуты не считаются дочерними узлами тех элементов, в которых они появляются, элемент считается их родительским

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату