Книга: XSLT

Отключение вывода эскейп-последовательностей

Отключение вывода эскейп-последовательностей

При помощи <xsl:text> можно включать в выходной документ непосредственно символы < и &, а не последовательности &lt; и &amp;. Для этого следует установить атрибут 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">
   &lt;PLANET/&gt;
  </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 все равно заменят < на &lt;, а > на &gt;.

Правильный способ добавить в вывод элемент <!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">
   &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&gt;
  </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>
   <TD><xsl:apply-templates select="MASS"/></TD>
   <TD><xsl:apply-templates select="RADIUS"/></TD>
   <TD><xsl:apply-templates select="DAY"/></TD>
  </TR>
 </xsl:template>
 <xsl:template match="MASS">
  <xsl:value-of select="."/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="@UNITS"/>
 </xsl:template>
 <xsl:template match="RADIUS">
  <xsl:value-of select="."/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="@UNITS"/>
 </xsl:template>
 <xsl:template match="DAY">
  <xsl:value-of select="."/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="@UNITS"/>
 </xsl:template>
</xsl:stylesheet>
 

А вот результат:

<?xml version="1.0" encoding-"UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE>
   The Planets Table
  </TITLE>
 </HEAD>
 <BODY>
  <H1>
   The Planets Table
   .
   .
   .

Далее в книге будут приведены другие примеры использования <xsl:text>, в том числе — при обсуждении символов-разделителей далее в этой главе.

Оглавление книги


Генерация: 1.223. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз