Идентичное преобразование
Идентичное преобразование
Наличие в XSLT шаблонов, выполняемых по умолчанию, иногда приводит к тому, что процессоры ведут себя не совсем логично с человеческой точки зрения. Например, в простейшем случае может понадобиться переименовать все элементы с именами bold в элементы с именами b. Однако результатом обработки документа
<а>
text a
<bold>
text b
<bold/>
</bold>
<c>
text c
</c>
</a>
преобразованием
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="bold">
<b><xsl:apply-templates/></b>
</xsl:template>
</xsl:stylesheet>
будет документ вида
text a
<b>
text b
<b/>
</b>
text c
Как можно заметить, в выходящем документе элементы а и с "пропали", но при этом их содержимое осталось нетронутым. Все дело во встроенных шаблонах, которые по умолчанию рекурсивно обрабатывают содержимое элементов и копируют текстовые узлы, если иного не определено.
Для того чтобы избежать подобного рода казусов, можно использовать идентичное преобразование, которое в случае отсутствия шаблонов для обработки тех или иных узлов копирует их в выходящий документ как есть. Идентичное преобразование записывается в следующем виде.
Листинг 5.11. Идентичное преобразование
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Единственный шаблон этого преобразования при помощи элемента xsl:copy рекурсивно создает в выходящем документе копии узлов и атрибутов. На практике идентичное преобразование используется очень часто, и потому мы настоятельно рекомендуем сохранить его в отдельном файле и импортировать при потребности.
Поясним, что это преобразование выполняет не просто копирование документа (для этого было бы достаточно элемента xsl:copy-of). Идентичное преобразование переопределяет встроенные шаблоны; теперь, если для обработки какого-либо узла в преобразовании не определено подходящего шаблона, он вместе со всеми своими потомками будет скопирован в выходящий документ без изменений.
Идентичное преобразование очень полезно в тех случаях, когда требуется изменить только некоторые части документа, оставив остальное в неприкосновенности. Например, в предыдущем примере нам нужно было только переименовать все документы bold. Искомое преобразование, импортирующее идентичное преобразование из файла identity.xsl, будет записано следующим образом.
Листинг 5.12
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="identity.xsl"/>
<xsl:template match="bold">
<b>
<xsl:apply-templates/>
</b>
</xsl:template>
</xsl:stylesheet>
Результат будет иметь вид:
<a>
text a
<b>
text b
<b/>
</b>
<c>
text c
</c>
</a>
Другим примером использования идентичного преобразования может послужить случай, когда нужно просто удалить из документа некоторые узлы. Например, нам необходимо избавиться от комментариев (быстро и без шума).
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="identity.xsl"/>
<xsl:template match="comment()"/>
</xsl:stylesheet>
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
28.1. Преобразование идентификатора в имя
28.1. Преобразование идентификатора в имя В результате выполнения команды ls -l для вывода списка содержимого текущего каталога в третьей и четвертой колонках указываются идентификаторы (ID) пользователя и группы, к которой принадлежит каждый файл. Этот список выглядит
Преобразование кодировок
Преобразование кодировок convert_cyr_stringПреобразует строку из одной кодировки кириллицы в другую.Синтаксис:string convert_cyr_string(string str, string from, string to);Функция переводит строку str из кодировки from в кодировку to. Конечно, это имеет смысл только для строк, содержащих "русские" буквы, т.к.
5.3.2. Преобразование AudioCD
5.3.2. Преобразование AudioCD У вас завалялись обычные AudioCD и вы хотите преобразовать их в формат МРЗ? Нет ничего проще. Вставьте AudioCD-диск в устройство и откройте программу Звуковыжималка (команда меню Приложения?Аудио и видео?Копирование звуковых дисков) (рис. 5.19). Puc. 5.19. Окно
Преобразование в тело
Преобразование в тело Команда CONVTOSOLID преобразует в трехмерные тела полилинии и окружности, для которых задана высота. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Solid.В выдавленные трехмерные тела можно преобразовать следующие объекты:• полилинии с
Преобразование в поверхность
Преобразование в поверхность Команда CONVTOSURFACE преобразует объекты в поверхности. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Sufrace.В поверхности можно преобразовать следующие объекты:• двумерные фигуры;• области;• разомкнутые полилинии с нулевой шириной,
Видовое преобразование
Видовое преобразование К видовым преобразованиям будем относить перенос, поворот и изменение масштаба вдоль координатных осей. Для проведения этих операций достаточно умножить на соответствующую матрицу каждую вершину объекта и получить измененные координаты этой
6.2.5. Преобразование в массив
6.2.5. Преобразование в массив Когда диапазон преобразуется в массив, интерпретатор последовательно вызывает метод succ, пока не будет достигнута правая граница, и помещает каждый элемент диапазона в возвращаемый массив:r = 3..12arr = r.to_a # [3,4,5,6,7,8,9,10,11,12]Ясно, что для диапазонов
Преобразование в поверхность
Преобразование в поверхность Команда CONVTOSURFACE преобразует объекты в поверхности. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Sufrace.В поверхности можно преобразовать следующие объекты:• двумерные фигуры;• области;• разомкнутые полилинии с нулевой
Преобразование в поверхность
Преобразование в поверхность Команда CONVTOSURFACE преобразует объекты в поверхности. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Sufrace.В поверхности можно преобразовать следующие объекты:• двумерные фигуры;• области;• разомкнутые полилинии с нулевой шириной,
Преобразование в тело
Преобразование в тело Команда CONVTOSOLID преобразует в трехмерные тела полилинии и окружности, для которых задана высота. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Solid.В выдавленные трехмерные тела можно преобразовать следующие объекты:? полилинии с
Преобразование в поверхность
Преобразование в поверхность Команда CONVTOSURFACE преобразует объекты в поверхности. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Surface.В поверхности можно преобразовать следующие объекты: двумерные фигуры; области; разомкнутые полилинии с нулевой шириной,
3.2.5 Преобразование типа
3.2.5 Преобразование типа Бывает необходимо явно преобразовать значение одного тпа в значение другого. Явное преобразование типа дает значние одного типа для данного значения другого типа. Например:float r = float(1);перед присваиванием преобразует целое значение 1 к знчению с