Выбрать главу

В листинге 6.5 приведена полная таблица стилей planets.html, использующая этот элемент <xsclass="underline" output> для преобразования planets.xml в допустимый документ XHTML.

Листинг 6.5. Преобразование planets.xml в XHTML

<?xml version="1.0"?>

<xsclass="underline" stylesheet version="1.0"

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

 <xsclass="underline" output method="xml"

  doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

  doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"

  indent="yes"/>

 <xsclass="underline" template match="/PLANETS">

  <html>

   <head>

    <title>

     The Planets Table

    </title>

   </head>

   <body>

    <h1>

     The Planets Table

    </h1>

    <table>

     <tr>

      <td>Name</td>

      <td>Mass</td>

      <td>Radius</td>

      <td>Day</td>

     </tr>

     <xsclass="underline" apply-templates/>

    </table>

   </body>

  </html>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET">

  <tr>

   <td><xsclass="underline" value-of select="NAME"/></td>

   <td><xsclass="underline" apply-templates select="MASS"/></td>

   <td><xsclass="underline" apply-templates select="RADIUS"/></td>

   <td><xsclass="underline" apply-templates select="DAY"/></td>

  </tr>

 </xsclass="underline" template>

 <xsclass="underline" template match="MASS">

  <xsclass="underline" value-of select="."/>

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

 <xsclass="underline" template match="RADIUS">

  <xsclass="underline" value-of select="."/>

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

 <xsclass="underline" template match="DAY">

  <xsclass="underline" value-of select="."/>

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Вот результирующий файл XHTML:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html

 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

 <head>

  <title>

   The Planets Table

  </title>

 </head>

 <body>

  <h1>

   The Planets Table

  </h1>

  <table>

   <tr>

    <td>Name</td>

    <td>Mass</td>

    <td>Radius</td>

    <td>Day</td>

   </tr>

   <tr>

    <td>Mercury</td>

    <td>.0553 (Earth = 1)</td>

    <td>1516 miles</td>

    <td>58.65 days</td>

   </tr>

   <tr>

    <td>Venus</td>

    <td>.815 (Earth = 1)</td>

    <td>3716 miles</td>

    <td>116.75 days</td>

   </tr>

   <tr>

    <td>Earth</td>

    <td>1 (Earth = 1)</td>

    <td>2107 miles</td>

    <td>1 days</td>

   </tr>

  </table>

 </body>

</html>

Полученный документ, planets.html, является и хорошо сформированным, и допустимым документом XHTML 1.0 — в соответствии с программой допустимости W3C для HTML и XHTML, расположенной по адресу: http://validator.w3.org/file-upload.html. Заметьте, что, поскольку документы XHTML являются в то же время хорошо сформированными XML-документами, мы воспользовались методом вывода XML, — поэтому преобразование не было слишком сложным; единственной сложностью оказалось создание элемента <!DOCTYPE>.

Изменение структуры документа на основе входных данных

До сих пор созданные мной шаблоны основывались на определенном жестком скелете, точно задающем, что должно попасть в выходной документ и в каком порядке. Но при помощи таких элементов XSLT, как <xsclass="underline" element>, <xsclass="underline" attribute>, <xsclass="underline" text> и т.д., можно создавать новые узлы в рабочем порядке, на основе данных входного документа.

У вас уже есть небольшой опыт в этой области, поскольку мы работали с шаблонами значений атрибутов в главе 3. Как вы помните, при помощи таких шаблонов можно присвоить атрибуту значение выражения XPath, если заключить это выражение в фигурные скобки, { и }. Например, чтобы установить атрибут NAME в строковое значение элемента <DESCRIPTION>, дочернего элемента контекстного узла, это значение можно присвоить так: NAME={DESCRIPTION}. Теперь мы можем более подробно рассмотреть всю тему создания новых элементов и атрибутов «с ходу», начав с <xsclass="underline" element>.

Элемент <xsclass="underline" element>: создание новых элементов на этапе выполнения

Новые элементы можно создавать при помощи элемента <xsclass="underline" element>, который очень удобен для задания имени нового элемента на этапе выполнения.

У этого элемента три атрибута:

• name (обязательный). Имя создаваемого элемента. Принимает значение шаблона значений атрибута, возвращающего QName;

• namespace (необязательный). URI пространства имен нового элемента. Принимает значение шаблона значений атрибута, возвращающего URI;

• use-attribute-sets (необязательный). Задает наборы атрибутов, содержащие атрибуты этого элемента. Принимает значение списка элементов QName, разделенных символами-разделителями.