УСОВЕРШЕНСТВОВАНИЯ В XSLT 2.0
Один из вопросов, которые призван решить XSLT 2.0, это упрощение импорта подобного текста без разбора из других файлов.
Отключение вывода эскейп-последовательностей
При помощи <xsl:text>
можно включать в выходной документ непосредственно символы < и &, а не последовательности <
и &
. Для этого следует установить атрибут disable-output-escaping
элемента <xsl:text>
в yes («да», по умолчанию он установлен в no
, «нет»). В приведенном ниже примере я при помощи <xsl:text>
непосредственно пишу текст '<PLANET/>
' в выходной документ:
<?xml version='1.0'?>
<xsl:stylesheet
version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='PLANETS'>
<HTML>
<HEAD>
<TITLE>
Planets
</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates select='PLANET'/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match='PLANET'>
<xsl:text disable-output-escaping='yes'>
<PLANET/>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Результат следующий:
<HTML>
<HEAD>
<TITLE>
Planets
</TITLE>
</HEAD>
<BODY>
<PLANET/>
<PLANET/>
<PLANET/>
</BODY>
</HTML>
Разумеется, не обязательно выводить <PLANET/>
при помощи <xsl:text>
: этот элемент можно было поместить непосредственно в элемент буквального результата. Но что делать в тех случаях, когда процессор XSLT не сможет распознать нужный нам в выходном документе элемент как фактический элемент? Например, в преобразованных документах XHTML вам потребуется <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'>
, но процессор XSLT сочтет, что это не хорошо сформированный XML. Как поместить этот элемент в выходные данные?
Можно попробовать поместить этот элемент в раздел <!CDATA[ ]>
, как мы увидим в главе 6, и попытаться трактовать его как простые символьные данные, но процессоры XSLT все равно заменят < на <
, а > на >
.
Правильный способ добавить в вывод элемент <!DOCTYPE>
— использовать атрибут doctype-public
элемента <xsl:output>
, как мы увидим в главе 6, но в качестве демонстрации для этих целей здесь я отключу вывод ESC-последовательностей в элементе <xsl:text>
(хотя этот способ не рекомендован для создания элементов <! DOCTYPE>
). Вот как это выглядит:
<?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='/PLANETS'>
<xsl:text disab1e-output-escaping='yes'>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'>
</xsl:text>
<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>
<TD><xsl:value-of select='NAME'/></TD>