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


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

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

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

6 82

6 ответов:

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>

для синтаксического анализатора 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

есть ли у вас контроль над запуском преобразования? Если это так, вы можете передать текущую дату в 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"/>
...
    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()"/>

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

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

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

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

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

format-date(current-date(), '[M01]/[D01]/[Y0001]') = 09/19/2013
format-time(current-time(), '[H01]:[m01] [z]') = 09:26 GMT+10
format-dateTime(current-dateTime(), '[h1]:[m01] [P] on [MNn] [D].') = 9:26 a.m. on September 19.

ссылки: форматирование даты и времени с помощью XSLT 2.0 и XPath