使用XSLT 2.0填充当前日期时间

时间:2014-09-01 12:30:37

标签: xslt xslt-2.0

我正在尝试使用XSLT 2.0将XML转换为另一种XML。以下是我正在使用的代码。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:eof="http://style.rbsfm.com/EnrichODCFeed" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
            xmlns:fn="http://www.w3.org/2005/xpath-functions">
 <xsl:template match="/">
   <xsl:element name="tradeArrivalTime">
            <xsl:value-of  select="fn:current-date()"/>
        </xsl:element>
  </xsl:template>
 </xsl:stylesheet>

在使用Junit测试此XSL时,我遇到错误

(错误的位置未知)javax.xml.transform.TransformerException:实例方法
调用方法current-date需要一个Object实例作为第一个参数

在使用Eclipse XSLT编译器进行测试时,我得到了以下异常:

17:56:08,138 ERROR [main] JAXPSAXProcessorInvoker  - Cannot find external method      
'xpath-functions.currentDate' (must be public).
javax.xml.transform.TransformerConfigurationException: Cannot find external method     
'xpath-functions.currentDate' (must be public).

请建议。我无法弄清楚错误

1 个答案:

答案 0 :(得分:2)

该错误表明您使用的XSLT处理器不支持XSLT 2.0。默认的javax.xml.transform处理器仅为1.0,如果您想使用XSLT 2.0,则需要使用2.0兼容的处理器,例如Saxon

Saxon支持相同的javax.xml.transform API,因此为了使用Saxon(一旦将相关的JAR文件或dependency添加到项目中),您需要对代码进行的唯一更改是取代

TransformerFactory.newInstance()

new net.sf.saxon.TransformerFactoryImpl()

请注意,如果您传递一个名为version="2.0"的样式表,1.0处理器不一定会抱怨。相反,它将使用"forwards-compatible" processing mode其中xsl:元素和它不知道的函数将不会被视为编译时错误(仅在实际调用它们的情况下作为运行时错误)。 / p>