0

我已经让 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(). 这让我收到错误消息“对于扩展功能,找不到方法 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()

<?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>
4

2 回答 2

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 源代码以使其更灵活,但现在它似乎正在做我想做的事情。

于 2014-03-03T21:12:42.090 回答
1

首先,看看:http ://www.exslt.org/howto.html#other-implementations但是,AFAIK Xalan 不支持 func:script 扩展元素(至少它说它不支持,这不是总是一样)。OTOH,Xalan 有自己的扩展机制 - 请参阅:http: //xml.apache.org/xalan-j/extensions.html

如果是我,我会简单地使用命名模板。

于 2014-02-27T22:24:43.450 回答