2013-04-04 159 views
0

我正在尝试使用版本2.0的XSLT将XML转换为CSV。但是在XSLT中使用format-date方法时出现编译错误。 以下是错误:在XSLT中使用format-date()方法时出现编译错误

Error checking type of the expression 'funcall(format-date, [variable-ref(dt/string), literal-expr([D01]/[M01]/[Y0001])])'.
FATAL ERROR: 'Could not compile stylesheet'.

XSLT代码:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:func="http://exslt.org/functions" xmlns:date="http://exslt.org/dates-and-times" 
      extension-element-prefixes="date" date:doc="http://www.exslt.org/date"> 

<xsl:output method="text"/> 

<xsl:template match="/">  
<xsl:variable name="dt" select="'2013-04-04'"/> 
<xsl:value-of select="format-date($dt, '[D01]/[M01]/[Y0001]')" /> 
<xsl:value-of select="format-date(current-date(), '[D01]/[M01]/[Y0001]')" />    

</xsl:template> 
</xsl:stylesheet> 

回答

1

你的变量$ DT是一个字符串,而不是一个日期。在格式化之前,您需要使用xs:date('2013-04-04')将其转换为日期。

+0

即使在将其转换为日期之后也会得到相同的错误,当我使用“current-date()”时,也会得到相同的错误。我不确定我是否缺少一些东西。当我尝试在XSLT中使用日期函数时,出现此编译错误。没有日期函数,我的XSL代码工作正常。我正在使用2.0版 – Jyothi 2013-04-04 18:19:18

+0

也许你没有使用2.0版。有时候人们会认为只是在样式表中写入version =“2.0”会自动将XSLT处理器变成2.0处理器。你如何进行转型? – 2013-04-04 19:49:35

+0

我正在使用java代码的“javax.xml.transform”转换器。我想将从“System.currentTimeMillis()”方法返回的日期时间转换为用户可读的格式,如“MM/dd/yyyy hh:mm:ss a”“。 从“System.currentTimeMillis()”(例如:1364969832764)返回的值被写入XML,然后我试图通过XSLT将其转换为日期时间格式。 – Jyothi 2013-04-05 14:44:04

0

这为我工作(使用撒克逊):

<xsl:variable name="dt">2013-04-04</xsl:variable> 
+1

这个原理的工作原理是该变量是一个XML文档节点,它被雾化以创建一个untypedAtomic值,并且在传递给一个函数时,一个untypedAtomic值会自动转换为所需的类型(xs:date)。不过这很方便,这是实现目标的一种迂回和低效的方式。 – 2013-04-04 16:14:45