在XSLT中调用Java实例方法

我正在使用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文件中,我将param声明为:

  

现在我的问题是如何在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专业版或旧的开源Saxon-B产品。 Saxon-HE中还有另一种称为“集成扩展函数”的机制,但它需要在Java端进行更多编码来声明参数和结果的类型。

您需要注意,对于reflection扩展函数,Saxon正在对如何将Java类型映射到XPath类型做出最好的猜测,并且它并不总是以您希望的方式进行映射,尤其是在使用集合类型时。

尽量避免使用带副作用的方法,例如setter方法。 在Saxon中没有绝对可靠的方法确保这样的调用以任何特定的顺序执行,有时Saxon优化器会找到一种组织查询的方法,以避免进行调用。 如果您必须进行此类调用,请将它们视为调用返回结果(例如空序列),并以这样的方式使用调用:如果它确实返回结果,则结果将显示在样式表输出中。

这在这里有详细说明

http://www.saxonica.com/html/documentation/extensibility/functions/

一个简短的例子

     

当应用于任何XML文档(未使用)时,会生成所需的正确结果:

  

Sat Oct 06 11:41:30 PDT 2012

我很久以前就用Xalan做过这个。 首先,您需要将以下内容添加到xslt中(我认为您不需要放置所有其他属性)

  

然后,要调用该方法,您可以这样做

  

我发布的为时已晚,但对于其他人而言,它可能会有所帮助。

您可以在xalan处理器的帮助下轻松实现这一目标:

步骤1:包括Xalan依赖或涉及的合适的jar

   xalan xalan 2.7.1  

步骤2.在与java集成时选择此处理器

 TransformerFactory factory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null); 

步骤3.在xsl中输入样式表中的信息

 xmlns:uuid="xalan://PackageName.className" 

请注意,此类应具有您将在xslt中使用的Static方法

第4步:在xslt中使用它

  

它可以是字符串或数字。取决于您的方法参数

资料来源: http : //www.cafeconleche.org/books/xmljava/chapters/ch17s03.html