Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-08.doc
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
422.91 Кб
Скачать

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>.

Соседние файлы в папке Лекции