Главная » XSLT » Эффективное использование xsl:message

0

Задача

Требуется понять, почему таблица стилей делает не то, что вы ожидаете.

ф ‘ Часто бывает, что вы применяете к документу таблицу стилей, а она либо ничего не выводит, либо выводит только текст без каких бы то ни было эле­ментов. В моей практике это почти всегда означало проблему с простран­ствами имен. Очень легко забыть о префиксах элементов в команде xsl:template или допустить расхождение между URI пространства имен в документе и в таблице стилей. Напомним, что существенным является именно URI пространства имен, а не префикс. Ошибка хотя бы в одной бук­ве приведет к неприятностям. Если URI длинный, я обычно копирую объяв­ление пространства имен из документа в таблицу стилей, чтобы они га­рантированно совпадали.

Решение

XSLT 1.0

Простейший инструмент отладки в вашем арсенале – команда xsl:message, которая часто применяется для того, чтобы понять, вызывался ли некий конкрет­ный шаблон:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!– … –>

<xsl:template match="someElement[someChild = ‘someValue’]">

<xsl:message>Cопоставлен someElement[someChild = ‘someValue’] </xsl:message>

<!– … –>

</xsl:template>

</xsl:stylesheet>

Пользы от этого приема будет больше, если вывести еще и данные. Обязатель­но окружайте выводимый текст хорошо видными ограничителями, чтобы можно было различить информацию, выведенную разными командами xsl:message, а заодно понять, что выведен именно текст сообщения (а результат при этом пуст):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="someElement[someChild = ‘someValue’]"> <xsl:param name="myParam"/>

<!– Это неэффективный способ отладки. Если при прогоне теста вы ничего не увидели, это может означать лишь, что шаблон не был ни с чем сопоставлен или сопоставленное значение $myParam оказалось пустым –> <xsl:message><xsl:value-of select="$myParam"/></xsl:message> </xsl:template>

<xsl:template match="someElement[someChild = ‘someOtherValue’]"> <xsl:param name="myParam"/> <!– Вот так лучше –>

<xsl:message>Cопоставлен элемент someElement[someChild = ‘someOtherValue’] </xsl:message>

<xsl:message>$myParam=[<xsl:value-of select="$myParam"/>]</xsl:message> </xsl:template>

</xsl:stylesheet>

Предусмотрите параметр, отключающий отладку, чтобы не убирать команды xml:message из окончательного варианта таблицы стилей. Поместите этот параметр в отдельное пространство имен, чтобы распространяемый вами код не конфликтовал с аналогичными параметрами пользователя, который включит его в свою программу:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:dbg="http:www.ora.com/ XSLTCookbook/ns/debug">

<xsl:param name="dbg:debugOn" select="false( )"/> <xsl:template match="someElement[someChild = ‘someValue’]">

<xsl:param name="myParam"/> <xsl:if test="$dbg:debugOn">

<xsl:message>Сопоставлен someElement[someChild = ‘someValue’] </xsl:message>

<xsl:message>$myParam=[<xsl:value-of select="$myParam"/>] </xsl:message> </xsl:if> </xsl:template>

</xsl:stylesheet>

XSLT 2.0

В версии 2.0 появилось два полезных дополнения. Во-первых, у элемента xsl:message теперь есть атрибут select, который можно использовать вместо конструктора последовательности. Во-вторых, атрибут terminate теперь может быть вычисляемым выражением. Это заметно упрощает жизнь, когда нужно гло­бально изменить поведение таблицы при завершении или создать «сообщение- утверждение» (assert).

<!– Вывести значение $foo и завершить работу, если оно отрицательно –> <xsl:message select=" ‘foo=’, $foo " terminate="{ if ($foo lt 0) then ‘yes’ else ‘no’}/>

В некоторых процессорах XSLT реализован атрибут use-when, который в вер­сии 2.0 поддерживается для всех команд. Хитрость в том, как опросить нестан­дартное системное свойство, применяемое во время отладки. В Saxon функция system-property() реализована следующим образом: если аргумент – имя в безымянном пространстве имен, то есть не имеет префикса, то считается, что это имя системного свойства Java, и возвращается значение этого свойства, если оно определено. Тем самым сообщения можно «условно компилировать».

<xsl:message use-when="system-property(‘debug_on’) = ‘yes’ ">

<xsl:text>Oтладочный режим включен!</xsl:text> </xsl:message>

Включить режим отладки можно при запуске Saxon из командной строки:

java -Ddebug_on=yes -jar c:\saxon\saxon8.jar test.xml test.xslt

Обсуждение

XSLT 1.0

Задолго до появления отладчиков существовали операторы печати. Сейчас есть несколько интерактивных отладчиков XSLT, но о бесплатных я не слыхал.

Помимо описанного выше способа использования команды xsl:message, ее можно применять для проверки предусловий, постусловий или инвариантов, которые должны быть истинны в некотором месте таблицы стилей:

<xsl:if test="debugOn>

<xsl:if test="вставить проверку какого-то инварианта"> <xsl:message terminate="yes">

Сообщение, описывающее причину сбоя. </xsl:message> </xsl:if>

</xsl:if>

В подобных утверждениях обычно встречается атрибут terminate="yes", поскольку ошибки по определению являются фатальными.

При отладке с помощью команды xsl:message не следует забывать, что ре­зультат выводится в разные места в зависимости от окружения, в котором испол­няется XSLT-сценарий. Например, если преобразование выполняется в браузере, то вы можете вообще не увидеть сообщений. Обычно рекомендуется протестиро­вать таблицы стилей с помощью командного процессора и только потом испол­нять их в предполагаемом окружении.

Если результат выводится в формате XML или HTML, то альтернативной xsl:message может служить вывод комментариев в результирующий документ с помощью команды xsl:comment. В частности, можно начинать каждый шаб­лон с комментария, чтобы протрассировать, какие шаблоны выполнялись:

<xsl:template match="*">

<xsl:comment>Bыведено в результате сопоставления с *</xsl:comment>

</xsl:template>

<xsl:template match="*" mode="foo">

<xsl:comment>Bыведено в результате сопоставления с * в режиме mode=foo</xsl:comment>

</xsl:template>

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

По теме:

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