Jump to content

[XSLT 2.0] How getting the current date ?


IBACK

Recommended Posts

Hi everybody,

 

I try to implement and to show the current date in my stylesheet, but I obtain this error message during the compilation :

 

ERROR: 'Impossible to compile the stylesheet'
FATAL ERROR: 'Error during the verification of type of expression 'funcall(current-date, [])'.'
:Error during the verification of type of expression 'funcall(current-date, [])'.
This is an extract of my stylesheet :
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"	version="2.0">	<xsl:output method="html" indent="yes" />        ... 		<xsl:template name="getMonth">				<xsl:param name="monthNbr" />				<xsl:choose>					<xsl:when test="$monthNbr=1">						Janvier					</xsl:when>					<xsl:when test="$monthNbr=2">						Février					</xsl:when>					<xsl:when test="$monthNbr=3">						Mars					</xsl:when>					<xsl:when test="$monthNbr=4">						Avril					</xsl:when>					<xsl:when test="$monthNbr=5">						Mai					</xsl:when>					<xsl:when test="$monthNbr=6">						Juin					</xsl:when>					<xsl:when test="$monthNbr=7">						Juillet					</xsl:when>					<xsl:when test="$monthNbr=8">						Août					</xsl:when>					<xsl:when test="$monthNbr=9">						Septembre					</xsl:when>					<xsl:when test="$monthNbr=10">						Octobre					</xsl:when>					<xsl:when test="$monthNbr=11">						Novembre					</xsl:when>					<xsl:when test="$monthNbr=12">						Décembre					</xsl:when>				</xsl:choose>		</xsl:template> 		<xsl:template name="date_jour">				<xsl:variable name="currentDate" select="current-date()" /> 				<xsl:variable name="year" select="year-from-date($currentDate)" />				<xsl:variable name="month">					<xsl:call-template name="getMonth">						<xsl:with-param name="monthNbr"							select="month-from-date($currentDate)" />					</xsl:call-template>				</xsl:variable>				<xsl:variable name="day" select="day-from-date($currentDate)" />				<xsl:value-of select="format-number($day,'00')" />				<xsl:text> </xsl:text>				<xsl:value-of select="$month" />				<xsl:text> </xsl:text>				<xsl:value-of select="$year" />		</xsl:template>... </xsl:stylesheet>

Any ideas ?

 

Thank you in advance

 

Fabrice

 

 

Link to comment
Share on other sites

"Which XSLT 2.0 processor do you use ?"

 

In fact, none. :glare:

 

"Don't you get some more detailed information like the line number in your code where the error occurs?"

 

This is my code :

package test.xsl;import javax.xml.transform.OutputKeys;import javax.xml.transform.Result;import javax.xml.transform.Source;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.stream.StreamResult;import javax.xml.transform.stream.StreamSource;public class XMLwithXSLT {	public static void main(String[] args) throws Exception {		Source source = new StreamSource("src/test/xsl/data.xml");		Source xsl = new StreamSource("src/test/xsl/_dt.xsl");		Result result = new StreamResult(System.out);		TransformerFactory factory = TransformerFactory.newInstance();		Transformer transformer = factory.newTransformer(xsl);		transformer.setOutputProperty(OutputKeys.INDENT, "yes");		transformer.transform(source, result);	}}

This is the complete error :

 

ERROR: 'Impossible de compiler la feuille de style'
FATAL ERROR: 'Erreur lors de la vérification du type de l'expression 'funcall(current-date, [])'.'
:Erreur lors de la vérification du type de l'expression 'funcall(current-date, [])'.
Exception in thread "main" javax.xml.transform.TransformerConfigurationException: Erreur lors de la vérification du type de l'expression 'funcall(current-date, [])'.
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:992)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:766)
at test.xsl.XMLwithXSLT.main(XMLwithXSLT.java:18)
Caused by: Erreur lors de la vérification du type de l'expression 'funcall(current-date, [])'.
at com.sun.org.apache.xalan.internal.xsltc.compiler.FunctionCall.typeCheckStandard(FunctionCall.java:437)
at com.sun.org.apache.xalan.internal.xsltc.compiler.FunctionCall.typeCheck(FunctionCall.java:346)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Variable.typeCheck(Variable.java:101)
at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:493)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Template.typeCheck(Template.java:295)
at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:493)
at com.sun.org.apache.xalan.internal.xsltc.compiler.LiteralElement.typeCheck(LiteralElement.java:201)
at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:493)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Template.typeCheck(Template.java:295)
at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:493)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Stylesheet.typeCheck(Stylesheet.java:657)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Parser.createAST(Parser.java:411)
at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:427)
at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:512)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:951)
... 2 more
---------
Erreur lors de la vérification du type de l'expression 'funcall(current-date, [])'.
at com.sun.org.apache.xalan.internal.xsltc.compiler.FunctionCall.typeCheckStandard(FunctionCall.java:437)
at com.sun.org.apache.xalan.internal.xsltc.compiler.FunctionCall.typeCheck(FunctionCall.java:346)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Variable.typeCheck(Variable.java:101)
at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:493)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Template.typeCheck(Template.java:295)
at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:493)
at com.sun.org.apache.xalan.internal.xsltc.compiler.LiteralElement.typeCheck(LiteralElement.java:201)
at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:493)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Template.typeCheck(Template.java:295)
at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:493)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Stylesheet.typeCheck(Stylesheet.java:657)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Parser.createAST(Parser.java:411)
at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:427)
at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:512)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:951)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:766)
at test.xsl.XMLwithXSLT.main(XMLwithXSLT.java:18)
Link to comment
Share on other sites

I only know Saxon 9 which comes in various editions, the open source Home Edition HE should suffice for your needs to use XSLT and XPath 2.0, at least in terms of support of the specification. There are also the commercial Personal Edition PE and the Enterprise Edition EE for which one has to buy a license.

I don't know of any other Java XSLT 2.0 implementation, other than that IBM Websphere package I already mentioned.

Some things you want to do like getting the current date could be done with Xalan by making use of parameters or by making use of extension functions calling into Java.

Link to comment
Share on other sites

ok i modified my stylesheet :

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"	xmlns:fo="http://www.w3.org/1999/XSL/format" xmlns:cal="xalan//java.util.GregorianCalendar"	version="2.0">	<xsl:output method="html" indent="yes" />...			<xsl:template name="getMonth">				<xsl:param name="monthNbr" />				<xsl:choose>					<xsl:when test="$monthNbr=1">						Janvier					</xsl:when>					<xsl:when test="$monthNbr=2">						Février					</xsl:when>					<xsl:when test="$monthNbr=3">						Mars					</xsl:when>					<xsl:when test="$monthNbr=4">						Avril					</xsl:when>					<xsl:when test="$monthNbr=5">						Mai					</xsl:when>					<xsl:when test="$monthNbr=6">						Juin					</xsl:when>					<xsl:when test="$monthNbr=7">						Juillet					</xsl:when>					<xsl:when test="$monthNbr=8">						Août					</xsl:when>					<xsl:when test="$monthNbr=9">						Septembre					</xsl:when>					<xsl:when test="$monthNbr=10">						Octobre					</xsl:when>					<xsl:when test="$monthNbr=11">						Novembre					</xsl:when>					<xsl:when test="$monthNbr=12">						Décembre					</xsl:when>				</xsl:choose>			</xsl:template>			<xsl:template name="getCurrentDate">				<xsl:variable name="calendar" select="cal:new()" />				<xsl:variable name="day" select="cal:get($calendar,5)" />				<xsl:variable name="month">					<xsl:call-template name="getMonth">						<xsl:with-param name="monthNbr" select="cal:get($calendar,2) + 1" />					</xsl:call-template>				</xsl:variable>				<xsl:variable name="year" select="cal:get($calendar,1)" />				<xsl:value-of select="$day" />				<xsl:text>/</xsl:text>				<xsl:value-of select="$month" />				<xsl:text>/</xsl:text>				<xsl:value-of select="$year" />			</xsl:template>			<xsl:variable name="currentDate">				<xsl:call-template name="getCurrentDate"></xsl:call-template>			</xsl:variable>		</div>

I obtain a new error message :

 

Exception in thread "main" java.lang.VerifyError: (class: _dt, method: template$dot$1 signature: (Lcom/sun/org/apache/xalan/internal/xsltc/DOM;Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;I)V) Accessing value from uninitialized register 5
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2664)
at java.lang.Class.getConstructor0(Class.java:3068)
at java.lang.Class.newInstance(Class.java:407)
at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getTransletInstance(TemplatesImpl.java:387)
at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer(TemplatesImpl.java:418)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:767)
at test.xsl.XMLwithXSLT.main(XMLwithXSLT.java:18)
Any ideas ?
Link to comment
Share on other sites

  • 2 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...