</xsl:template>
то в выходящем документе специальные символы будут заменены:
<p>An elephant
<br/>This is a <em>big</em> and <b>grey</b> animal!</p>
Для того чтобы избежать замены, можно воспользоваться атрибутом disable-output- escaping
(отменить замену символов) элементов xsl:value-of
и xsl:text. Этот атрибут может принимать значения 'yes'
и 'no'
('no' — значение по умолчанию). Значение 'yes'
означает, что процессор при выводе текста, создаваемого xsl:text
или xsl:value-of
не должен заменять специальные символы. Если бы в предыдущем примере мы использовали преобразование.
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output indent='yes' method='xml'/>
<xsl:template match='product'>
<p>
<xsl:value-of select='title'/><xsl:text>
</xsl:text><br/>
<xsl:value-of disable-output-escaping='yes' select='description'/>
</p>
</xsl:template>
</xsl:stylesheet>
то на выходе мы бы получили документ
<?xml version='1.0' encoding='utf-8'?>
<p>An elephant
<br/>This is a <em>big</em> and <b>grey</b> animal! </p>
Атрибут disable-output-escaping
налагает ряд ограничений на использование текстовых узлов, генерируемых элементами xsl:text
и xsl:value-of
: эти узлы не могут входить в качестве текстового содержимого в узлы атрибутов, комментариев или инструкций по обработке. Кроме того, дерево, содержащее текстовые узлы, для которых была отменена замена специальных символов, не может быть приведено к строке или числу. И в том и в другом случае процессор может либо выдать ошибку преобразования, либо проигнорировать отмену замены специальных символов.
Атрибут disable-output-escaping
имеет также и более концептуальное ограничение. Процессор сможет отменить замену символов только в том случае, когда он сам будет контролировать процесс вывода. Как мы уже обсуждали в предыдущем разделе, ситуации, когда процесс вывода не будет выполняться самим процессором, не такая уж и редкость. Поэтому следует использовать disable- output-escaping
только в тех случаях, когда другой альтернативы нет или когда имеется полная уверенность, что этот метод будет работать.
Атрибут disable-output-escaping
работает с методами вывода 'xml'
и 'html'
, но не оказывает никакого влияния на метод 'text'
, поскольку при этом методе все специальные символы и так выводятся без замены.
Кодировки в XSLT-преобразованиях
Несмотря на то, что в логических деревьях, которыми манипулирует XSLT, текстовые узлы представляются в кодировке Unicode, очень часто в обрабатываемых документах бывает необходимо использовать также другие кодировки. К примеру, большинство русскоязычных документов хранятся в кодировках Windows-1251 и KOI8-R.
Если внимательно присмотреться к преобразованиям, можно заметить, что, как правило, в них участвуют минимум три документа — входящий (преобразовываемый) документ, документ преобразования (преобразующий) и выходящий (преобразованный документ). Соответственно, каждый из них может иметь собственную кодировку.
Кодировка входящего документа указывается в его xml-декларации. Например, документы в кодировке Windows-1251 должны иметь xml-декларацию вида
<?xml version='1.0' encoding='windows-1251'?>
Возможно, небольшим сюрпризом окажется то, что в соответствии со стандартом XML, имена тегов вовсе не обязаны состоять исключительно из латинских букв. В имени элемента можно использовать весь кириллический алфавит, а также множество других символов. Совершенно корректным будет документ
<?xml version='1.0' encoding='windows-1251'?>
<страница>
<содержимое/>
</страница>
Аналогичным образом кириллицу, а также другие наборы символов и алфавиты можно использовать и в самих преобразованиях, поскольку те в свою очередь также являются XML-документами.
<?xml version='1.0' encoding='windows-1251'?>
<каждый>
<охотник>
<желает>
<знать>
<где>
<сидит>
<фазан/>
</сидит>
</где>
</знать>
</желает>
</охотник>
</каждый>
<?xml version='1.0' encoding='windows-1251'?>
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output indent='yes' encoding='windows-1251'/>
<xsl:template match='каждый'>
<редкий>
<xsl:apply-templates/>
</редкий>