Чи може XSLT вставити поточну дату?


92

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

Я хотів би включити дату створення файлу до остаточного звіту. Але поточна дата / час не включені в оригінальний файл XML, і я не маю контролю над тим, як створюється файл XML. Здається, в XSLT не існує жодної функції дати, яка повертає поточну дату.

Хтось уявляє, як я можу включити поточну дату під час моєї трансформації XSLT?


Я не знаю, який парсер використовується, це проблема. Програма, яку я використав, експортує звіти безпосередньо, а для створення звітів використовує файл XSLT у своєму каталозі програми.
Ерік Анастас,

Відповіді:


115

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 .
Джоел Пурра,

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 як трансформатором. Повідомлення про помилку: Виклик методу екземпляра методу сьогодні вимагає екземпляр Object як перший аргумент
Trey Carroll

1
oops: 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...]>

Сподіваюся, це комусь допомагає. Цю просту відповідь мені було важко знайти.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.