首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Xalan使用非核EXSLT日期函数

使用Xalan使用非核EXSLT日期函数
EN

Stack Overflow用户
提问于 2014-02-27 21:58:22
回答 2查看 2.1K关注 0票数 0

在我多年使用的一些XSL模板中,EXSLT的核心日期函数工作得很好。我想开始使用一个新的:seconds。此函数不是“核心”功能之一,因此实现可以声称符合EXSLT,而不实际实现它。

我在Xalan2.7.1中使用Cocoon2.1.11,它似乎选择了不实现date:seconds

幸运的是,EXSLT的好心人提供下载,以帮助您插件个人功能,但我似乎不知道如何真正实现插件。

例如,我可以使用这个模板轻松地使用核心函数:

代码语言:javascript
复制
<?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函数时,我尝试了以下方法:

  1. 只需将<xsl:import href="date.seconds.xsl" />添加到我的模板中,并使用date:seconds()。这得到了错误消息“对于扩展函数,找不到方法org.apache.xalan.lib.ExsltDatetime.seconds”。
  2. 如上面所示,删除xmlns:date。这将得到错误“前缀必须解析为命名空间:日期”。
  3. date.seconds.xsl的内容放在我试图编写的模板中,然后调用没有参数的date:seconds() (默认定义为使用当前时间)。我得到了以下错误消息:“实例方法调用方法秒需要一个对象实例作为第一个参数”。现在看来很有希望。
  4. date:seconds添加一个参数。我收到错误消息:“对于扩展函数,无法找到方法java.lang.String.seconds(ExpressionContext,)”

对于如何使用这个非核心EXSLT功能,有什么建议吗?

这是我当前的模板,仍然告诉我它正在尝试调用java.lang.String.seconds()

代码语言:javascript
复制
<?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>
EN

回答 2

Stack Overflow用户

发布于 2014-03-03 21:12:42

对于那些想要滚动自己的代码的人(特别是对于seconds() ),只需使用以下代码即可完成:

代码语言:javascript
复制
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使用,如下所示:

代码语言:javascript
复制
<?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源代码,但现在它似乎正在做我希望它做的事情。

票数 2
EN

Stack Overflow用户

发布于 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

如果是我,我只会使用一个命名模板代替。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22081400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档