在我多年使用的一些XSL模板中,EXSLT的核心日期函数工作得很好。我想开始使用一个新的:seconds。此函数不是“核心”功能之一,因此实现可以声称符合EXSLT,而不实际实现它。
我在Xalan2.7.1中使用Cocoon2.1.11,它似乎选择了不实现date:seconds。
幸运的是,EXSLT的好心人提供下载,以帮助您插件个人功能,但我似乎不知道如何真正实现插件。
例如,我可以使用这个模板轻松地使用核心函数:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times" >
<xsl:template match="/">
<xsl:value-of select="date:date-time()" />
</xsl:template>
</xsl:stylesheet>在尝试使用date.seconds函数时,我尝试了以下方法:
<xsl:import href="date.seconds.xsl" />添加到我的模板中,并使用date:seconds()。这得到了错误消息“对于扩展函数,找不到方法org.apache.xalan.lib.ExsltDatetime.seconds”。xmlns:date。这将得到错误“前缀必须解析为命名空间:日期”。date.seconds.xsl的内容放在我试图编写的模板中,然后调用没有参数的date:seconds() (默认定义为使用当前时间)。我得到了以下错误消息:“实例方法调用方法秒需要一个对象实例作为第一个参数”。现在看来很有希望。date:seconds添加一个参数。我收到错误消息:“对于扩展函数,无法找到方法java.lang.String.seconds(ExpressionContext,)”对于如何使用这个非核心EXSLT功能,有什么建议吗?
这是我当前的模板,仍然告诉我它正在尝试调用java.lang.String.seconds()
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:func="http://exslt.org/functions"
xmlns:date="http://exslt.org/dates and times">
<xsl:import href="date.seconds.xsl" />
<func:script language="exslt:javascript" implements-prefix="date" src="date.js"/>
<func:script language="exslt:msxsl" implements-prefix="date" src="date.msxsl.xsl"/>
<xsl:template match="/">
<xsl:value-of select="date:seconds('2014-02-27')" />
</xsl:template>
</xsl:stylesheet>发布于 2014-03-03 21:12:42
对于那些想要滚动自己的代码的人(特别是对于seconds() ),只需使用以下代码即可完成:
package tools;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;
public class Dates
{
/**
* Converts a date in xs:dateTime format into seconds-since-the-epoch
*
* @param date The date to be converted,
* in <code>s:dateTime</code> format (yyyy-MM-dd'T'hh:mm:ss).
*
* @return Number of seconds since <code>1970-01-01 00:00:00</code>,
* or 0 if the date is blank or null.
* @throws ParseException
*/
public static long seconds(String date)
throws ParseException
{
if(null == date || 0 == date.trim().length()) return 0;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss");
Date d = df.parse(date);
return d.getTime() / 1000;
}
}这可以通过Apache使用,如下所示:
<?xml ...
xmlns:java="http://xml.apache.org/xalan/java"
...
<xsl:variable name="some-date" select="...some xs:dateTime data ..." />
<xsl:value-of select="java:tools.Dates.seconds($some-date)" />为了使它更加灵活,我可能会查看Xalan源代码,但现在它似乎正在做我希望它做的事情。
发布于 2014-02-27 22:24:43
首先,看看:http://www.exslt.org/howto.html#other-implementations,但是,AFAIK不支持func:script扩展元素(至少它说它不支持,这并不总是相同的)。OTOH,Xalan有自己的扩展机制-请参阅:http://xml.apache.org/xalan-j/extensions.html
如果是我,我只会使用一个命名模板代替。
https://stackoverflow.com/questions/22081400
复制相似问题