我正在编写Java应用程序,目标是进行XML转换以生成PDF文档。我使用XML文件作为输入,该文件首先解析为Java对象。解析之后,我想在XML转换中使用该对象,因此我将其设置为转换器的参数:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(stylesheet));
transformer.setParameter("foo", javaObject);
在xsl样式表中这样调用该对象的实例方法:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:pdf="http://xmlgraphics.apache.org/fop/extensions/pdf"
xmlns:MyClass="foo.bar.MyClass"
>
...
<xsl:param name="foo"/>
<xsl:param name="seller" select="MyClass:myMethod($foo)"/>
我的问题是:这是执行此操作的正确方法吗?哪种XSLT处理器适合以这种方式使用参数?还有另一种方法吗?
我尝试了Xalan(org.apache.xalan.xsltc.trax.TransformerFactoryImpl),但出现一个异常,找不到该方法:
ERROR: 'Cannot find external method 'foo.bar.MyClass.myMethod' (must be public).'
FATAL ERROR: 'Could not compile stylesheet'
该方法是公共的,没有参数。
对于撒克逊人:有关对外部Java对象的“自反”调用的信息,请参见http://www.saxonica.com/documentation/index.html#!extensibility/functions
首先要注意的是它需要Saxon-PE或-EE。
如果它是没有参数的实例级(非静态)方法,那么最简单的方法是:
((a)声明一个与类名相对应的名称空间,例如]
xmlns:date="java:java.util.Date"
((b)以外部对象作为第一个参数调用该方法:
date:getTime($date)
撒克逊人和Xalan机制并不相同,尽管有许多相似之处。