<TD><xsclass="underline" apply-templates select="DAY"/></TD>
</TR>
</xsclass="underline" template>
<xsclass="underline" template match="MASS">
<xsclass="underline" value-of select="."/>
<xsclass="underline" value-of select="@UNITS"/>
</xsclass="underline" template>
<xsclass="underline" template match="RADIUS">
<xsclass="underline" value-of select="."/>
<xsclass="underline" value-of select="@UNITS"/>
</xsclass="underline" template>
<xsclass="underline" template match="DAY">
<xsclass="underline" value-of select="."/>
<xsclass="underline" value-of select="@UNITS"/>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Результаты работы показаны на рис. 3.1, Как видите, теперь мы извлекли строковое значение атрибута UNITS и отобразили его.
Рис. 3.1. Вывод значений атрибутов, первый вариант
Рисунок 3.1 не совсем точен: обратите внимание на то, что между значением и соответствующей единицей измерения в таблице нет пробела. Процессор XSLT просто поместил в результирующее дерево текст без каких-либо разделителей между текстовыми узлами. Хотя это в точности соответствует требованиям рекомендации XSLT, нам бы хотелось, чтобы элементы таблицы выглядели как «1516 miles», а не «1516miles». Как нам добавить этот дополнительный пробел?
Элемент <xsclass="underline" text>
Работа с пробелами всегда обсуждается при рассмотрении XSLT, и в данной главе я уделю этой теме некоторое время. Вставить единственный пробел несложно при помощи элемента <xsclass="underline" text>, который используется для вставки символьного текста непосредственно в дерево вывода. У этого элемента только один атрибут:
• disable-output-escaping. Устанавливается в yes для того, чтобы такие символы, как < и >, выводились буквально, а не как < и >. По умолчанию установлен в no.
Этот элемент может содержать только текстовый узел.
Текстовые узлы создаются при помощи элемента <xsclass="underline" text>, позволяющего по ходу дела замещать элементы целиком на текст. Одна из целей применения <xsclass="underline" text> — сохранить символы-разделители, как в следующем примере (листинг 3.4), в котором элемент <xsclass="underline" text> используется для вставки пробелов.
Листинг 3.4. Вставка пробелов в таблицу стилей<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="/PLANETS">
<HTML>
<HEAD>
<TITLE>
The Planets Table
</TITLE>
</HEAD>
<BODY>
<H1>
The Planets Table
</H1>
<TABLE>
<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" apply-templates select="MASS"/></TD>
<TD><xsclass="underline" apply-templates select="RADIUS"/></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>
Новый результат виден на рис. 3.2, на котором между числовыми значениями и их единицами измерения вставлены пробелы.
Рис. 3.2. Вывод значений атрибутов, второй вариант
Как видите, элемент <xsclass="underline" text> весьма удобен. Тем не менее вам следует знать вот что: по умолчанию элементы <xsclass="underline" text> заменяют символы, которые могут входить в разметку, на эскейп-последовательности. Например, <xsclass="underline" text>Here is а greater-than sign: ></xsclass="underline" text> будет выведено как «Here is a greater-than sign: >,», а не как «Herе is a greater-than sign: >». А если попытаться использовать < внутри элемента <xsclass="underline" text>, процессор XSLT посчитает, что вы пытаетесь открыть элемент внутри элемента <xsclass="underline" text>, что неверно. Как же вывести значащие символы, такие как < и >, если есть необходимость? Это можно сделать путем отключения вывода ESC-последовательностей (disabling output escaping).
УСОВЕРШЕНСТВОВАНИЯ В XSLT 2.0
Один из вопросов, которые призван решить XSLT 2.0, это упрощение импорта подобного текста без разбора из других файлов.
Отключение вывода эскейп-последовательностей
При помощи <xsclass="underline" text> можно включать в выходной документ непосредственно символы < и &, а не последовательности < и &. Для этого следует установить атрибут disable-output-escaping элемента <xsclass="underline" text> в yes («да», по умолчанию он установлен в no, «нет»). В приведенном ниже примере я при помощи <xsclass="underline" text> непосредственно пишу текст "<PLANET/>" в выходной документ:
<?xml version="1.0"?>
<xsclass="underline" stylesheet
version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="PLANETS">