2012-12-06 45 views
0

我想对使用XSL的日期进行一些操作。我用这个脚本在IBM developerWorks上找到了一个教程。找不到外部方法“...”(必须是公开的)XSLT

<?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 :))。所以我试图让它与第三方库一起工作。 日期时间()函数来自http://exslt.org/dates-andtimestimes命名空间正在工作,但我无法缝制能够调用其他函数形成该命名空间。

+0

JustmeVSI,这是不足以改变XSL的版本属性:样式表。您*必须*拥有XSLT 2.0处理器。 –

+0

@DimitreNovatchev我刚刚搜索了XSLT 2.0处理器,但没有得到太多有用的信息。你能否详细说明一下。就像我如何设置它,什么是必要的? – JustmeVSI

+0

JustmeVSI,您需要有Saxon 9.x,Altova2012(XMLSpy)或XQSharp(XMLPrime)之一。您可以轻松找到他们的网站和下载。 –

回答

1

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

但是,如果您想使用XSLT 2.0日期/时间函数,则需要调用XSLT 2.0处理器,而Java环境中最明显​​的处理器是Saxon(当前版本为9.4)。切换处理器需要比更改版本号多一点点,例如,如果您从命令行运行它,则需要使用其他命令。

3

问题是有点老,但答案是,恕我直言,不是很正确,我的回答可以帮助一些人跌倒在这个线程(因为我只是做了):

  1. ,它的作用是XSLT 1.0 分机功能,有不同的模块(如日期和时间),每个模块都有强制性和可选功能(和元素)。请参阅EXSLT
  2. 此处的问题是XALAN确实支持模块日期和时间,但不支持所有可选功能。
  3. 如上所述,您一定可以尝试找到一个“更好”的XSLT处理器,但它可能需要一些工作来整合。我个人使用Linux命令行xsltproc,它支持更多的日期和时间模块(试用xsltproc --dumpextensions | sort作为概述)。
  4. 或者,您可以尝试描述how to get current date and time in XSLT 1.0的方法。我还没有自己尝试过(正如所说的,xsltproc是一个足够好的解决方法),但使用类似的方法,您应该能够实现您所需的内容,而无需触摸您的工具/ Java代码。
  5. 为了完整起见,我用同样问题的工具是Freeplane.org的Freeplane,它也使用XALAN(我猜它是标准Java库的一部分),并且在类似的日期和时间函数上失败。

希望这有助于 埃里克

相关问题