0

XSL を使用して日付を操作しようとしています。このスクリプトを使用した IBM developerWorksのチュートリアルを見つけました 。

<?xml version="1.0" encoding="utf-8"?>
<xsl:transform
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:date="http://exslt.org/dates-and-times"
        version="1.0"
        >
    <xsl:output method="html"/>

    <!-- B -->
    <xsl:variable name="now" select="date:date-time()"/>

    <xsl:template match="/">
        <!-- The rest of the Web site HTML material would go here -->
        <xsl:call-template name="date-section"/>
    </xsl:template>

    <xsl:template name="date-section">
        <p>This page was loaded at <xsl:text/>
            <!-- C -->
            <xsl:value-of select="concat(date:hour-in-day($now), ':',
                                 date:minute-in-hour($now), ':',
                                 date:second-in-minute($now))"/>
            <xsl:text> on </xsl:text>
            <xsl:value-of select="concat(date:day-in-month($now), ' ',
                                 date:month-name($now), ' ',
                                 date:year($now))"/>
        </p>
        <p>
            <!-- D -->
            <xsl:variable name="days-elapsed"
                          select="concat('-P',date:day-in-month($now),'D')"/>
            <xsl:variable name="one-month-hence"
                          select="date:add($now, 'P1M')"/>
            <xsl:variable name="next-month-start"
                          select="date:add($one-month-hence, $days-elapsed)"/>
            <xsl:variable name="seconds"
                          select="date:seconds(
                            date:difference($now, $next-month-start)
                         )"/>
            <xsl:text>The next month starts in </xsl:text>
            <xsl:value-of select="$seconds div (3600*24)"/>
            <xsl:text> days</xsl:text>
        </p>

    </xsl:template>

次のエラーが表示されます。

[ERROR]: Cannot find external method 'com.sun.org.apache.xalan.internal.lib.ExsltDatetime.add' (must be public).
[ERROR]: Cannot find external method 'com.sun.org.apache.xalan.internal.lib.ExsltDatetime.difference' (must be public).
[ERROR]: Cannot find external method 'com.sun.org.apache.xalan.internal.lib.ExsltDatetime.seconds' (must be public).
[ERROR]: Cannot convert data-type 'void' to 'real'.
[FATAL]: Could not compile stylesheet

それを修正する方法についてのアイデア。IntelliJ を使用して xsl を実行しています。

最終的には、日付に日を追加できるようにしたいと考えています。何らかの理由で、xsl 2 日付関数を使用しようとすると、それらが存在しないことがわかります (そして、ヘッダーをバージョン 2 に変更します:))。だから私はそれをサードパーティのライブラリで動作させようとしています。http://exslt.org/dates-and-times名前空間のdate-time()関数は機能していますが、その名前空間から他の関数​​を呼び出すことができません。

4

2 に答える 2

3

質問は少し古いですが、答えは私見ですが、まったく正しくありませんでした。私の答えは、他の人がこのスレッドに出くわすのに役立つかもしれません(私がやったように):

  1. 使用される関数は XSLT 1.0拡張関数であり、さまざまなモジュール (日付と時刻など) があり、それぞれに必須およびオプションの関数 (および要素) があります。EXSLTを参照
  2. ここでの問題は、XALAN がモジュールの日付と時刻をサポートしているが、すべてのオプション機能をサポートしていないことです。
  3. 示唆されているように、「より優れた」XSLT プロセッサを見つけようとすることはできますが、統合するには多少の作業が必要になる場合があります。個人的には、より多くの日付と時刻モジュールをサポートする Linux コマンド ライン xsltproc を使用しています (xsltproc --dumpextensions | sort概要を試してみてください)。
  4. または、 XSLT 1.0 で現在の日付と時刻を取得する方法を説明するアプローチを試すこともできます。私はまだ試していませんが (xsltproc は十分な回避策です)、同様のアプローチを使用すると、ツール/Java コードに触れることなく、必要なものを実装できるはずです。
  5. 完全を期すために、同じ問題を抱えた私のツールは freeplane.org の Freeplane です。これも XALAN (標準の Java ライブラリの一部だと思います) を使用し、同様の日付と時刻の関数で失敗します。

これが役に立てば幸いです、エリック

于 2013-10-30T08:28:32.960 に答える
1

私は Xalan を知らないので、なぜこれらのメソッドが見つからないのかわかりません。

ただし、XSLT 2.0 の日付/時刻関数を使用する場合は、XSLT 2.0 プロセッサを呼び出す必要があります。Java 環境用の明白なプロセッサは Saxon (現在のバージョンは 9.4) です。プロセッサを切り替えるには、バージョン番号を変更するだけでは不十分です。たとえば、コマンド ラインから実行している場合は、別のコマンドを使用する必要があります。

于 2012-12-06T15:07:24.407 に答える