Может ли XSLT вставить текущую дату?

93

Программа, которую мы используем в моем офисе, экспортирует отчеты, переводя XML-файл, который он экспортирует с файлом XSLT, в XHTML. Я переписываю XSLT, чтобы изменить форматирование и добавить дополнительную информацию из исходного XML-файла.

Я хотел бы включить дату создания файла в окончательный отчет. Но текущая дата и время не включены в исходный XML-файл, и я не могу контролировать, как создается XML-файл. Кажется, что в XSLT нет никаких функций даты, которые возвращали бы текущую дату.

Кто-нибудь знает, как я могу включить текущую дату во время преобразования XSLT?

Эрик Анастас
источник
Я не знаю, какой парсер используется, в этом проблема. Программа, которую я использовал, экспортирует отчеты напрямую и использует файл XSLT в своем программном каталоге для создания отчетов.
Эрик Анастас

Ответы:

117

XSLT 2

Функции даты доступны изначально, например:

<xsl:value-of  select="current-dateTime()"/>

Также есть current-date()и current-time().

XSLT 1

Используйте пакет расширения даты и времени EXSLT.

  1. Загрузите пакет даты и времени с GitHub .
  2. Распакуйте date.xslв расположение ваших файлов XSL.
  3. Установите заголовок таблицы стилей.
  4. Импорт date.xsl.

Например:

<xsl:stylesheet version="1.0" 
    xmlns:date="http://exslt.org/dates-and-times" 
    extension-element-prefixes="date"
    ...>

    <xsl:import href="date.xsl" />

    <xsl:template match="//root">
       <xsl:value-of select="date:date-time()"/>
    </xsl:template>
</xsl:stylesheet>

Джим Гаррисон
источник
7
Тем, кто использует .net / c # , не тратьте слишком много времени на то, чтобы заставить импорт EXSLT работать со стандартными преобразователями .NET XSLT - сразу используйте MVP.XML . Он имеет встроенную поддержку ESXLT .
Joel Purra
14

Для парсера MSXML попробуйте следующее:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:my="urn:sample" extension-element-prefixes="msxml">

    <msxsl:script language="JScript" implements-prefix="my">
       function today()
       {
          return new Date(); 
       } 
    </msxsl:script> 
    <xsl:template match="/">

        Today = <xsl:value-of select="my:today()"/>

    </xsl:template> 
</xsl:stylesheet>

Также прочтите « Сценарии таблицы стилей XSLT с использованием msxsl: script» и « Расширение XSLT с помощью JScript, C # и Visual Basic .NET».

Рубенс Фариас
источник
Это не работает с Apache FOP в качестве преобразователя. Сообщение об ошибке: вызов метода экземпляра для метода сегодня требует экземпляра объекта в качестве первого аргумента
Трей Кэрролл,
1
упс: extension-element-prefixes = "msxml" должно быть extension-element-prefixes = "msxsl". Не работает и в моей системе.
Джей
14

У вас есть контроль над выполнением преобразования? Если это так, вы можете передать текущую дату в XSL и использовать $ current-date внутри вашего XSL. Ниже показано, как вы объявляете входящий параметр, но зная, как вы выполняете преобразование, я не могу сказать вам, как передать значение.

<xsl:param name="current-date" />

Например, из сценария bash используйте:

xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml

Затем в xsl вы можете использовать:

<xsl:value-of select="$current-date"/>
Кевин Хакансон
источник
1
Действительно, как передать значение зависит от системы. Один из возможных вариантов: с xsltproc на UNIX, это может быть: xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml. Некоторые системы также просто принимают параметры как $param=value, в этом случае $current-date=`date +%Y-%m-%d`где-то. Или поищите способы указать параметры в любом используемом вами XSLT-процессоре.
Lindes
10
...
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:local="urn:local" extension-element-prefixes="msxsl">

    <msxsl:script language="CSharp" implements-prefix="local">
        public string dateTimeNow()
        {       
          return DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"); 
        } 
    </msxsl:script>  
...
    <xsl:value-of select="local:dateTimeNow()"/>
Евгений Глазов
источник
7

Поздний ответ, но мое решение работает в Eclipse XSLT. Eclipse использует XSLT 1 на момент написания этой статьи. Вы можете установить движок XSLT 2, например Saxon. Или вы можете использовать решение XSLT 1 ниже, чтобы вставить текущую дату и время.

<xsl:value-of select="java:util.Date.new()"/>

Это вызовет класс данных Java для вывода даты. Это не сработает, если вы также не добавите в свой <xsl:stylesheet>тег следующее определение «java:» .

<xsl:stylesheet [...snip...]
         xmlns:java="java"
         [...snip...]>

Надеюсь, это кому-то поможет. Мне было трудно найти этот простой ответ.

Марк Хэмби
источник