XSLT — страница 17 из 124

>.983

43.4

 .

 .

 .

В главе 3, в которой шаблоны рассмотрены более подробно, будет показано, как извлекать значения атрибутов из элементов XML.

Однако перед тем, как начать углубляться в работу с шаблонами, необходимо еще изучить достаточно много материала о таблицах стилей в общем. Например, в рабочий проект XSLT 1.1 включена поддержка рекомендации XML Base, а это значит, что она также появится и в XSLT 2.0.

Поддержка XML Base

Одним из пунктов, добавленных в рабочий проект XSLT 1.1, была поддержка спецификации W3C XML Base. На момент написания книги спецификация XML Base существует в форме предлагаемой рекомендации (Proposed Recommendation), датированной 20 декабря 2000 г.; текущую версию документа можно найти по адресу www.w3.org/TR/xmlbase/.

Эта спецификация позволяет обеспечивать для документов XML и XSL базовый идентификаторы URI аналогично элементу HTML

. (Фактически, благодаря элементу HTML
существует XBase: W3C взял на себя обязательство дать XML всю мощь ссылочной модели HTML 4.0 и затем развивать ее.) Как вы помните, одним из свойств элементов XSL является их базовый URI, и теперь его можно устанавливать при помощи XML Base. Однако пока ни один из известных мне процессоров XSLT не поддерживает XML Base.

Здесь будет приведен только обзор работы с XML Base: для установки базового URI XML-документа можно использовать атрибут

xml:base
. Другие идентификаторы URI документа затем вычисляются, используя это значение в качестве базы. Заметьте, что
xml:base
использует пространство имен
xml
, которое предопределено в XML как "
http://www.w3.org/XML/1998/namespace
". В следующем примере используются ссылки XML, XML links (или XLinks):

 xml:base="http://www.starpowder.com/"

 xlink:type="simple" xlink:show="new" xlink:href="reviews.xml">

 Mr. Blandings Builds His Dream House

Используя значение, присвоенное атрибуту

xml:base
, URI атрибута
xlink:href
, "
reviews.xml
" раскрывается в полный URI "
http://www.starpowder.com/reviews.xml
". Подобным образом можно при помощи xml:base задать базовый URI для документа или конкретного элемента.

В рабочем проекте XSLT 1.1 с каждым узлом связан его URI, называемый базовым URI, который используется для раскрытия значений атрибута, представляющих относительные URI, в абсолютные URI. Вот как следует определять базовый URI:

• базовый URI корневого узла — это URI документа;

• базовый URI узла элемента— это базовый URI, заданный в элементе атрибутом

xml:base
(если таковой существует), или базовый URI элемента- родителя элемента в документе, или внешняя сущность (если существует), или базовый URI сущности документа или внешней сущности, содержащей элемент;

• базовый URI для узла инструкции обработки — это URI, который будет применен к ссылке URI в содержимом инструкции обработки. В соответствии со спецификацией XML Base, базовым URI для ссылки URI, появляющейся в содержимом инструкции обработки, является базовый URI родительского элемента инструкции обработки (если таковой имеется) в пределах сущности документа или внешней сущности, или базовый URI сущности документа или внешней сущности, содержащей инструкцию обработки;

• базовым URI для текстового узла, узла комментария или узла атрибута является базовый URI родителя этого узла;

• базовый URI для узла пространства имен, однако, зависит от реализации.

Установка базовых URI документов и элементов может оказаться удобной, если вам приходится работать с очень большим множеством документов. При реорганизации этого множества документов вам нужно будет переустановить только один базовый URI, а не все индивидуальные URI. Однако, как я уже говорил, из известных мне процессоров XSLT ни один пока не поддерживает XML Base.

Выбор методов вывода

Еще один важный аспект создания таблиц стилей — выбор метода вывода: XML, HTML, текст (то есть любой текстовый документ, не являющийся документом XML или HTML) и т.д. Другими словами, метод вывода (output method) определяет тип создаваемого документа. По умолчанию методом вывода является XML, хотя большинство процессоров при встрече элемента создают документы HTML. (Некоторые процессоры действуют подобным образом, если расширение создаваемого файла документа

.html
.)

Этот материал подробно изложен в главе 6, но сейчас мы также кратко его рассмотрим. Если только вы полностью не уверены, что правила вывода вашего процессора XSLT по умолчанию делают именно то, что нужно, зачастую можно посоветовать явно установить тип вывода в требуемый вам вид документа при помощи элемента

. Выходной тип может задать, например, будет ли процессор XSLT записывать инструкцию обработки XML,
, в начало документа, а также указать тип MIME (такой, как «text/xml» или «text/html») документов, отправляемых процессором XSLT с web-сервера браузеру. Кроме того, если вы установите тип вывода в HTML, большинство процессоров XSLT распознают, что не всем элементам в HTML требуются закрывающие и открывающие теги, и т.д.

Преобразованию из XML в другие типы документов посвящена глава 6, но здесь мы также кратко рассмотрим элемент

, поскольку это важно для общего понимания работы таблиц стилей. В следующем списке перечислены атрибуты
:

• 

cdata-section-elements
(необязательный). Задает названия тех элементов, чье содержимое вы хотите вывести в виде разделов CDATA. Принимает значение списка
QName
, разделенных символами-разделителями;

• 

doctype-public
(необязательный). Определяет открытый идентификатор, который будет использоваться в объявлении
вывода. Устанавливается в строковое значение;

• 

doctype-system
(необязательный). Определяет системный идентификатор, который будет использоваться в объявлении
вывода;

• 

encoding
(необязательный). Определяет кодировку символов. Устанавливается в строковое значение;

• 

indent
(необязательный). Определяет, будет ли вывод выровнен с отображением структуры вложенности. Устанавливается в «yes» или «no»;

• 

media-type
(необязательный). Определяет тип MIME вывода. Устанавливается в строковое значение;

• 

method
(необязательный). Определяет формат вывода. Устанавливается в «xml», «html», «text» или допустимое имя типа
QName
;

• 

omit-xml-declaration
(необязательный). Определяет, будет ли включено в вывод объявление XML. Устанавливается в «yes» или «по»;

• 

standalone
(необязательный). Определяет, будет ли включено в вывод отдельное объявление, и если да — устанавливает его значение. Устанавливается в «yes» или «по»;

• 

version
(необязательный). Задает версию вывода. Устанавливается в допустимую лексему типа
NMToken
.

Чаще всего используется атрибут

method
элемента, потому что с его помощью устанавливается требуемый тип дерева вывода. Самые распространенные значения — «html», «xml» и «text».

Метод вывода: HTML

В нашей таблице стилей

planets.xsl
элемент
не используется; это значит, что для этой таблицы я полагался на правила вывода по умолчанию. Типом вывода по умолчанию является XML, если только процессор XSLT не встретит тег
или
. (Заметьте, что это не формальное требование, а только соглашение, которому не обязаны следовать все процессоры XSLT.) В
planets.xsl
я использовал тег следующим образом:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</code></pre></p><p><pre><code>     The Planets Table</code></pre></p><p><pre><code>

   .

   .

   .

Однако, если удалить этот тег:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</code></pre></p><p><pre><code>    The Planets Table</code></pre></p><p><pre><code>

  .

  .

  .

то такой вид вывода вы получите от процессора XT Джеймса Кларка. Обратите внимание на инструкции обработки XML в начале:

</code></pre></p><p><pre><code>   The Planets Table</code></pre></p><p><pre><code>

 .

 .

 .

С другой стороны, можно явно указать тип вывода HTML при помощи элемента

, даже не прибегая к элементу
:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</code></pre></p><p><pre><code>    The Planets Table</code></pre></p><p><pre><code>

  .

  .

  .

Вот вывод XT в данном случае — только фрагмент HTML, никаких инструкций обработки XML:

</code></pre></p><p><pre><code>  The Planets Table</code></pre></p><p><pre><code>

.

.

.

ЭЛЕМЕНТЫ , АВТОМАТИЧЕСКИ ДОБАВЛЯЕМЫЕ В HTML

Если вы явно используете элемент , некоторые процессоры XSLT, такие как Saxon, добавляют в элемент выходного документа элемент подобным образом: .

В общем случае процессоры XSLT должны учитывать, что в HTML определенные элементы, такие как


,
,
и т.д., пусты. Также пробелы и другие символы в значениях атрибута URI преобразуются в соответствии со спецификацией HTML (пробел становится «%20» и т.п.), инструкции обработки завершаются символом
>
, а не
?>
, и учитывается тот факт, что отдельным атрибутам значение не присваивается.

Метод вывода: XML

В этом разделе я собираюсь рассмотреть пример, который подробно изучается в главе 6. Я хочу зайти немного вперед и использовать элемент

, с которым мы познакомимся в главе 3, для создания таблицы стилей, которая создает копию любого XML-документа.

Я воспользуюсь образцом совпадения «*», которому, как говорилось ранее, удовлетворяет любой элемент, и применю элемент

для копирования текущего элемента в выходной документ. Вот как выглядит новая таблица стилей, копирующая исходный документ в результирующий:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

Поскольку эта таблица стилей предназначена для копирования в новый документ XML любого документа XML даже документов XHTML, представляющих собой XML-документы, использующие тег

, — я явно указываю, что здесь методом вывода является XML. Если бы я этого не сделал, скопированные документы XHTML не начинались бы с объявления XML:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

В этом примере в результирующий документ копируются только элементы, но не текстовые узлы, комментарии или атрибуты. Более законченную версию этой же таблицы стилей мы рассмотрим в главе 4.

Помните, что XML — это метод вывода по умолчанию, если только ваш входной документ не содержит тег или . Тем не менее, даже если вы выполняете преобразование одного XML-документа в другой, зачастую удобно использовать элемент

— для того, чтобы, например, задать кодировку символов (по умолчанию это обычно UTF-8, восьмибитовое подмножество Unicode) или выравнивание выходного документа (это описывается в главе 3).

РАБОТА С ФРАГМЕНТАМИ XML

Можно работать не только с документами XML целиком, но и с их фрагментами. В этом случае следует установить атрибут omit-xml-declaration в «yes» — для того, чтобы опустить объявление XML в начале дерева вывода, как обсуждается в главе 6.

Когда вы используете метод вывода XML, дерево вывода представляет собой хорошо сформированный XML (однако он не обязан быть допустимым). Не обязательно оно должно быть хорошо сформированным XML-документом, это может быть общая разобранная внешняя сущность XML. Содержимое вывода может включать символьные данные, разделы CDATA, ссылки на сущности, инструкции обработки, комментарии и элементы. Вывод должен также удовлетворять объявлению пространств имен XML.

Метод вывода: текст

Метод текстового вывода предназначен не только для создания простого текста: он применяется для любого основанного на тексте формата, не являющегося XML или HTML. Например, с его помощью можно создавать документы в формате RTF (Rich Text Format). В этом формате для задания форматирования документов используются встроенные текстовые коды — их можно поместить в документы самостоятельно при помощи метода текстового вывода.

В листинге 2.6 приведен пример таблицы стилей (которую мы увидим в главе 6), преобразующей

planets.xml
в
planets.rtf
.

Листинг 2.6. Таблица стилей RTF

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

{\rtf1\ansi\deff0{\fonttbl {\\fcharset0 Courier New:}}

  \viewkind4\uc1\pard\langl033\b\ The Planets Table\par\b0

  Name\tab Mass\tab Rad.\tab Day\par

  \par

 }


  \tab

  \tab

  \tab

  \tab

  \par

Результирующий документ RTF, planets.rtf, изображен на рис. 2.3 в Microsoft Word 2000. Обратите внимание на то, что я установил метод вывода в текст в элементе

:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

{\rtf1\ansi\deff0{\fonttbl(\\fcharset0 Courier New;}}

  \viewkind4\ucl\pard\lang1033\b\ The Planets Table\par

  .

  .

  .

Рис. 2.3. Planets.rtf в Microsoft Word


Вы также могли заметить, что я принялся записывать коды RTF сразу же после элемента

— я сделал так потому, что в документах RTF коды RTF должны появляться с самого начала. Если бы я решил вставлять коды RTF на следующей строке — например, так:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  {\rtf1\ansi\deff0{\fonttbl{\\fcharset0 Courier New;}}

  \viewkind4\uc1\pard\lang1033\b\ The Planets Table\par

  .

  .

  .

то выходной файл RTF начинался бы с символа новой строки, что вызвало бы ошибку приложения для работы с файлами RTF — такого, как Microsoft Word. Более подробно RTF и другие форматы будут рассмотрены в главе 6.

Упрощенные таблицы стилей