задать элементы, в которых следует сохранить узлы-разделители, можно при помощи элемента <xsl:preserve-space>
. У этого элемента такой же атрибут, что и у <xsl:strip- space>
:
• elements
(обязательный). Задает элементы, в которых нужно сохранить символы- разделители. Представляет собой список разделенных символами-разделителями NameTest
(именами или обобщенными именами с символами подстановок).
Фактически элемент <xsl:preserve-space>
является элементом по умолчанию для всех элементов в XSLT. Если вы использовали элемент <xsl:strip-space>
, все равно можно указать, в каком элементе или элементах нужно сохранить узлы-разделители, установив атрибут elements
элемента <xsl:preserve-space>
в список этих элементов:
<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:strip-space elements='*'/>
<xsl:preserve-space elements='MASS RADIUS'/>
<xsl:output method='xml'/>
<xsl:template match='*'>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Обсужденные средства удаления и сохранения разделителей могут показаться слишком сложными для форматирования выходных документов выравнивающими пробелами, но, к счастью, существует простой способ: атрибут indent
элемента <xsl:output>
позволяет автоматически выровнять выходной документ.
Автоматическое выравнивание
Элемент <xsl: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>
При помощи элемента <xsl:output indent='yes'/>
можно указать процессору XSLT осуществлять выравнивание документа при преобразовании его в HTML (листинг 3.6).
<?xml version='1.0'?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output indent='yes'/>
<xsl: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>
<xsl:apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsl:template>
<xsl:template match='PLANET'>
<TR>