2009-09-05 14 views
5

私はXSLTの新機能です。基本的な変換が完了しました。次に、私のデータはタイムスタンプを持つので、日付の操作を試してみたい。しかし、私は日付機能を働かせるようには思えません。それは私を大きく苛立たせます。私はFirefox 3.5、xsltproc 1.1.24、xalan 1.10、およびXMLSpy 2009を使用してテストしています。使用しようとしている関数が存在しないといっています。私はスタイルシートのバージョン2を作る場合XSLT関数と名前空間

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:fn="http://www.w3.org/2005/02/xpath-functions" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xsl:template match="event[@type='ABCD']"> 
<!--   Date: <xsl:value-of select="day-from-dateTime(xs:dateTime(@date))"/> --> 
<!--   Date: <xsl:value-of select="day-from-dateTime(@date)"/> --> 
       Date: <xsl:value-of select="fn:day-from-dateTime(@date)"/> 
</xsl:template> 

</xsl:stylesheet> 

、XMLSpyには、それが私の日付をキャストすることはできませんと文句を言います:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="datetime.xsl"?> 

<watcher> 
    <event id="1" date="2009-09-04T13:49:10-0500" type="ABCD">This is a test </event> 
</watcher> 
</code> 

私のXSLはそうのようになります。

私のXMLはそうのように見えますXSLT 2.0 Debugging Error: Error in XPath 2.0 expression (Cast failed, invalid lexical value - xs:dateTime '2009-09-04T13:49:10-0500')

バージョン1のままにすると、別のエラーが表示されます。XSLT 1.0 Debugging Error: Error in XPath expression (Unknown function - Name and number of arguments do not match any function signature in the static context - 'day-from-dateTime')

fn:day-from-dateTimeなどのネームスペースを使用するようにXSLを変更しようとすると、すべてのパーサーがThe function number 'http://www.w3.org/2005/02/xpath-functions:day-from-dateTime' is not availableとその変種と言って、全く動作しません。私はsubstring()関数を完全に使用することができることを他のテストから知っています。名前空間の接頭辞を必要とせず、day-from-dateTimeと同じ名前空間にあると思います。

すべてのチュートリアルでは機能が使用されていると表示されるため、非常に簡単だと思うが、何かがわからなくなっているようだ。誰かが私に行方不明を見せてもらえますか?

答えて

7

厄介なバージョンのことがここで起こっています。あなたが見ている問題の多くは、使用しているXSLTプロセッサがXPath 2.0をサポートしていないためです。これは、date-from-dateTime関数の由来です。

Xalanの代わりにSaxon processor - Saxon-B 9.1.0.6をプロセッサとして使用して、動作させることができます。

ソースドキュメント05:00としてタイムゾーンを持つべきではなく、0500

<?xml version="1.0" encoding="UTF-8"?> 
<watcher> 
    <event id="1" date="2009-09-04T13:49:10-05:00" type="ABCD">This is a test </event> 
</watcher> 
:ドキュメントのいくつかのエラーがあります

を(Xalanのはdocumentationによると、唯一のXPath 1.0をサポートするために表示されます)

XSLTは、文字列2009-09-04T13:49:10-05:00をxs:dateTimeにキャストする必要があります。これは、date-from-dateTimeの引数がどんな型である必要があります。

Date: <xsl:value-of select="day-from-dateTime(xs:dateTime(@date))"/> 

そしてそれは、日付フォーマットとご提案、XMLSpyの作品ごとにXSLを変更した後

+0

、助け

<?xml version="1.0" encoding="UTF-8"?> Date: 4 

希望に動作します。しかし、Firefoxと私のCLIユーティリティは、その関数が存在しないと不平を言う。 xsltprocはXSLT 2をサポートしていないと聞いていますが、関数のどれも知りません。Xalanはxs:dateTime()ではなくday-from-dateTimeについてのみ不平を言います。 どのようにxsのネームスペースが必要ですが、fnのネームスペースは必要ありませんか? – hufman

+1

OK - 私の知る限りでは XalanはXPath 1.0のみをサポートしています。つまり、date-from-dateTimeという関数についてはわかりません。 XPath 2をサポートするプロセッサ。0にはdate-from-dateTimeが組み込まれているため、名前空間の接頭辞とURIを明示的に宣言するか、組み込み時に関数名を使用することができます。 データ型には名前空間の接頭辞が必要ですXPath 2.0の機能と同じです。 – Brabster

+2

XPath 2.0サポートライブラリのみを使用しない限り、XPath 2.0組み込み関数を使用する際に問題が発生します。排他的にXPath 2.0ライブラリを使用できない場合は、必要な日時処理機能を再実装するカスタム関数ライブラリを作成することができます。私はFunctXがここで助けてくれるかもしれないと思います。 http://www.xqueryfunctions.com/xq/fn_day-from-datetime.html – Brabster