Вместе с тем синтаксис XML не разрешает использовать символьные сущности в именах элементов и атрибутов, и наличие в них символов, не отображаемых кодировкой вывода, будет являться ошибкой. Если в предыдущем примере документ будет иметь вид
<?xml version="1.0" encoding="utf-8"?>
<страница>Э</страница>
то
вывести результирующее дерево в кодировке ISO-8859-1 будет невозможно.
Атрибут indent
Индентацией называют форматирование исходного текста, не влияющее на семантику, но облегчающее читаемость. К примеру, один и тот же XML-документ можно написать как
<A><В><С/></В><С><В></В></С></А>
или
<A>
<B>
<C/>
</B>
<C>
<B>
</B>
</C>
</A>
Очевидно, что второй случай гораздо легче для понимания, поскольку в нем легко можно видеть принадлежность элементов одного другому. Подобное форматирование можно использовать и при выводе преобразованного документа при помощи атрибута
indent
элемента
xsl:output
. Если этот атрибут имеет значение
"yes"
, процессор может добавить один или несколько пробельных символов или символов перевода строки — в зависимости от реализации. Как правило, каждый дочерний элемент помещают на новой строке, добавляя впереди два пробела на каждый уровень вложенности.
Пример
Листинг 8.38. Входящий документ
<?xml version="1.0" encoding="utf-8"?>
<A><B><C/></B><C><B></В></C></A>
Листинг 8.39. Преобразование
<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>
Листинг 8.40. Выходящий документ
<?xml version="1.0" encoding="utf-8"?>
<A>
<B>
<C/>
</B>
<C>
<B/>
</C>
</A>
Следует быть осторожными при использовании
indent="yes"
там, где в содержимом документа могут встречаться значащие пробелы. Индентация позволяет процессору при выводе документа добавлять пробельные символы по собственному усмотрению. В случаях, когда при последующей обработке преобразованного
документа пробельные символы могут быть восприняты неадекватно, лучше индентацию не использовать.
Атрибут cdata-section-elements
Для того чтобы вывести текстовое содержимое некоторых элементов в виде секций CDATA, XSLT предлагает простой механизм — следует лишь перечислить в атрибуте
cdata-section-elements
элемента
xsl:output
элементы, которые на выходе должны содержать секции символьных данных.
Пример
Листинг 8.41. Входящий документ
<?xml version="1.0" encoding="utf-8"?>
<page><br/><br/></page>
Листинг 8.42. Преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
indent="yes"
cdata-section-elements="page"/>
<xsl:template match="/">
<xsl:copy-of select="/"/>
</xsl:template>
</xsl:stylesheet>
Листинг 8.43. Выходящий документ
<?xml version="1.0" encoding="utf-8"?>
<page><![CDATA[<br/>]]><br/>
</page>
В соответствии с синтаксисом XML, секции CDATA не могут содержать последовательности символов "
]]>
". Потому, встретив такую комбинацию в тексте элемента, имя которого включено в
cdata-section-elements
, процессор заменит ее двумя секциями CDATA. Одна будет содержать "