Главная » XSLT » Решение трудных задач сериализации с помощью таблиц символов

0

Задача

Необходим точный контроль над сериализацией документа, а имеющаяся в XSLT 1.0 команда disable-output-escaping предоставляет слишком огра­ниченные возможности.

Решение

В XSLT 2.0 появились так называемые таблицы символов, обеспечивающие точный контроль над сериализацией. Эти таблицы предназначены для использо­вания вместе с командой xsl:output.

Команда xsl:character-map обладает следующими атрибутами:

name

Задает имя таблицы символов.

use-character-maps

Список других таблиц символов, включаемых в данную.

Содержимым элемента xsl:character-map является последовательность элементов xsl:output-character. Они определяют отображение между одним символов Unicode и строкой, выводимой взамен него при сериализации этого символа. Следующую таблицу можно использовать для вывода различных специ­альных символов пропуска в виде компонентов:

<xsl:character-map name="spaces">

<xsl:output-character char="&#xA0;" string="&amp;npsp;"/> <xsl:output-character char="&#x2003;" string="&amp;emsp;"/> <xsl:output-character char="&#x2 0 07;" string="&amp;numsp;"/> <xsl:output-character char="&#x2008;" string="&amp;puncsp;"/> <xsl:output-character char="&#x2009;" string="&amp;thincsp;"/> <xsl:output-character char="&#x2 0 0A;" string="&amp;hairsp;"/>

</xsl:character-map>

Есть еще одно более тонкое применение таблицы символов – вывод нестандартных документов, которые иначе было бы трудно создать, потому что они нарушают правила XML или XSLT. В третьем издании своей книги XSLT Programmer’s Reference Майкл Кэй приводит пример вывода закомментированных элементов. Пример ниже – это ва­риация на ту же тему. Идея заключается в том, чтобы сгенерировать копию входного документа, закомментировав некоторые элементы согласно синтаксису XML:

<?xml version="1.0"?>

<!– Oпpeдeляeм для ceбя компо^нты, пользуясь символами из частного

диапазона Unicode –>

<!DOCTYPE xsl:stylesheet [

<!ENTITY start-comment "&#xE501;"> <!ENTITY end-comment "&#xE502;">

]>

<xsl:stylesheet version="2.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!– Импортируем тождественное преобразование –> <xsl:import href="copy.xslt"/>

<!– Просим сериализатор применять нашу таблицу символов, которая определена ниже –>

<xsl:output use-character-maps="comment-delimiters"/>

<!– Определяем ключ, который будет использоваться для идентификации элементов, подлежащих комментированию –> <xsl:key name="omit-key" match="omit" use="@id"/>

<!– Отображаем определенные выше компоненты на строки, образующие начало и конец комментария в синтаксисе XML –> <xsl:character-map name="comment-delimiters">

<xsl:output-character character="&start-comment;" string="&lt;!–"/> <xsl:output-character character="&end-comment;" string="-&gt;"/> </xsl:character-map>

<!– Комментируем те элементы, для которых атрибут id соответствует id элемента omit из внешнего документа omit.xml –> <xsl:template match="*[key(‘omit-key’,@id,doc(,omit.xml,))]"> <xsl:text>&start-comment;</xsl:text> <xsl:copy>

<xsl:apply select="@* | *"/> </xsl:copy>

<xsl:text>&end-comment;</xsl:text> </xsl:template>

См. также

Эван Ленц разработал конвертер из XML в строку, который позволяет по-другому решить задачу точного контроля над сериализацией. См. http:// xmlportfolio.com/xml-to-string/.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии