Как проверить xslt файл на ошибки

This tool lets you Validate and Test Extensible Stylesheet Language (XSL) on
XML documents

XSLT (Extensible Stylesheet Language Transformations) is a language for
transforming XML documents into other XML documents,[1] or other formats
such as HTML for web pages, plain text or XSL Formatting Objects, which may
subsequently be converted to other formats, such as PDF, PostScript and
PNG.[2] XSLT 1.0 is widely supported in modern web browsers.Source:Wikipedia

AKA:

XML , XSLT , tester , mapping , mapper , editor , query , tool , evaluator
, transform , convertor, HTML, proccessor, validator

I have XSLT and XMl files to treat.

I need to know how to detect the following errors in large XSLT files (listed by the order of priority):

  1. Xpath errors
  2. Tag errors
  3. Syntax errors

Is there a tool that can do all these on Windows plaform?

asked Sep 5, 2012 at 14:18

GingerHead's user avatar

GingerHeadGingerHead

8,09014 gold badges59 silver badges93 bronze badges

1

Any XSLT processor will do this. Saxon’s diagnostics are probably better than most, though I say it myself. An IDE such as Oxygen or Stylus Studio is useful (both have Saxon under the hood), because the error messages will take you straight to the offending code. You don’t say whether you want XSLT 1.0 or XSLT 2.0.

answered Sep 5, 2012 at 16:16

Michael Kay's user avatar

Michael KayMichael Kay

155k11 gold badges91 silver badges163 bronze badges

xsltproc ? of course, it depends of the size of your xml/xsl.

xsltproc --noout input.xsl input.xml

answered Sep 5, 2012 at 14:22

Pierre's user avatar

PierrePierre

34.3k31 gold badges111 silver badges191 bronze badges

You can use altova xml spy. Its a shareware not a freeware. However, you can use this as a trial version.

answered Sep 5, 2012 at 14:20

Ruser1510890's user avatar

Иногда в результате верстки XSLT-шаблонов могут возникать различного рода ошибки или опечатки. При запросе страниц, обрабатываемых по таким шаблонам, можно видеть в браузере либо пустую страницу (в частности так будут выглядеть все ошибки валидации), либо частичный вывод итогового HTML-кода.

Включение режима отладки

В подобных случаях очень полезным может оказаться включение «режима отладки». Для этого необходимо установить параметр enabled="1" (Секция [debug]) в файле config.ini (для версий до 2.8 создайте файл с названием debug в корне вашего сайта). Также полезной может быть установка параметра show-backtrace="1". Теперь можно обновить страницу и посмотреть, что именно препятствует корректной обработке результатов запроса по интересующему XSLT-шаблону.

Например, в случае забытого закрывающего тега, вы увидите строки на подобие этой:

Warning: DOMDocument::load() [function.DOMDocument-load]: Opening and ending tag mismatch: div line 26 and body in file:///.../xsltTpls/default.xsl, line: 65

Если режим отладки выключен, вместо этого сообщения вы увидите страницу без какого-либо HTML-кода.

Просмотр всех вызовов с текущей страницы

Кроме того, во многих шаблонах может происходить вызов дополнительных данных по внутренним протоколам UMI.CMS («Макросы: протокол UData», «Объекты: протокол UObject», «Страницы: протокол UPage», «Файловая система: протокол UFS» и «Выборки из БД: протокол USel»).

В этих случаях, ситуация, когда итоговый HTML-код страницы отображается частично, скорее всего означает, что имеют место ошибки в одном или в нескольких подобных вызовов из этого шаблона (см. «Общие сведения»), либо при обработке результатов этих вызовов.

Для того, чтобы посмотреть, что именно запрашивается на конкретной странице и по каким протоколам, нужно добавить к адресу страницы ?showStreamsCalls=1. Этот способ работает для любой страницы, отображаемой по xslt-шаблону.

Например, если добавить ?showStreamsCalls=1 к странице отображения анонсов нескольких новостей можно увидеть следующее:

<streams-call>
   <call generation-time="0.010039">udata://content/menu/</call>
   <call generation-time="0.207189">udata://news/lastlist/(3)(4)/notemplate/3</call>
   <call generation-time="0.001159">udata://system/convertDate/1254225989/(d.m.Y)/</call>
   <call generation-time="0.027854">udata://comments/countComments/9</call>
   <call generation-time="0.001385">udata://system/convertDate/1254225671/(d.m.Y)/</call>
   <call generation-time="0.013974">udata://comments/countComments/8</call>
   <call generation-time="0.001651">udata://system/convertDate/1254225480/(d.m.Y)/</call>
   <call generation-time="0.010212">udata://comments/countComments/7</call>
</streams-call>

В полученном ответе мы видим какие именно макросы вызываются с этой страницы, с какими параметрами, а также время выполнения каждого из них.

Замечание

Если включено кэширование, то вызовы по протоколам с параметром ?expire не будут показаны в этом списке. Рекомендуется в процессе разработки сайта отключать кэширование.

Просмотр результатов работы макроса в контексте определенной страницы

Макросы UMI.CMS при запуске их непосредственно из адресной строки при помощи вызова http://ваш_сайт/udata/имя_модуль/имя_макроса, возвращают XML вне контекста какой либо страницы. Однако иногда возникает необходимость посмотреть ответ макроса в том виде, в каком он будет возвращаться именно с этой страницы.

В таком случае можно воспользоваться вспомогательным шаблоном. Создайте в папке ~/xsltTpls/ файл под названием debug.xsl и скопируйте в него этот код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" encoding="UTF-8" indent="yes"/>

 <xsl:param name="macro"/>

 <xsl:template match="/">

   <form method="post">
     <span style="font-weight:bold; margin-right:10px">udata://</span>
     <input type="text" name="macro" value="{$macro}" style="width:400px; margin-right:10px"/>
     <input value="Показать" class="submit" type="submit"/>
   </form>

   <textarea style="height:500px; width:900px;">
     <xsl:copy-of select="document(concat('udata://', $macro))"/>
   </textarea> 

 </xsl:template>

</xsl:stylesheet>

Далее подключите этот шаблон к системе в настройках модуля «Структура» (см. «Создание и подключение XSLT-шаблона»). Теперь следует для интересующей нас страницы выбрать этот шаблон и открыть страницу на просмотр.

Вместо содержимого страницы вы увидите поле ввода, где можно ввести макрос с параметрами в виде имя_модуля/имя_макроса/параметр1/параметр2 и нажать «Показать». В области ниже будет показан результат работы этого макроса, запущенного именно с этой страницы.

Время на прочтение
5 мин

Количество просмотров 7.8K

В прошлой статье я описал как реализовать инклудинг и кеширование при обработке xsl-темплейтов на стороне клиента. Сегодня я раскажу с помощью каких инструментов можно проводить отладку xslt-преобразований на стороне клиента и о работе конструкции <xsl:value-of select=«xxx» disable-output-escaping=«yes»/> в firefox.

Отладка XSLT на клиенте

Во время обработки xsl-документов в браузере могут происходить различные ошибки:
1) сетевые ошибки — когда xml или xsl данные не были получены;
2) ошибки обработки шаблонов.

Сетевые ошибки

Для контроля сетевых ошибок можно использовать отладочные средства браузеров. Все отладочные средства firebug (firefox), dragonfly (opera) и devtools (chrome) могут показать какие ресурсы были загружены из сети непосредственно ассинхронным запросом. Например, если мы обрабатываем данные in_data.xml с помощью шаблона first.xsl, то загрузку этих данных мы сможем проконтролировать
— раздел «net» в firebug
— раздел «net» в dragonfly
— раздел «resources» в devtools.

Иначе дело обстоит если для успешной обработки нужно подгрузить дополнительный xsl-файл (инклуд). В этом случае firebug (firefox) не покажет, что что-то было загружено.

А интегрированные среды дебагинга dragonfly (opera) и devtools (chrome) покажут какие дополнительные xsl файлы были подгружены.

Ошибки обработки шаблонов

Если во время обработки шаблона произошла ошибка, то её можно отловить и вывести в удобном для вас виде. Мне удобно во время разработки скидывать такие сообщения в консоль firebug’а

jQuery('#id_div').transform(
{ xml:'res/1.xml',
 xsl:'res/1.xsl',
 success:function (){
  jQuery('#id_info').html('готово');    
 },
 error:function (xml_data, xsl_data, success, cur_obj, error){
  console.log('xml: '+xml_data);
  console.log('xsl: '+xsl_data);
  console.log('success: '+success);         
  console.log('cur_obj:');console.log(cur_obj);
  console.log('error:');console.log(error);
 }
});
* This source code was highlighted with Source Code Highlighter.

В этом случае вывод ошибки будет примерно таким:

Событие «error» будет вызвано в случае возникновения ошибки. В функцию события будет передано несколько параметров, основной из которых — error — собстенно описание ошибки.

disable-output-escaping=«yes» в firefox

Описание проблемы

В некоторых случаях в xml-данных могут приходить целые куски отформатированного html, в этих случаях эти куски нужно вставлять в конечный документ без изменений, то есть «как есть». Например это могут быть данные, содержащие результаты поиска, в которых искомое слово выделенно жирным («мы <b>искали</b> все возможные решения»). Сделать простую замену текста средствами xslt можно, но того не стоит (попробуйте как-нибудь на досуге заняться этим). Поэтому проще передавать уже отформатированный текст. Опытный программист придумает ещё массу примеров. Для вставки данных без экранирования в xslt есть специальный атрибут disable-output-escaping, который необходимо установить в «yes». Выглядит это так

<xsl:value-of select="xxx" disable-output-escaping="yes"/>* This source code was highlighted with Source Code Highlighter.

Но в firefox, начиная самой первой версией и заканчивая всей третьей веткой (в firefox 4 не тестировал), не полная реализация xsl-процессора. Их xsl-процессор, который индентифицирует себя как «Transformiix», не обрабатывает disable-output-escaping=«yes». Этой ошибке уже много лет https://bugzilla.mozilla.org/show_bug.cgi?id=98168 и недавно мы «отмечали» 9-летие этой баги. Там же по ссылке написаны оправдания команды firefox, которые можно свести к одному — там много работы, если хотите правьте сами.

Решение проблемы

Существует такое решение проблемы — использовать вместо конструкции <xsl:value-of select=«xxx» disable-output-escaping=«yes»/> вызов <xsl:copy-of select=«xxx»/>. Но в этом случае мы не можем передать в узле xxx данные в виде

<xxx>Резельтат поиска <![CDATA[<i>"первый"</i>]]></xxx>* This source code was highlighted with Source Code Highlighter.

а придётся передавать данные так

<xxx>Резельтат поиска <i>"первый"</i></xxx>* This source code was highlighted with Source Code Highlighter.

то есть это будет уже не совсем верный xml-файл. И тогда мы получаем проблему в остальных браузерах, где такое решение работать уже не будет.

Другое решение проблемы

Я решил использовать другой подход. Использовать специальный фикс, написанный на javascript.

1. Вместо привычного <xsl:value-of select="xxx" disable-output-escaping="yes"/> в наших шаблонах придётся использовать вызов

<xsl:call-template name="inc_disable_output_escaping"><xsl:with-param name="param" select="xxx"/></xsl:call-template>* This source code was highlighted with Source Code Highlighter.

Где темплейт inc_disable_output_escaping выглядит так:

<xsl:template name="inc_disable_output_escaping">
  <xsl:param name="param"></xsl:param>
  <xsl:choose>
   <xsl:when test="system-property('xsl:vendor')='Transformiix'">
    <!-- костыль для firefox -->
    <div style="display:none" class="fix_ff_disable_output_escaping"><xsl:value-of select="$param" disable-output-escaping="yes"/></div>
   </xsl:when>
   <xsl:otherwise>
    <xsl:value-of select="$param" disable-output-escaping="yes"/>
   </xsl:otherwise>
  </xsl:choose>  
</xsl:template>
* This source code was highlighted with Source Code Highlighter.

В этом темплейте по имени xsl-процессора (xsl:vendor) мы выведем данные стандартной конструкцией с disable-output-escaping=«yes», а в случае xsl-процессора от firefox’а данные вставим в невидимый контейнер так, как firefox эти данные может вставить, то есть в экранированном виде.
А потом, после успешного преобразования, и обновления DOM документа, мы перекодируем данные в этих контейнерах на правильные и вставим их на место этих контейнеров.

function fix_ff_disable_output_escaping() {
  jQuery('div.fix_ff_disable_output_escaping').each(
  function(i, obj){
   var j_obj=jQuery(obj);
   j_obj.replaceWith(Encoder.htmlDecode(j_obj.html()));
  }
 )
}
* This source code was highlighted with Source Code Highlighter.

Для декодирования html-мнемоник используется функция htmlDecode js-библиотеки Encoder.

Пример работы данной техники и архив с решением можно взять тут ra-project.net/xsl_tests/test2.html

PS Не забывайте отправлять правильный content-type для xml/xsl документов. А именно «Content-type: text/xml».

XSLT Checker

The XSLT Checker is a small project to detect commands in any given XSLT stylesheet which are never used when it processes a huge set of input data.

Call the XSLT Checker

The XSLT Checker is called by:

start.bat [config-file]? [output-directory]?

Configuration file

The XSLT Checker is configured by a configuration file, which should be valid to the RelaxNG schema schema/config.rnc.

The default config will be found in config/config.xml

Input Data Set

The <dataFolder> specifies the input data set. The containing path should point to a folder and can be relative or absolute to the config.

In the default config the <dataFolder> points to the folder {$projectDir}/sample/xml.

The optional attribute extensions can be used to specify a file extension. If the attribute is set only files with those extensions should be used as Input Data Set. Multiple extensions should be separated by a semicolon (;). If the attribute is omited any file in the given folder should be used.

In the default config this extensions attribute has the value xml.

XSLT Stylesheet Set

The <styleFolder> specifies the XSLT Stylesheet Set. The containing path should point to a folder and can be relative or absolute to the config.

In the default config the <styleFolder> points to the folder {$projectDir}/sample/xsl.

The optional attribute extensions can be used to specify a file extension. If the attribute is set only files with those extensions should be used as XSLT Stylesheet Set. Multiple extensions should be separated by a semicolon (;). If the attribute is omited any file in the given folder should be used.

In the default config this extensions attribute has the value xsl.

Main Stylesheet

The startingStyle specifies one stylesheet in the XSLT Stylesheet Set which should be used as the Main Stylesheet. The containing path should point to the main stylesheet and should be relative to the folder <styleFolder>.

The main stylesheet should include or import all other stylesheets of the XSLT Stylesheet Set directly or indirectly.

Command Configuration

By default the commands xsl:template, xsl:if, xsl:choose/xsl:when, xsl:choose/xsl:otherwise, xsl:for-each, xsl:for-each-group and xsl:function will be checked by the XSLT Checker.

The optional element checkedElements can be used to specify which commands should be ignored by the XSLT Checker. If this element is omited the XSLT Checker processes in the default behavior.

Example to ignore only the xsl:template with match attribute:

<checkedElements>
    <template>
        <name>true</name>
        <match>false</match>
    </template>
    <if>true</if>
    <choose>
        <when>true</when>
        <otherwise>true</otherwise>
    </choose>
    <for-each>true</for-each>
    <for-each-group>true</for-each-group>
    <function>true</function>
</checkedElements>

Output directory

The output directory will be used to store the result of the XSLT Checker. The result contains two versions of the same report. One in XML and one in plain text format.

Both report versions list all respected commands which were never used when all files of the Input Data Set was processed by the main stylesheet.

The default output directory is {$projectDir}/sample/result

Restrictions

Currently following restrictions apply to the XSLT Checker:

  • It works on Windows systems only.
  • Java needs to be installed — the environment variable java should be set.
  • The Stylesheets should be processable with the Saxon version 8.9
  • The XSLT Checker can not catch any error. The Input Data Set should not throw any error.
  • Only one Stylesheet call is supported. A XSLT pipeline can not be checked by the XSLT Checker.

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Как проверить xml файл на ошибки
  • Как проверить xiaomi на ошибки
  • Как проверить wot на наличие ошибок
  • Как проверить wordpress на ошибки

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии