2009-09-05 7 views
5

Jestem trochę nowy w XSLT, a ja dokonałem podstawowej transformacji. Następnie chcę wypróbować manipulacje datami, ponieważ moje dane będą miały znaczniki czasu. Jednak nie wydaje mi się, aby funkcje daty działały, a to bardzo mnie frustruje. Testuję używając Firefox 3.5, xsltproc 1.1.24, xalan 1.10 i XMLSpy 2009 i wszyscy mówią, że funkcje, których próbuję użyć, nie istnieją.Funkcje i przestrzenie nazw XSLT

Moje XML wygląda tak:

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

Moje xsl wygląda tak:

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

Jeśli zrobię wersję stylów 2, XMLSpy narzeka, że ​​nie może oddać moją datę: XSLT 2.0 Debugging Error: Error in XPath 2.0 expression (Cast failed, invalid lexical value - xs:dateTime '2009-09-04T13:49:10-0500')

Jeśli zostawiam go w wersji 1, narzeka na inny błąd: 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')

Za każdym razem, gdy próbuję zmienić XSL, aby użyć przestrzeni nazw, na przykład fn: day-from-dateTime, odmawia ona pracy w ogóle, przy czym wszystkie moje parsery mówią, że The function number 'http://www.w3.org/2005/02/xpath-functions:day-from-dateTime' is not available i ich warianty. Wiem z innych testów, że mogę użyć funkcji substring() idealnie, bez konieczności prefiksu przestrzeni nazw, i wierzę, że jest w tej samej przestrzeni nazw co dzień od daty.

Czuję, że to coś niesamowicie prostego, ponieważ wszystkie tutoriale pokazują używane funkcje, ale wydaje mi się, że coś mi umyka. Czy ktoś może mi pokazać, czego mi brakuje?

Odpowiedz

7

Oy, wredne wersje coś tutaj się dzieje. Wiele problemów, które widzisz, jest spowodowane tym, że procesor XSLT, którego używasz, nie obsługuje XPath 2.0, z którego pochodzi funkcja day-from-dateTime.

Mogę dostać to, co próbujesz zrobić, z Saxon processor - Saxon-B 9.1.0.6 jako mój procesor zamiast Xalana. (Xalan wydaje się wspierać tylko XPath 1.0, zgodnie z documentation)

Istnieje kilka błędów w dokumentach:

Dokument źródłowy powinien mieć strefę czasową, a 05:00, a nie 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> 

XSLT powinien rzucić ciąg 2009-09-04T13: 49: 10-05: 00 w xs: dateTime, który jest typem argumentu day-from-dateTime.

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

A potem to działa

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



     Date: 4 

nadzieję, że pomoże,

+0

Po zmianie formatu daty i XSL za swoimi sugestiami, XMLSpy działa. Jednak Firefox i moje narzędzia CLI wciąż narzekają, że ta funkcja nie istnieje. xsltproc nie zna żadnej z funkcji, chociaż słyszałem, że nie obsługuje XSLT 2. Xalan tylko narzeka na dzień od daty, a nie na xs: dateTime(). Dlaczego potrzebuję przestrzeni nazw dla xs, ale nie dla fn? – hufman

+1

OK - zgodnie z moją najlepszą wiedzą: Xalan obsługuje tylko XPath 1.0, co oznacza, że ​​nie wie o funkcji o nazwie day-from-dateTime. Procesory obsługujące XPath 2.0 ma wbudowaną funkcję day-from-dateTime, więc możesz jawnie zadeklarować prefiks przestrzeni nazw i URI lub po prostu użyć nazwy funkcji, ponieważ jest ona wbudowana. Potrzebujesz prefiksu przestrzeni nazw dla typów danych, ponieważ nie jest on wbudowany w taki sam sposób, jak funkcje XPath 2.0. – Brabster

+2

Jeśli nie korzystasz tylko z bibliotek obsługujących XPath 2.0, będziesz mieć problemy z używaniem wbudowanych XPath 2.0. Jeśli nie możesz korzystać wyłącznie z bibliotek XPath 2.0, możesz utworzyć niestandardową bibliotekę funkcji, która ponownie zastosuje odpowiednią funkcjonalność obsługi daty i czasu. Myślę, że FunctX może pomóc tutaj. http://www.xqueryfunctions.com/xq/fn_day-from-datetime.html – Brabster