[英]Call Java instance methods in XSLT
我正在使用 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 优化器会找到一种组织查询的方法,根本避免进行调用。 如果您必须进行此类调用,请将它们视为该调用正在返回结果(例如空序列),并以这样一种方式使用该调用,即如果它确实返回了结果,则该结果将出现在您的样式表输出中。
这在这里得到了彻底的解释:
http://www.saxonica.com/html/documentation/extensibility/functions/
一个简短的例子:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="java:java.util.Date" exclude-result-prefixes="date">
<xsl:template match="/">
<html>
<xsl:if test="function-available('date:to-string') and
function-available('date:new')">
<p><xsl:value-of select="date:to-string(date:new())"/></p>
</xsl:if>
</html>
</xsl:template>
</xsl:stylesheet>
当应用于任何 XML 文档(未使用)时,会产生所需的正确结果:
<html>
<p>Sat Oct 06 11:41:30 PDT 2012</p>
</html>
我很久以前就使用 Xalan 完成了这项工作。 首先,您需要将以下内容添加到您的 xslt(我认为您不需要添加的所有其他属性)
<xsl:param name="test" />
然后,要调用该方法,您可以执行
<xsl:value-of select="test:getValue()"/>
我发布为时已晚,但对于其他人来说可能会有所帮助。
借助 xalan 处理器,您可以轻松实现这一目标:
第 1 步:包含 Xalan 依赖项或涉及的合适 jar
<!-- https://mvnrepository.com/artifact/xalan/xalan -->
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.1</version>
</dependency>
步骤 2. 与 java 集成时选择此处理器
TransformerFactory factory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null);
步骤 3. 在您的 xsl 中输入样式表中的信息
xmlns:uuid="xalan://PackageName.className"
请注意,此类应该具有您将在 xslt 中使用的静态方法
第 4 步:在您的 xslt 中使用它
<xsl:value-of select="uuid:methodName(string(xpath))" />
它可以是字符串或数字..取决于您的方法参数
来源:http ://www.cafeconleche.org/books/xmljava/chapters/ch17s03.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.