Регистрация с XSLT - PullRequest
       6

Регистрация с XSLT

9 голосов
/ 31 января 2011

Как и где я могу выводить сообщения журнала для целей отладки и производительности во время преобразования XSLT?

Полагаю, самый простой метод - использовать выражения, подобные этому:

<xsl:text>message text</xsl:text>

здесь и там в коде, используя xsl:value-of, если необходимо.

Но этот метод печатает сообщения во многих местах выходного файла (в моем случае HTML-страница), именно тамвызывается и не всегда в одном и том же месте (например, в файле журнала).

Это единственный способ или есть лучшее решение? Спасибо!

Ответы [ 6 ]

10 голосов
/ 31 января 2011

Это именно то, для чего <xsl:message> предназначен.Тем не менее, расположение вывода полностью зависит от процессора.У меня есть только Mac под рукой, но, к сожалению, и Firefox, и Safari подавляют вывод <xsl:message>.Я ожидаю, что MSIE сделает то же самое.

Учитывая это, я думаю, что вам лучше всего использовать <xsl:comment> для создания ваших журналов.Что-то вроде приведенного ниже должно помочь:

<xsl:template match='my-element'>
   <xsl:comment>Entering my-element template</xsl:comment>
   <p class='my-element'><xsl:apply-templates/></p>
   <xsl:comment>Leaving my-element template</xsl:comment>
</xsl:template>

Это даст вам что-то подобное в выводе:

<!-- Entering my-element template -->
<p class='my-element'>...</p>
<!-- Leaving my-element template -->

Ясно, что вы можете поместить в него все записи, которые хотитевыход.Я хотел бы создать что-то вроде следующего и использовать его для запуска вашей регистрации.Это ссылается на глобальный параметр под названием «enable-logging», чтобы определить, должна ли регистрироваться запись или нет.

<xsl:template name='create-log'>
   <xsl:param name='message'/>
   <xsl:if test="$enable-logging = 'yes'">
       <xsl:comment><xsl:value-of select='$message'/></xsl:comment/>
   </xsl:if>
</xsl:template>

Используйте это в своей таблице стилей как:

<xsl:template match='my-element'>
   <xsl:call-template name='create-log'>
     <xsl:with-param name='message'/>Entering my-element template</xsl:with-param>
   </xsl:call-template>
   <p class='my-element'><xsl:apply-templates/></p>
   <xsl:call-template name='create-log'>
     <xsl:with-param name='message'/>Leaving my-element template</xsl:with-param>
   </xsl:call-template>
</xsl:template>

Одно из преимуществ этогоТаким образом, вы можете изменить это <xsl:comment> на <xsl:message> в более полной среде.Это более многословно, но более обобщенно.

2 голосов
/ 31 января 2011

Я бы предложил использовать xsl:message, если вы находитесь в среде разработки, такой как oXygen или Stylus Studio, и использовать xsl:comment, если вы используете браузер. Вы действительно не должны отлаживать свой XSLT-код в браузере - браузеры, о которых я знаю, паршивые как инструменты отладки XSLT.

1 голос
/ 09 сентября 2013

В поисках решения этой проблемы я в итоге реализовал механизм ведения журнала в XSLT аналогично log4j, используя в основном xsl: message и чистый XSLT 2.x. Я взял некоторые ответы на этой странице в качестве входных данных. Библиотека доступна здесь: https://github.com/ukuko/log4xslt

0 голосов
/ 31 января 2011

Я думаю, вы должны быть в состоянии использовать , хотя, куда идет запись, зависит от реализации.

0 голосов
/ 31 января 2011

Изменение самого XSLT для ведения журналов неизбежно скажется на производительности, вам, вероятно, лучше использовать внешний инструмент.Есть несколько доступных в зависимости от того, с чем вы работаете:

0 голосов
/ 31 января 2011

Простым хаком было бы создать переменную с xsl:variable и либо просто concat() новые значения для нее, либо установить xsl:template, который делает то же самое.Затем вам просто нужно вывести эту переменную в конце выполнения, и вы можете явно выбрать, где показывать журнал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...