
- •Лекция 4-08
- •5.3.9. Создание текстовых узлов вXslt
- •5.3.9.1. Элементxsl:text
- •5.3.9.2. Элементxsl:value-of
- •5.3.9.3. Встроенные правила шаблона
- •1. Поздравление
- •2. Напоминание
- •5.3.9.4. Обработка пробельных символов
- •5.3.10. Создание узлов документа, комментариев, инструкций по обработке и пространства имен вXslt
- •5.3.10.1. Элемент xsl:document
- •5.3.10.2. Элементxsl:result-document
- •5.3.10.3. Элементxsl:comment
- •5.3.10.4. Элемент xsl:processing-instruction
- •5.3.10.5. Элементxsl:namespace
- •5.3.11. Копирование узлов вXslt
- •5.3.11.1. Элементxsl:copy
- •5.3.11.2. Элементxsl:copy-of
- •5.3.11.3. Элементxsl:sequence
- •5.3.12. Условная и циклическая обработка вXslt
- •5.3.12.1. Элементxsl:if
- •5.3.12.2. Элементы xsl:choose, xsl:when и xsl:otherwise
- •5.3.12.3. Элементxsl:for-each
- •5.3.12.4. Сортировка вXslt
- •5.3.13. Сообщения процессораXslt
- •5.3.14. Псевдонимы пространства имен вXslt
- •5.3.15. Нумерация вXslt
- •3. Поздравление
- •1. Поздравление
- •1. Поздравление
- •01). Поздравление
- •0:00:00:00:01)Поздравление
- •5.3.16. Форматирование чисел в xslt
- •5.3.17. Использование ключей вXslt
- •5.3.18. Переменные, параметры и функции вXslt
- •5.3.18.1. Переменные в xslt
- •5.3.18.2. Вызов именованных правил шаблона
- •5.3.18.3. Параметры в xslt
- •5.3.18.4. Функции стилей в xslt
- •5.3.19. Дополнительные функции xslt
- •5.3.19.1. Функцияdocument()
- •5.3.19.2. Функцияcurrent()
- •5.3.19.3. Функцияgenerate-id()
- •5.3.19.4. Функция system-property()
- •5.3.19.5. Функцияunparsed-entity-uri()
- •5.3.20 Использование расширений вXslt
- •5.3.20.1. Средства расширенияXslt
- •5.3.20.2. Инициатива exslt
- •5.3.20.3. Средства расширения в процессореMsxml
- •5.3.20.4. Средства расширения в процессореSaxon
5.3.13. Сообщения процессораXslt
Процессор XSLTсам выбирает, как и в какой последовательности он будет выполнять правила шаблона. Для получения информации о ходе преобразования, особенно при сложном преобразовании документов, а также прерывании обработки при возникновении ошибочных ситуаций можно использовать элементxsl:message, который имеет следующий синтаксис:
<xsl:message
select = "выражение"
terminate="yes"|"no"
>
<!--
Содержимое: конструктор последовательности
-->
</xsl:message>
Элемент xsl:messageуказывает процессору на то, что он должен вывести сообщение, которое является результатом обработки шаблона, содержащегося в этом элементе.
Необязательный атрибут select задает выражение XPath, результат вычисления которого выводится в начале сообщения. Альтернативным способом является задание сообщения с помощью конструктора в содержимом элементаxsl:message.
Необязательный атрибут terminateуказывает на то, должен ли процессор прекратить дальнейшую обработку документа или нет (значением этого атрибута по умолчанию является"no").
Пример использования элемента xsl:message:
<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="text"
encoding="Windows-1251"
indent="yes"
/>
<xsl:template match="text()">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="header">
От: <xsl:value-of select="./to/@address"/>
<xsl:message>
<xsl:text>Processing element </xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>[</xsl:text>
<xsl:value-of
select="count(preceding-sibling::header)+1"/>
<xsl:text>]/to[</xsl:text>
<xsl:value-of
select="count(preceding-sibling::to)+1"/>
<xsl:text>]</xsl:text>
</xsl:message>
</xsl:template>
</xsl:stylesheet>
Выходной текстовый документ будет иметь следующий вид:
От: petrov@mail.com
От: sidorov@mail.com,
а процессор XSLTвыдаст следующие сообщения:
Processing element header[1]/to[1]
Processing element header[2]/to[1].
5.3.14. Псевдонимы пространства имен вXslt
Документ XML, являющийся результатом выполнения преобразования XSLT, может и сам быть преобразованием XSLT, т.е. преобразования могут генерироваться другими преобразованиями. В некоторых случаях такая возможность будет очень полезна, например, входящий XML-документ может описывать преобразование, которое нужно сгенерировать.
Прямое решение этой задачи является очень сложным, так как нельзя просто включать в выходной документ XMLсоздаваемое правило: создаваемые в шаблоне элементы пространства именXSLT, воспринимались бы не как генерируемые, а как принадлежащие генерирующему преобразованию.
Проблему состоит в том, что в преобразовании необходимо использовать элементы одного пространства имен так, как если бы они относились к другому пространству.
Для решения этой проблемы в XSLTвведен элементxsl:namespace-alias, который имеет следующий синтаксис:
<xsl:namespace-alias
stylesheet-prefix="префикс" | "#default"
result-prefix="префикс"|"#default"
/>
Элемент xsl:namespace-aliasназначает пространству имен выходящего документа пространство имен, которое будет подменять его в преобразовании, т.е. псевдоним пространства имен.
Обязательный атрибут result-prefixуказывает, какому пространству имен назначается псевдоним. Обязательный атрибутstylesheet-prefixуказывает, какое пространство имен будет использоваться в качестве его псевдонима в преобразовании. Оба атрибута содержат префиксы пространств имен, которые должны быть ранее объявлены в преобразовании.
Атрибуты stylesheet-prefixиresult-prefixэлементаxsl:namespace-aliasмогут иметь значения"#default", например, определение вида
<xsl:namespace-alias
stylesheet-prefix="a"
result-prefix="#default"/>
означает, что элементы, принадлежащие в преобразовании пространству имен a, в выходящем документе должны принадлежать пространству имен по умолчанию.
Определение вида
<xsl:namespace-alias
stylesheet-prefix="#default"
result-prefix="a"/>
означает, что элементы, принадлежащие в преобразовании пространству имен по умолчанию, в выходящем документе должны принадлежать пространству имен a.
Пример использования элемента xsl:namespace-alias:
Документ XML, описывающий преобразование атрибутаaddressв текстовое содержимое элементовfromиtoимеет следующий вид:
<?xml version="1.0" encoding="Windows-1251"?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<transform>
<convert select="from" to-text="address"/>
<convert select="to" to-text="address"/>
</transform>.
Документ XSLT, преобразующий этот документ в набор шаблонных правил для выполнения требуемой обработки документаmessage.xmlимеет следующий вид:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:axsl="http://www.w3.org/1999/XSL/Transform/Alias">
<xsl:output
method="xml"
encoding="Windows-1251"
indent="yes"/>
<xsl:namespace-alias
stylesheet-prefix="axsl"
result-prefix="xsl"/>
<xsl:template match="convert">
<axsl:template match="{@select}">
<axsl:element name="{@select}">
<axsl:for-each select="@*">
<axsl:if test="name(.) != 'address'">
<axsl:attribute name="{{name()}}">
<axsl:value-of select="."/>
</axsl:attribute>
</axsl:if>
</axsl:for-each>
<axsl:value-of select="@{@to-text}"/>
</axsl:element>
</axsl:template>
</xsl:template>
<xsl:template match="transform">
<axsl:stylesheet version="1.0">
<axsl:output method="xml"
encoding="Windows-1251" indent="yes"/>
<xsl:apply-templates/>
<axsl:template match="@*|node()">
<axsl:copy>
<axsl:apply-templates
select="@*|node()"/>
</axsl:copy>
</axsl:template>
</axsl:stylesheet>
</xsl:template>
</xsl:stylesheet>.
Выходной документ – документ XSLTдля выполнения требуемых преобразований вmessage.xmlимеет следующий вид:
<?xml version="1.0" encoding="Windows-1251"?>
<axsl:stylesheet xmlns:axsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<axsl:output method="xml" encoding="Windows-1251" indent="yes"/>
<axsl:template match="from">
<axsl:element name="from">
<xsl:for-each select="@*">
<xsl:if test="name(.) != 'address'">
<xsl:attribute name="{name()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:if>
</xsl:for-each>
<axsl:value-of select="@address"/>
</axsl:element>
</axsl:template>
<axsl:template match="to">
<axsl:element name="to">
<xsl:for-each select="@*">
<xsl:if test="name(.) != 'address'">
<xsl:attribute name="{name()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:if>
</xsl:for-each>>
<axsl:value-of select="@address"/>
</axsl:element>
</axsl:template>
<axsl:template match="@*|node()">
<axsl:copy>
<axsl:apply-templates select="@*|node()"/>
</axsl:copy>
</axsl:template>
</axsl:stylesheet>.
После выполнения преобразований с помощью сгенерированных правил документ message.xmlпреобразуется в следующий документXML:
<message>
<header>
<from image="greeting">ivanov@mail.com</from>
<to>petrov@mail.com</to>
<subject>Поздравление</subject>
</header>
<body>Поздравляю с днем рождения!</body>
<header>
<from>ivanov@mail.com</from>
<to>sidorov@mail.com</to>
<subject>Напоминание</subject>
</header>
<body>Встречаемся в 10.00.</body>
</message>.