Автор: Александр Календарев, 19 марта 2005
Если что-то не получается.
К сожалению, существующие XSLT-процессоры не имеют средств отладки. Приходится применять [дедовские способы] и [идти по шагам к цели], т.е. идти от разработки общих шаблонов к разработке частных шаблонов. Иначе это называют проектированием сверху вниз.
Как правило, разработка шаблонов соответствует порядку разбора шаблонов, т.е. начинается с корневого элемента xml-данных. Может само обрамление дизайна – это уже дело рук самого дизайнера, но заготовку в виде пустого шаблона <xsl:template match="root"> надо предусмотреть. И пошли так далее, углубляясь по ходу обработки структуры xml- данных.
Если шаблон ничего не выводит, то надо проверить:
* вызывается ли вообще данный шаблон (применяется ли к нему шаблонное правило)
* наличие данных, обрабатываемых данным шаблоном
* результат преобразования.
Первое (вызывается ли вообще данный шаблон) проверяется довольно просто заменой нашего шаблона конструкцией типа:
<table class=code cellpadding=5 align=center width=98% border=1 bordercolor=#3B3B3B><tr><td>
<xsl:template match="item">
**********
</xsl:template >
</td></tr></table>
Если шаблон вызывался (применялось к нему шаблонное правило), то в результирующем документе увидим наши звездочки.
Несколько труднее определить, какие входные узлы обрабатывал наш шаблон. Это определяется либо копированием обрабатываемых узлов в результирующее преобразование, либо определением имени обрабатываемого тега.
Копирование узла осуществляется заменой нашего шаблона на следующую конструкцию:
<table class=code cellpadding=5 align=center width=98% border=1 bordercolor=#3B3B3B><tr><td>
<xsl:template match="item">
<node>
<xsl:copy-of select="."/>
</node>
</xsl:template >
</td></tr></table>
Результатом применения будет текст, содержащий значение текущего узла, обрамленного тегами <node>.
Определение имени обрабатываемого узла осуществляется заменой нашего шаблона на такой:
<table class=code cellpadding=5 align=center width=98% border=1 bordercolor=#3B3B3B><tr><td>
<xsl:template match="item">
<name>
<xsl:value-of select="name(.)"/>
</name>
</xsl:template >
</td></tr></table>
Результатом применения будет текст, содержащий имя текущего узла, обрамленного тегами <name>.
Иногда полезно знать положение узла в контексте, тогда применим функцию position() к текущему узлу. Использование этой функции позволяет нам увидеть динамику прохода, т.е. применение шаблонных правил к текущей ветке xml-документа. Как правило, функцию position() применяют в циклах <xsl:for-each>, но иногда применяют и к вызовам шаблонных правил.
Проверка результата преобразования - это моделирование части работы шаблона (или всего полностью). Как и всякое моделирование, оно заключается в подготовке входных данных, которые должны представлять часть нашего xml-документа, самого шаблонного правила, т.е. набора части задействованных шаблонов, и, соответственно, простого скрипта преобразования, суть действий которого – взять файл xml-документа с диска, файл xsl-шаблона и вывести результат преобразования.
К началу статьи