среда, 9 февраля 2011 г.

XSLT функции: (4) Использование расширений

В С1 есть т.н. “XSLT расширения”, которые содержат в себе ряд полезных функций, например, для форматирования дат, парсинга XML-кода и т.п. Сами расширения обычно написаны на C#, но подключаются именно как XSLT расширения и их функции можно непосредственно использовать в шаблонах XSLT.
(Можно создавать и свои собственные расширения. Но об этом  - в другой раз.)

Встроенные расширения собраны пространстве имен  Composite.Xslt.Extensions. Там их три на данный момент:
  • DateFormatting
  • Globalization
  • MarkupParser
Сейчас мы воспользуемся расширением DateFormatting, чтобы отформатировать дату в нашей функции ShowChangeDate нужным нам образом. (Об остальных расширения - в другой раз.)

На вкладке Вызовы функций, добавим вызов функции Composite.Xslt.Extensions.DateFormatting. На вкладке Просмотр на панели Ввод, рассмотрим, что это расширение предлагает.

Во-первых, здесь указано пространство имен #dateExtensions для функций форматирования даты, которое мы зарегистрируем в шаблоне.

<!-- Extension methods can be called using the namespace '#dateExtensions'. -->

Во-вторых, здесь приводится список всех доступных функций:

    <!-- String ns:Now() -->
    <!-- String ns:LongDateFormat(String xmlFormattedDate) -->

и т.д.

На вкладке Шаблон в элементе <xsl:stylesheet/> зарегистрируем пространство имен для функций этого расширения:

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

А теперь воспользуемся одной из функций форматирования, передавая ей в качестве параметра нашу переменную $ChangeData.

<xsl:value-of select="de:ShortDateFormat($ChangeDate)" />

Шаблон теперь должен выглядеть примерно так:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:in="http://www.composite.net/ns/transformation/input/1.0"
  xmlns:lang="http://www.composite.net/ns/localization/1.0"
  xmlns:f="http://www.composite.net/ns/function/1.0"
  xmlns:de="#dateExtensions"
  xmlns="http://www.w3.org/1999/xhtml"
  exclude-result-prefixes="xsl in lang f">


  <xsl:variable name="ChangeDate"
    select="/in:inputs/in:result[@name='GetIPageXml']/IPage/@ChangeDate" />


  <xsl:template match="/">
    <html>
      <head />
      <body>
        <div id="LastModifiedDate">
Последнее изменение: <xsl:value-of select="de:ShortDateFormat($ChangeDate)" />
        </div>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

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

На вкладке Просмотр, наша дата будет представлена примерно так:

Последнее изменение: 2/9/2011

Именно это и будет появляться на страницах сайта. Осталось только добавить нашу функцию ShowChangeDate в шаблоны страниц.

2 комментария:

  1. Здравствуйте.
    Подскажите пожалуйста по Вашей статье настроил формат даты всё получилось, но появилась другая проблема, так как получаю не одну дату, а сразу несколько из SQL запроса, при выводе всегда получаю одну и туже дату, которая выходит первая в запросе.
    Описал несколько сумбурно, вот здесь есть пример кода: https://compositec1.codeplex.com/discussions/565375, если у Вас есть возможность подскажите.
    Заранее спасибо за ответ.

    ОтветитьУдалить
    Ответы
    1. Вопрос решили. Банально в не которых случаях значение даты было NULL из-за этого выходила ошибка, на которую не обратил должного внимания. В итоге добавил в запрос условие и DataForrmating оформил правильно, даты вышли как положено.
      Подробности есть здесь: https://compositec1.codeplex.com/discussions/565375

      Удалить