我已经让EXSLT的核心日期函数在我已经使用多年的一些XSL模板中运行良好。我想开始使用新的:seconds
。此函数不是“核心”函数之一,因此实现可以声称符合EXSLT而不实际实现它。
我正在使用带有Xalan 2.7.1的Cocoon 2.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()
即可。这让我得到错误消息“For extension function,找不到方法org.apache.xalan.lib.ExsltDatetime.seconds”xmlns:date
。这让我得到错误“前缀必须解析为命名空间:日期”date.seconds.xsl
的内容放在我正在尝试编写的模板中,然后在没有参数的情况下调用date:seconds()
(默认情况下定义为使用当前时间)。我收到此错误消息:“实例方法调用方法秒需要一个Object实例作为第一个参数”。现在这看起来很有希望。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>
答案 0 :(得分:2)
对于那些想要自己推送的人(专门针对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 Xalan使用,如下所示:
<?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的来源,以便让它更灵活,但是现在似乎正在做我想做的事情。
答案 1 :(得分:1)
首先,看一下:http://www.exslt.org/howto.html#other-implementations然而,AFAIK Xalan不支持func:script扩展元素(至少它说它没有&#t; t,这不是总是一样)。 OTOH,Xalan有自己的扩展机制 - 参见:http://xml.apache.org/xalan-j/extensions.html
如果是我,我只会使用命名模板。