我一直在阅读关于如何将扩展函数与XSLT和Saxon一起使用的编程博客,但似乎无法成功地在XSLT中引用外部Java函数。每当我运行转换时,我都会得到以下错误:
Cannot find a matching 0-argument function named {come.acme.javaxslt.business.CarBusiness}getModel()
at xsl:apply-templates (file:/C:/Users/Dave/workspace/acme-javaXSLT-demo/cars.xsl#18)
processing /cars/car[1]/model[1]
in built-in template rule
at xsl:apply-templates (file:/C:/Users/Dave/workspace/acme-javaXSLT-demo/cars.xsl#10)
processing /cars
EXCEPTION: net.sf.saxon.trans.XPathException: Cannot find a matching 0-argument function named {com.acme.javaxslt.business.CarBusiness}getModel()
; SystemID: file:/C:/Users/Dave/workspace/acme-javaXSLT-demo/cars.xsl; Line#: 30; Column#: -1
net.sf.saxon.trans.XPathException: Cannot find a matching 0-argument function named {com.acme.javaxslt.business.CarBusiness}getModel()
at net.sf.saxon.expr.ErrorExpression.evaluateItem(ErrorExpression.java:58)
at net.sf.saxon.expr.ErrorExpression.iterate(ErrorExpression.java:71)
at net.sf.saxon.expr.Atomizer.iterate(Atomizer.java:180)
...
引用的Java类:
package com.acme.javaxslt.business;
public class CarBusiness {
public static String getModel(){
return "/";
}
}
XSLT:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cars="com.acme.javaxslt.business.CarBusiness">
<xsl:template match="/">
<html>
<body>
<h2>My Car Collection</h2>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="car">
<p>
<xsl:apply-templates select="make"/>
<xsl:apply-templates select="model"/>
</p>
</xsl:template>
<xsl:template match="make">
Make: <span style="color:#ff0000">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
<xsl:template match="model">
Artist: <span style="color:#00ff00">
<xsl:value-of select="cars:getModel()"/></span>
<br />
</xsl:template>
</xsl:stylesheet>
在Java中使用Saxon:
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer(new StreamSource(new File(xslID)));
transformer.transform(new StreamSource(new File(sourceID)), new StreamResult(new File("html/report.html")));
一旦运行上述程序,就会出现错误。
即使我用自定义Java类替换XSLT中的内置Java方法,我也会得到同样的错误。因此,XSLT显然没有与Java挂钩。
推荐的方法是将-TJ添加到JVM选项中,或者使用FeatureKeys.TRACE_EXTERNAL_FUNCTIONS做一些事情,但我在网上到处搜索,以找到有关如何做到这一点的更多信息,这样我就可以了解为什么我的XSLT没有与外部Java函数挂钩,但没有成功。
拜托,有人能帮我弄清楚我的问题是什么吗?
这种情况发生在Saxon PE和HE身上,我还没有尝试过其他版本。
谢谢!
我应该使用Saxon-B 9.1.0.8的早期版本,如下所述:
http://sourceforge.net/p/saxon/discussion/94027/thread/33492ab5/
一旦我把旧的jar文件放在路径中,上面的XSLT就正确地调用了java函数。