Книга: XSLT

Символ-разделитель

Символ-разделитель

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

Оглавление книги

Оглавление статьи/книги

Генерация: 0.907. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз