Книга: XSLT

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

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

Для метода вывода HTML процессор XSLT должен предпринять определенные действия. Например, для этого метода атрибут version определяет версию HTML. Значение по умолчанию — 4.0.

Этот метод не должен добавлять завершающий тег для пустых элементов. (Для HTML 4.0 пустыми элементами являются <AREA>, <BASE>, <BASEFONT>, <BR>, <COL>, <FRAME>, <HR>, <IMG>, <INPUT>, <ISINDEX>, <LINK>, <META> и <PARAM>.) Метод вывода HTML должен распознавать названия элементов HTML независимо от регистра.

В соответствии с W3C, метод вывода HTML не должен скрывать содержимое элементов <SCRIPT> или <STYLE>. Например, следующий элемент буквального результата:

<SCRIPT>
 if (х &lt; у) {...}
</SCRIPT>

или следующий, использующий раздел CDATA:

<SCRIPT>
 <![CDATA[if (х < у) {...}]]>
</SCRIPT>

должен быть преобразован в:

<SCRIPT>
 if (х < у) {...}
</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></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">
  <P></P>
  <input type="BUTTON" value="Venus">
  <P></P>
  <input type="BUTTON" value="Earth">
  <P></P>
  <P></P>
  <DIV></DIV>
 </BODY>
</HTML>

Как видите, при помощи XSLT я написал код JavaScript для прохода в цикле по планетам. Этот документ HTML показан на рис. 6.1. При щелчке на кнопку выводится масса соответствующей планеты.


Рис. 6.1. Преобразование XML в HTML при помощи JavaScript 

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


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