• elements (обязательный). Задает элементы, в которых нужно сохранить символы-разделители. Представляет собой список разделенных символами-разделителями NameTest (именами или обобщенными именами с символами подстановок).
Фактически элемент <xsclass="underline" preserve-space> является элементом по умолчанию для всех элементов в XSLT. Если вы использовали элемент <xsclass="underline" strip-space>, все равно можно указать, в каком элементе или элементах нужно сохранить узлы-разделители, установив атрибут elements элемента <xsclass="underline" preserve-space> в список этих элементов:
<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" strip-space elements="*"/>
<xsclass="underline" preserve-space elements="MASS RADIUS"/>
<xsclass="underline" output method="xml"/>
<xsclass="underline" template match="*">
<xsclass="underline" copy>
<xsclass="underline" apply-templates/>
</xsclass="underline" copy>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Обсужденные средства удаления и сохранения разделителей могут показаться слишком сложными для форматирования выходных документов выравнивающими пробелами, но, к счастью, существует простой способ: атрибут indent элемента <xsclass="underline" output> позволяет автоматически выровнять выходной документ.
Автоматическое выравнивание
Элемент <xsclass="underline" output> поддерживает атрибут indent который устанавливается в «yes» или «no», и указывает процессору XSLT, нужно ли выравнивать результирующий документ. Как правило, выравнивание результирующего документа не имеет большого значения, поскольку с ним работает приложение, которому все равно, выровнен документ или нет, как мы видели в примерах преобразований XML- XML и XML-HTML. Однако иногда требуется представить результирующий документ в виде простого текста, и в таких случаях выравнивание документа для отображения иерархической структуры может оказаться удобным.
Способ работы процессора XSLT с переменной выравнивания не регламентируется W3C и зависит от процессора, поэтому для получения требуемого результата нужно экспериментировать. Пусть, например, у нас есть версия planets.xml без какого-либо выравнивания:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xml" href="planets.xsl"?>
<PLANETS>
<PLANET>
<NAME>Mercury</NAME>
<MASS UNITS="(Earth = 1)">.0553</MASS>
<DAY UNITS="days">58.65</DAY>
<RADIUS UNITS="miles">1516</RADIUS>
<DENSITY UNITS="(Earth = 1)">.983</DENSITY>
<DISTANCE UNITS="million miles">43.4</DISTANCE><!--B перигелии-->
</PLANET>
<PLANET>
<NAME>Venus</NAME>
<MASS UNITS="(Earth = 1)">.815</MASS>
<DAY UNITS="days">116.75</DAY>
<RADIUS UNITS="miles">3716</RADIUS>
<DENSITY UNITS="(Earth = 1)">.943</DENSITY>
<DISTANCE UNITS="million miles">66.8</DISTANCE><!--В перигелии-->
</PLANET>
<PLANET>
<NAME>Earth</NAME>
<MASS UNITS="(Earth = 1)">1</MASS>
<DAY UNITS="days">1</DAY>
<RADIUS UNITS="miles">2107</RADIUS>
<DENSITY UNITS="(Earth = 1)">1</DENSITY>
<DISTANCE UNITS="million miles">128.4</DISTANCE><!--B перигелии-->
</PLANET>
</PLANETS>
При помощи элемента <xsclass="underline" output indent="yes"/> можно указать процессору XSLT осуществлять выравнивание документа при преобразовании его в HTML (листинг 3.6).
Листинг 3.6. Таблица стилей, задающая выравнивание<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" output indent="yes"/>
<xsclass="underline" template match="/PLANETS">
<HTML>
<HEAD>
<TITLE<
The Planets Table
</TITLE></HEAD> <BODY> <H1>
The Planets Table
</H1>
<TABLE BORDER="2">
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day>/TD>
<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" value-of select="MASS"/></TD>
<TD><xsclass="underline" value-of select="RADIUS"/></TD>
<TD><xsclass="underline" value-of select="DAY"/></TD>
</TR>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Результат применения таблицы с использованием процессора Saxon (в котором особенно хорошо реализовано выравнивание) с требуемым выравниванием:
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8">
<TITLE>
The Planets Table
</TITLE>
</HEAD>
<BODY>
<H1>
The Planets Table
</H1>
<TABLE BORDER="2">
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
<TR>
<TD>Mercury</TD>
<TD>.0553</TD>
<TD>1516</TD>
<TD>58.65</TD>
</TR>
<TR>
<TD>Venus</TD>
<TD>.815</TD>
<TD>3716</TD>
<TD>116.75</TD>
</TR>
<TR>
<TD>Earth</TD>
<TD>1</TD>
<TD>2107</TD>
<TD>1</TD>
</TR>
</TABLE>
</BODY>
</HTML>