2009-09-05 6 views
5

XSLT için yeni biriyim ve temel dönüşümleri tamamladım. Daha sonra, verileri zaman damgası olacak şekilde, tarih manipulasyonlarını denemek istiyorum. Ancak, çalışmak için herhangi bir tarih işlevi göremiyorum ve bu beni çok sinirlendiriyor. Firefox 3.5, xsltproc 1.1.24, xalan 1.10 ve XMLSpy 2009 kullanarak test ediyorum ve hepsi kullanmaya çalıştığım fonksiyonların mevcut olmadığını söylüyorlar. Ben stil sürüm 2 yaparsanızXSLT işlevleri ve ad alanları

<?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 benim tarih döküm alamamaktan şikayetçi:

<?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> 

Benim xsl öylesine benziyor:

Benim xml öylesine benziyor XSLT 2.0 Debugging Error: Error in XPath 2.0 expression (Cast failed, invalid lexical value - xs:dateTime '2009-09-04T13:49:10-0500')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')

:

Ben sürüm 1 olarak bırakırsanız, bu farklı bir hata hakkında şikayet

Herzaman XSL'yi fn: date-from-dateTime gibi bir ad alanı kullanmak üzere değiştirmeye çalışıyorum, tüm ayrıştırıcılarımın The function number 'http://www.w3.org/2005/02/xpath-functions:day-from-dateTime' is not available olduğunu ve bunların varyantlarını söyleyerek çalışmayı reddediyor. Diğer testlerden, substring() işlevini herhangi bir isim-alanı önekine gerek olmadan mükemmel şekilde kullanabileceğimi biliyorum ve inanıyorum-dateTime ile aynı adrestedir.

Tüm öğreticiler kullanılmakta olduklarını gösterdiğinden, inanılmaz derecede kolay bir şeymiş gibi hissediyorum, ama bir şey beni utandırıyor gibi görünüyor. Birisi bana neyi özlediğimi gösterir mi?

cevap

7

Burada devam eden iğrenç versiyonlar. Gördüğünüz sorunların birçoğu, kullandığınız XSLT işlemcisinin, o gün-dateTime işlevinin nereden geldiği XPath 2.0'ı desteklememesi nedeniyle olacaktır.

Çalışmaya çalıştığınız şeyi, Saxon processor - Saxon-B 9.1.0.6 ile Xalan yerine işlemci olarak alabilirim.

kaynak belge değil, 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> 
05:00 olarak saat dilimine sahip olmalıdır: Dokümanlarınızdaki birkaç hataları var

(Xalan documentation göre, sadece XPath 1.0 desteklemek için görünür)

XSLT, xs: dateTime dizesine, date-date-time öğesinin argümanının ne olması gerektiğine dair 2009-09-04T13: 49: 10-05: 00 dizgesini vermelidir.

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

Ve sonra tarih biçimini ve önerilerinizi başına XSL değiştirdikten sonra yardımcı

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



     Date: 4 

Hope,

+0

işleri, XMLSpy çalışır. Ancak, Firefox ve CLI yardımcı programım hala işlevin mevcut olmadığından şikayet ediyor. xsltproc, XSLT 2'yi desteklemediğini duymasa da, herhangi bir işlevi tanımıyor. Xalan, xs: dateTime() 'dan değil, yalnızca date-from-dateTime hakkında şikayet ediyor. Neden xs için ad alanına ihtiyacım var, fakat fn için değil? – hufman

+1

Tamam - bilgimden en iyi şekilde yararlanın: Xalan yalnızca XPath 1.0'ı destekler; bu, date-dateTime adlı bir işlevden haberi olmadığı anlamına gelir. XPath 2'yi destekleyen işlemciler.0 date-from-dateTime yerleşik, böylece bir ad alanı öneki ve URI'yi açıkça bildirebilir veya yalnızca yerleşik olarak işlev adını kullanabilirsiniz. Veri türleri için ad alanı önekine gereksiniminiz vardır, çünkü bu yerleşik olarak yerleşik değildir. XPath 2.0 fonksiyonları ile aynı şekilde. – Brabster

+2

Yalnızca XPath 2.0 destekleyici kütüphaneleri kullanmıyorsanız, XPath 2.0 yerleşimlerini kullanarak sorunlarınız olacaktır. Yalnızca XPath 2.0 libs kullanamazsanız, ihtiyaç duyduğunuz tarih ve zaman işleme işlevini yeniden uygulayan özel bir işlev kitaplığı oluşturabilirsiniz. FunctX'in burada yardımcı olabileceğini düşünüyorum. http://www.xqueryfunctions.com/xq/fn_day-from-datetime.html – Brabster