我正在使用 Saxon(如有必要,我可以使用 Xalan)XSLT 处理器进行一些转换。 我想将以下对象的实例作为参数传递给 XSLT 模板。
public class Test {
private String value;
public Test(String v) {
value = v;
}
//getters, setters etc.
}
所以我创建了这个对象,即。
Test test = new Test("test");
transformer.setParameter("test", test);
在 XSLT 文件中,我将参数声明为:
<xsl:param name="test" required="yes" as="jt:com.whatever.package.Test" xmlns:jt="http://saxon.sf.net/java-type"/>
现在我的问题是如何在 XSLT 中调用此对象的任何实例方法(即 getValue() )?有可能吗?我知道我可以调用不同 Java 类的静态方法,但这并不是我想要的。
此外,是否可以在 XSLT 中填充 Java 对象,即。为对象的实例调用 setter 方法,然后在转换完成后在 Java 代码中将此对象与新值一起使用?
最佳答案
您应该能够按照您描述的方式调用作为参数传入的“外部对象”的实例方法。如果 $object
是这样一个对象并且 com.package.MyClass
是它的类,并且你想在这个对象上调用方法 getColor()
对象,然后
(a) 需要声明一个命名空间,比如xmlns:MyClass="java:com.package.MyClass"
(b) 您将该方法称为 MyClass:getColor($object)
这种调用 Java 的机制在 Saxon 中称为“自反扩展函数”。 Saxon Home Edition 不支持它。您将需要 Saxon Professional Edition 或旧的开源 Saxon-B 产品。 Saxon-HE 中还有另一种称为“集成扩展函数”的机制,但它需要在 Java 端进行更多编码来声明参数和结果的类型。
您需要注意,使用自反扩展函数,Saxon 正在就如何将 Java 类型映射到 XPath 类型做出最佳猜测,并且它并不总是按照您想要的方式进行映射,尤其是在使用集合时类型。
尽量避免使用有副作用的方法,例如setter方法。在 Saxon 中没有绝对可靠的方法来确保此类调用以任何特定顺序执行,有时 Saxon 优化器会找到一种组织查询的方法,从而完全避免进行调用。如果您必须进行此类调用,请将它们视为调用正在返回结果(例如空序列)并以这样的方式使用调用,如果它返回结果,结果将出现在您的样式表输出中。
关于java - 在 XSLT 中调用 Java 实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12761744/