java - 在 XSLT 中调用 Java 实例方法

标签 java xslt saxon

我正在使用 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/

相关文章:

Java:如何在 HashMap 中获取具有相同值的键集

java - 无法从 SaxonEE9-9-1-4J 中的 XSLT 调用扩展 Java 方法

java - java中的绘图框架

xml - xslt 1.0 中的编程工具

python - awk 双引号字段分隔符

xslt - EXSLT 字符串分词器上下文

validation - Grails 根据 xsd 1.1 验证 xml 文档

xslt - 带有 XSLT 2.0 和 xsl 的 Camel :result-document keeping files in route destination

Java枚举,如何以及何时为每个常量分配内存

java - org.springframework.data.repository.Repository 类型无法解析。它是从所需的 .class 文件间接引用的