Обработка символов-разделителей
Обработка символов-разделителей
Поначалу символы-разделители (whitespace) доставляют авторам XSLT много хлопот. В главе 2 объяснялось, что «чистые» узлы-разделители — это текстовые узлы, содержащие только символы-разделители (пробелы, возвраты каретки, переводы строки и символы табуляции). Эти узлы по умолчанию копируются из исходного документа.
Заметьте, что в таблице стилей также могут быть узлы-разделители:
<xsl:template match="PLANETS">
<xsl:copy>
<xsl:apply-templates select="PLANET"/>
</xsl:copy>
</xsl:template>
В нашем случае пробелы используются для выравнивания элементов таблицы стилей, а возвраты каретки — для разрежения кода. Чистые узлы-разделители, такие, как этот, не копируются из таблицы стилей в выходной документ. Заметьте, однако, что разделитель из следующего элемента <TITLE> копируется в выходной документ, так как это не чистый узел-разделитель (он также содержит текст «The Planets Table»):
<xsl:template match="/PLANETS">
<HTML>
<HEAD>
<TITLE>
The Planets Table
</TITLE>
.
.
.
Если вы хотите убрать этот разделитель и сохранить выравнивание, можно использовать пустые элементы <xsl:text>, так чтобы символы-разделители стали чистыми узлами-разделителями:
<xsl:template match="/PLANETS">
<HTML>
<HEAD>
<TITLE>
<xsl:text/>The Planets Table<xsl:text/>
</TITLE>
.
.
.
Чистые узлы-разделители не копируются из таблицы стилей в выходной документ, если только они не находятся внутри элемента <xsl:text>, или у элемента, в который они вложены, атрибут xml:space не установлен в «preserve» (сохранить).
С другой стороны, по умолчанию XSLT сохраняет текстовые узлы разделители в исходном документе и копирует их в результирующий документ. Возьмите уже рассмотренную нами копирующую таблицу стилей, которая копирует все элементы из исходного документа в результирующий:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
и примените ее к 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>
.
.
.
Тем не менее, иногда требуется удалить разделители, используемые при форматировании входных документов — это можно сделать при помощи элемента <xsl:strip-space>.