在Xalan Java中使用非核心EXSLT日期函数

时间:2014-02-27 21:58:22

标签: xslt xalan exslt

我已经让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功能时,我尝试了以下操作:

  1. 只需将<xsl:import href="date.seconds.xsl" />添加到我的模板,然后使用date:seconds()即可。这让我得到错误消息“For extension function,找不到方法org.apache.xalan.lib.ExsltDatetime.seconds”
  2. 如上所示删除xmlns:date。这让我得到错误“前缀必须解析为命名空间:日期”
  3. date.seconds.xsl的内容放在我正在尝试编写的模板中,然后在没有参数的情况下调用date:seconds()(默认情况下定义为使用当前时间)。我收到此错误消息:“实例方法调用方法秒需要一个Object实例作为第一个参数”。现在这看起来很有希望。
  4. date:seconds添加参数。我收到错误消息:“对于扩展函数,找不到方法java.lang.String.seconds([ExpressionContext,])”
  5. 有关如何使用此非核心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>
    

2 个答案:

答案 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

如果是我,我只会使用命名模板。