Алексей Валиков - Технология XSLT
<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. Одна будет содержать "]]", вторая – ">".
Пример Листинг 8.44. Входящий документ<?xml version="1.0" encoding="utf-8"?>
<page>
<data>]]></data>
<pre><!-- Comment --></pre>
</page>
Листинг 8.45. Преобразование<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
indent="yes"
cdata-section-elements="data pre"/>
<xsl:template match="/">
<xsl:copy-of select="/"/>
</xsl:template>
</xsl:stylesheet>
Листинг 8.46. Выходящий документ<?xml version="1.0" encoding="utf-8"?>
<page>
<data><![CDATA[]]]]><![CDATA[>]]></data>
<pre><![CDATA[<!-- Comment -->]]></pre>
</page>
Атрибут doctype-systemДля определения логической структуры документов в XML используются DTD — определения типов документов. В большинстве случаев определения типов содержатся во внешних ресурсах, которые включаются в документ в виде системных или публичных идентификаторов.
XSLT позволяет создавать ссылки на внешние определения типов при помощи атрибута doctype-system элемента xsl:output.
ПримерПредположим, что мы создаем документ, логическая схема которого определена во внешнем файле по адресу "/dtds/document.dtd". Тогда, определив в преобразовании элемент xsl:output с атрибутом doctype-system, равным "/dtds/document.dtd", мы получим в выходящем документе определение типа в виде
<!DOCTYPE элемент SYSTEM "/dtds/document.dtd">
где элемент — первый элемент выходящего документа.
Листинг 8.47. Входящий документ<?xml version="1.0" encoding="utf-8"?>
<page> content </page>
Листинг 8.48. Преобразование<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" doctype-system="/dtds/document.dtd"/>
<xsl:template match="/"><xsl:copy-of select="/"/></xsl: template>
</xsl:stylesheet>
Листинг 8.49. Выходящий документ<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE page SYSTEM "/dtds/document.dtd">
<page> content </page>
Атрибут doctype-publicЕсли в преобразовании атрибутом doctype-system элемента xsl:output задано внешнее определение логического типа документа, это определение может быть расширено также и публичным идентификатором. Публичный идентификатор указывается в атрибуте doctype-public элемента xsl:output. Его использование может быть продемонстрировано следующим примером.
Листинг 8.50. Входящий документ<?xml version="1.0" encoding="utf-8"?>
<page> content </page>
Листинг 8.51. Преобразование<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"
doctype-system="/dtds/document.dtd"
doctype-public="-//Document//Description" />
<xsl:template match="/"><xsl:copy-of select="/"/></xsl:template>
</xsl:stylesheet>
Листинг 8.52. Выходящий документ<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE page
PUBLIC "-//Document//Description" "/dtds/document.dtd">
<page> content </page>
Атрибут media-typeАтрибут media-type позволяет задавать медиа-тип содержимого выходящего документа. Для метода вывода "xml" значением media-type по умолчанию является "text/xml". Несмотря на то, что media-type не оказывает никакого влияния на содержимое самого документа, XSLT-процессоры, используемые на стороне сервера, могут в зависимости от значения этого атрибута изменять MIME-тип исходящих данных при использовании, к примеру, такого протокола, как HTTP.
Атрибут omit-xml-declarationXML-документы, в принципе, могут быть корректными и без декларации XML. Поэтому XSLT позволяет опускать эту декларацию в выходящем документе, для чего значению атрибута omit-xml-declaration должно быть присвоено "yes":
<xsl:output
omit-xml-declaration="yes"/>
В случае если значение атрибута omit-xml-declaration опущено или не равно "yes", процессор будет выводить в выходящем документе декларацию XML, которая включает информацию о версии (по умолчанию "1.0") и кодировке документа (по умолчанию "utf-8" или "utf-16" в зависимости от процессора).
Атрибут standaloneДля того чтобы объявить документ как самостоятельный или несамостоятельный (standalone или non-standalone соответственно), следует использовать атрибут standalone элемента xsl:output. Если этот атрибут будет присутствовать в xsl:output, то процессор включит в декларацию XML объявление standalone с соответствующим значением. Если атрибут standalone не указан, объявление standalone в декларацию XML выходящего документа включено не будет.
Метод вывода "html"
В нынешнем состоянии языки XML и HTML сильно похожи синтаксически, но при этом имеют некоторые довольно весомые различия. Метод вывода "html" используется для того, чтобы выводить документы в формате, который будет понятен большинству существующих на данный момент Web-браузеров.
Одно из основных различий HTML и XML состоит в том, что в XML пустые элементы имеют формат <имя/>, в то время как в HTML тот же элемент был бы выведен, как <имя> — без косой черты. Метод вывода "html" учитывает эти различия и выводит теги пустых элементов HTML без косой черты после имени. В соответствии с технической рекомендацией языка HTML 4.0, пустыми элементами являются area, base, basefont, br, col, frame, hr, img, input, isindex, link, meta и param.
Пример Листинг 8.53. Входящий документ<?xml version="1.0" encoding="utf-8"?>
<page>
<title>I'm just a simple page...</title>
<content>I've got a simple content</content>
</page>
Листинг 8.54. Преобразование<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="html"/>
<xsl:template match="/page">
<html>
<head>
<title>
<xsl:value-of select="title"/>
</title>
</head>
<body>
Welcome!<br/>
Be our guest! <HR/>
<xsl:value-of select="content"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Листинг 8.55. Выходящий документ<html>
<head>