0

我正在尝试使用 XSL 对日期进行一些操作。我在 IBM developerWorks上找到了使用此脚本的教程。

<?xml version="1.0" encoding="utf-8"?>
<xsl:transform
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:date="http://exslt.org/dates-and-times"
        version="1.0"
        >
    <xsl:output method="html"/>

    <!-- B -->
    <xsl:variable name="now" select="date:date-time()"/>

    <xsl:template match="/">
        <!-- The rest of the Web site HTML material would go here -->
        <xsl:call-template name="date-section"/>
    </xsl:template>

    <xsl:template name="date-section">
        <p>This page was loaded at <xsl:text/>
            <!-- C -->
            <xsl:value-of select="concat(date:hour-in-day($now), ':',
                                 date:minute-in-hour($now), ':',
                                 date:second-in-minute($now))"/>
            <xsl:text> on </xsl:text>
            <xsl:value-of select="concat(date:day-in-month($now), ' ',
                                 date:month-name($now), ' ',
                                 date:year($now))"/>
        </p>
        <p>
            <!-- D -->
            <xsl:variable name="days-elapsed"
                          select="concat('-P',date:day-in-month($now),'D')"/>
            <xsl:variable name="one-month-hence"
                          select="date:add($now, 'P1M')"/>
            <xsl:variable name="next-month-start"
                          select="date:add($one-month-hence, $days-elapsed)"/>
            <xsl:variable name="seconds"
                          select="date:seconds(
                            date:difference($now, $next-month-start)
                         )"/>
            <xsl:text>The next month starts in </xsl:text>
            <xsl:value-of select="$seconds div (3600*24)"/>
            <xsl:text> days</xsl:text>
        </p>

    </xsl:template>

我收到以下错误:

[ERROR]: Cannot find external method 'com.sun.org.apache.xalan.internal.lib.ExsltDatetime.add' (must be public).
[ERROR]: Cannot find external method 'com.sun.org.apache.xalan.internal.lib.ExsltDatetime.difference' (must be public).
[ERROR]: Cannot find external method 'com.sun.org.apache.xalan.internal.lib.ExsltDatetime.seconds' (must be public).
[ERROR]: Cannot convert data-type 'void' to 'real'.
[FATAL]: Could not compile stylesheet

任何想法如何解决它。我正在使用 IntelliJ 运行 xsl。

最终,我希望能够为日期添加天数。出于某种原因,当我尝试使用 xsl 2 日期函数时,它只是告诉我它们不存在(是的,我确实将标题更改为版本 2 :))。所以我试图让它与第 3 方库一起工作。http://exslt.org/dates-and-times命名空间中的date-time()函数正在工作,但我无法从该命名空间调用其他函数。

4

2 回答 2

3

这个问题有点老了,但答案是,恕我直言,不太正确,我的回答可能会帮助其他一些偶然发现这个线程的人(就像我刚刚做的那样):

  1. 使用的函数是 XSLT 1.0扩展函数,有不同的模块(例如日期和时间),每个模块都有强制和可选的函数(和元素)。见EXSLT
  2. 这里的问题是 XALAN 确实支持模块日期和时间,但不支持所有可选功能。
  3. 正如建议的那样,您当然可以尝试找到一个“更好”的 XSLT 处理器,但它可能需要一些工作来集成。我个人在 Linux 命令行上使用 xsltproc,它支持更多的日期和时间模块(尝试了解一下xsltproc --dumpextensions | sort)。
  4. 或者,您可以尝试描述如何在 XSLT 1.0 中获取当前日期和时间的方法。我自己还没有尝试过(如上所述,xsltproc 是一个足够好的解决方法),但是使用类似的方法,您应该能够实现您需要的东西,而无需接触您的工具/java 代码。
  5. 为了完整起见,我遇到同样问题的工具是来自 freeplane.org 的 Freeplane,它也使用 XALAN(我猜它是标准 Java 库的一部分)并且在类似的日期和时间函数上失败。

希望这会有所帮助,埃里克

于 2013-10-30T08:28:32.960 回答
1

我不了解 Xalan,所以我不知道为什么它找不到这些方法。

但是,如果您想使用 XSLT 2.0 日期/时间函数,则需要调用 XSLT 2.0 处理器,而对于 Java 环境来说显而易见的是 Saxon(当前版本是 9.4)。切换处理器需要的不仅仅是更改版本号:例如,如果您从命令行运行它,那么您将需要使用不同的命令。

于 2012-12-06T15:07:24.407 回答