Предположим, что в преобразовании версия выходящего документа задана как 1.2:
<xsl:output method='xml' version='1.2'/>
Тогда процессор может вывести декларацию XML в следующем виде:
<?xml version='1.2' encoding='utf-8'?>
Значением атрибута version по умолчанию является '1.0'
, то есть, для того, чтобы получить декларацию XML вида
<?xml version='1.0'
достаточно опустить определение атрибута version
:
<xsl:output method='xml'/>
Атрибут encoding
указывает на то, какая кодировка предпочтительна для выходящего документа. Множество кодировок зависит от используемого процессора, но при этом в соответствии с технической рекомендацией все они обязаны поддерживать Unicode-формы кодировок UTF-8 и UTF-16.
В случае если процессор не поддерживает кодировку, указанную в атрибуте encoding
, процессор может либо выдать ошибку, либо использовать UTF-8 или UTF-16.
Если атрибут encoding
опущен, процессор должен по умолчанию использовать UTF-8 или UTF-16. На практике абсолютное большинство процессоров используют по умолчанию кодировку UTF- 8.
При выводе содержимого выходящего документа может возникнуть ситуация, когда в выходящем потоке будут находиться символы, которые невозможно будет отобразить при используемой кодировке. В этом случае непечатаемые символы должны быть заменены символьными сущностями.
Представим себе входящий документ в кодировке UTF-8, содержащий символ кириллицы 'Э
' с Unicode-кодом #x42d
(или #1069
в десятичной системе счисления):
<?xml version='1.0' encoding='utf-8'?>
<page>Э</page>
Если преобразование будет использовать для вывода кодировку, которая не может отображать символы кириллического алфавита, например ISO-8859-1, то символ 'Э
' в выходящем документе должен быть заменен символьной сущностью.
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output
method='xml'
encoding='ISO-8859-1'
indent='yes'/>
<xsl:template match='/'>
<xsl:copy-of select='/page'/>
</xsl:template>
</xsl:stylesheet>
<?xml version='1.0' encoding='ISO-8859-1'?>
<page>Э</page>
Вместе с тем синтаксис XML не разрешает использовать символьные сущности в именах элементов и атрибутов, и наличие в них символов, не отображаемых кодировкой вывода, будет являться ошибкой. Если в предыдущем примере документ будет иметь вид
<?xml version='1.0' encoding='utf-8'?>
<страница>Э</страница>
то вывести результирующее дерево в кодировке ISO-8859-1 будет невозможно.
Индентацией называют форматирование исходного текста, не влияющее на семантику, но облегчающее читаемость. К примеру, один и тот же XML-документ можно написать как
<A><В><С/></В><С><В></В></С></А>
или
<A>
<B>
<C/>
</B>
<C>
<B>
</B>
</C>
</A>
Очевидно, что второй случай гораздо легче для понимания, поскольку в нем легко можно видеть принадлежность элементов одного другому. Подобное форматирование можно использовать и при выводе преобразованного документа при помощи атрибута indent
элемента xsl:output
. Если этот атрибут имеет значение 'yes'
, процессор может добавить один или несколько пробельных символов или символов перевода строки — в зависимости от реализации. Как правило, каждый дочерний элемент помещают на новой строке, добавляя впереди два пробела на каждый уровень вложенности.
<?xml version='1.0' encoding='utf-8'?>
<A><B><C/></B><C><B></В></C></A>
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output indent='yes'/>
<xsl:template match='/'>
<xsl:copy-of select='/'/>
</xsl:template>
</xsl:stylesheet>
<?xml version='1.0' encoding='utf-8'?>
<A>
<B>
<C/>