我正在尝试使用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).
请建议。我无法弄清楚错误
答案 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>