В листинге 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, разделенных символами-разделителями.