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

• 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>