Стивен Холзнер - XSLT
</SCRIPT>
Метод вывода HTML не должен также подавлять символы <, встречающиеся в значениях атрибутов.
При установке метода вывода в HTML процессор может учесть атрибут выравнивания. Если этот атрибут установлен в yes, процессор XSLT может добавить (или удалить) символы-разделители для выравнивания результирующего документа, поскольку это не влияет на отображение документа в браузере. Для метода вывода HTML значением по умолчанию является «yes».
Как вы могли предположить, метод вывода HTML завершает инструкции обработки при помощи >, а не ?>, а также поддерживает отдельные атрибуты, как и HTML. Например, тег
<TD NOWRAP="NOWRAP">
будет преобразован в:
<TD NOWRAP>
Для этого метода можно установить атрибут media-type, значением по умолчанию для которого является «text/html». Метод HTML не должен убирать символ &, который появляется в значении атрибута, если сразу за ним следует фигурная скобка. Атрибут encoding задает используемую кодировку. Если присутствует элемент <HEAD>, этот метод вывода должен добавить элемент <МЕТА> сразу же после тега <HEAD>, определяя кодировку символов:
<HEAD>
<МЕТА http-equiv="Content-Type" content="text/html; charset=utf-8">
.
.
.
При помощи атрибутов doctype-public или doctype-system можно вывести объявление типа документа непосредственно перед первым элементом, как мы увидим при преобразовании XML в XHTML.
Таковы правила вывода HTML. Ниже приведен пример преобразования из XML в HTML с небольшими отклонениями. В этом случае таблица стилей будет фактически генерировать код JavaScript, демонстрируя создание JavaScript при помощи XSLT. В частности, мы прочитаем planets.xml и создадим новый документ HTML, отображающий три кнопки — по одной для каждой из трех планет в planets.xml. При щелчке на кнопке на странице будет выведена масса соответствующей планеты.
Все, что нам понадобится (листинг 6.1), — это два элемента <xsl:for-each>: один для прохода в цикле по трем планетам и создания для каждой кнопки HTML; и один для прохода по планетам и создания для каждой функции JavaScript. В качестве имен функций JavaScript я воспользуюсь названием планет; при вызове функция выведет массу соответствующей планеты. Заметьте, что для создания нужного кода JavaScript нужно всего лишь применить элемент <xsl:value-of> для получения названий и масс планет. Я также применю два новых элемента XSLT, <xsl:element> и <xsl:attribute-set>, которые мы рассмотрим позже в этой главе, для создания нового элемента и задания для него набора атрибутов.
Листинг 6.1. Преобразование в JavaScript<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/PLANETS">
<HTML>
<HEAD>
<TITLE>
The Mass Page
</TITLE>
<SCRIPT LANGUAGE='javascript'>
<xsl:for-each select="PLANET">
<xsl:text>
function </xsl:text><xsl:value-of select="NAME"/><xsl:text>() {
display.innerHTML = 'The mass of </xsl:text>
<xsl:value-of select="NAME"/>
<xsl:text> equals </xsl:text>
<xsl:value-of select="MASS"/>
<xsl:text> Earth masses.'</xsl:text>
}
</xsl:for-each>
</SCRIPT>
</HEAD>
<BODY>
<CENTER>
<H1>The Mass Page</H1>
</CENTER>
<xsl:for-each select="PLANET">
<P/>
<xsl:element name="input" use-attribute-sets="attribs"/>
</xsl:for-each>
<P/>
<P/>
<DIV ID='display'></DIV>
</BODY>
</HTML>
</xsl:template>
<xsl:attribute-set name="attribs">
<xsl:attribute name="type">BUTTON</xsl:attribute>
<xsl:attribute name="value"><xsl:value-of select="NAME"/></xsl:attribute>
<xsl:attribute name="onclick><xsl:value-of select="NAME"/>()</xsl:attribute>
</xsl:attribute-set>
</xsl:stylesheet>
Результат, включая элемент <SCRIPT> для нового кода JavaScript (листинг 6.2).
Листинг 6.2. Результирующий документ с JavaScript<HTML>
<HEAD>
<TITLE>
The Mass Page
</TITLE>
<SCRIPT LANGUAGE="javascript">
function Mercury() {
display.innerHTML =
'The mass of Mercury equals .0553 Earth masses.'
}
function Venus() {
display.innerHTML = 'The mass of Venus equals .815 Earth masses.'
}
function Earth() {
display.innerHTML = 'The mass of Earth equals 1 Earth masses.'
}
</SCRIPT>
</HEAD>
<BODY>
<CENTER>
<H1>The Mass Page</H1>
</CENTER>
<P></P>
<input type="BUTTON" value="Mercury" onclick="Mercury()">
<P></P>
<input type="BUTTON" value="Venus" onclick="Venus()">
<P></P>
<input type="BUTTON" value="Earth" onclick="Earth()">
<P></P>
<P></P>
<DIV ID="display"></DIV>
</BODY>
</HTML>
Как видите, при помощи XSLT я написал код JavaScript для прохода в цикле по планетам. Этот документ HTML показан на рис. 6.1. При щелчке на кнопку выводится масса соответствующей планеты.
Рис. 6.1. Преобразование XML в HTML при помощи JavaScript
Метод вывода: XML
Формально при использовании метода вывода XML процессор XSLT создает хорошо сформированный внешний объект XML, который можно разобрать на общих условиях. Если корневой узел результирующего дерева имеет единственный дочерний узел-элемент и не имеет текстовых дочерних узлов. Тогда объект будет также хорошо сформированным документом XML.
При использовании метода вывода XML атрибут version устанавливает версию XML результата. Заметьте, что если процессор XSLT не поддерживает эту версию XML, он будет использовать ту версию XML, которую поддерживает. По умолчанию установлено значение 1.0.
Атрибут encoding устанавливает кодировку для результирующего документа. Процессоры XSLT должны поддерживать, по крайней мере, значения «UTF-8» и «UTF-16». Если процессор XSLT работает с другими значениями и не поддерживает указанную кодировку, он может сгенерировать ошибку. Если он этого не сделает, процессор должен использовать вместо нее UTF-8 иди UTF-16. Процессор XSLT не должен использовать кодировку, которая не была принята консорциумом W3C (см. www.ww3.org/TR/REC-xml). Если никакой атрибут кодировки не указан, по умолчанию процессор XSLT должен выбрать «UTF-8» или «UTF-16».
ОБРАБОТКА НЕИЗВЕСТНЫХ СИМВОЛОВ
Если результирующий документ содержит символ, который не может быть представлен в кодировке, используемой процессором XSLT для вывода, символ допустимо вывести как ссылку на символ. Если это невозможно, процессор XSLT должен сгенерировать ошибку.
Как и в случае с методом вывода HTML, если атрибут indent установлен в «yes», метод вывода XML может добавить или удалить символы-разделители в результирующее дерево для того, чтобы выровнять результат. Значение по умолчанию — no. Заметьте, что если символы-разделители отбрасываются, информационное множество результирующего XML-документа должно быть таким же, как если бы символы-разделители вообще не добавлялись и не удалялись для выравнивания документа.
ВЫРАВНИВАНИЕ ДОКУМЕНТОВ СО СМЕШАННЫМ СОДЕРЖИМЫМ
Для документов со смешанным содержимым лучше не устанавливать атрибут indent в «yes», поскольку это вносит путаницу в работу процессора XSLT.
При помощи атрибута cdata-section-elements можно задать разделенный символами-разделителями список имен элементов, чье содержимое должно трактоваться как разделы CDATA. Например, если установить атрибут cdata-section-elements в «DATA»:
<xsl:output cdata-section-elements="DATA"/>
то следующий элемент буквального результата:
<DATA><:DOCUMENT></DATA>
будет преобразован в:
<DATA><![CDATA<[DOCUMENT>]]></DATA>
Кроме того, метод вывода XML будет выводить в результирующий документ объявление XML, если только атрибут omit-xml-declaration не будет установлен в yes. Как правило, объявление XML, помещаемое в результирующий документ, обычно включает версию XML (что обязательно) и информацию о кодировке (хотя формально информация о кодировке в документах XML не обязательна). Если задан атрибут standalone, результирующий документ должен включать объявление отдельного документа с тем же значением, что и значение у атрибута standalone.