web-dev-qa-db-ja.com

XSLTは現在の日付を挿入できますか?

オフィスで使用するプログラムは、エクスポートするXMLファイルをXSLTファイルとともにXHTMLに変換することでレポートをエクスポートします。 XSLTを書き直して、フォーマットを変更し、ソースXMLファイルからより多くの情報を追加します。

最終レポートにファイルが作成された日付を含めたいです。しかし、現在の日付/時刻は元のXMLファイルに含まれておらず、XMLファイルの作成方法を制御することもできません。現在の日付を返す日付関数はXSLTに組み込まれていないようです。

XSLT変換中に現在の日付をどのように含めることができるのか、誰にもわかりませんか?

88
Eric Anastas

XSLT 2

次のような日付関数をネイティブで使用できます。

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

current-date()current-time()もあります。

XSLT 1

EXSLT日時拡張パッケージを使用します。

  1. GitHub から date and times パッケージをダウンロードします。
  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>
111
Jim Garrison

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>

msxsl:scriptを使用したXSLTスタイルシートスクリプト および JScript、C#、およびVisual Basic .NETによるXSLTの拡張 も参照してください。

14
Rubens Farias

変換の実行を制御できますか?その場合、現在の日付をXSLに渡し、XSL内から$ current-dateを使用できます。以下は、着信パラメーターを宣言する方法ですが、変換の実行方法を知っているため、値を渡す方法を説明できません。

<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"/>
14
Kevin Hakanson
...
    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()"/>
10
Evgeny Glazov

遅い答えですが、私のソリューションはEclipse XSLTで動作します。この記事の執筆時点では、EclipseはXSLT 1を使用しています。 SaxonのようなXSLT 2エンジンをインストールできます。または、以下のXSLT 1ソリューションを使用して、現在の日付と時刻を挿入できます。

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

これにより、JavaのDataクラスが呼び出され、日付が出力されます。次の「Java:」定義も<xsl:stylesheet>タグに含めない限り機能しません。

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

私はそれが誰かを助けることを願っています。この単純な答えは私にとって見つけにくいものでした。

7
Mark Hamby
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を使用した日付と時刻のフォーマット

5
Black