当前位置: 首页 > 知识库问答 >
问题:

在XSLT中调用Java实例方法

林德辉
2023-03-14

我正在使用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代码中的新值使用该对象?

共有1个答案

高兴贤
2023-03-14

您应该能够调用以您描述的方式作为参数传入的“外部对象”的实例方法。如果$object是这样一个对象,而com.package.myClass是它的类,并且您希望对此对象调用方法getColor,那么

(a)您需要声明一个名称空间,例如xmlns:myclass=“java:com.package.myclass”

(b)以MyClass调用方法:GetColor($Object)

这种调用Java的机制在Saxon中称为“自反扩展函数”。Saxon Home版不支持它。您将需要Saxon Professional Edition或旧的开源Saxon-B产品。在Saxon中还有另一种机制--他称之为“集成扩展函数”,但它需要在Java端进行更多的编码来声明参数和结果的类型。

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

尽量避免使用有副作用的方法,如setter方法。在Saxon中,没有绝对可靠的方法来确保这些调用以任何特定的顺序执行,有时Saxon优化器会找到一种组织查询的方法,从而完全避免进行调用。如果您必须进行这样的调用,请将其视为调用返回一个结果(如空序列),并以这样的方式使用调用,即如果它确实返回了一个结果,则该结果将出现在样式表输出中。

 类似资料:
  • 我们有一个用例,我们必须从Xlst模板调用实例方法。我们使用的是Saxon-He9.6版本。穿过了这个堆栈溢出的柱子。我们尝试用Java对象作为参数pssing XML transformer,然后更新模板以调用该实例方法。但它给出了javax.xml.Transform.TransformerConfigurationException。 如果我们可以使用Saxon HE从XSLT模板中调用实例

  • 我创建了一个类,该类旨在获取2个分数,每个分数都有一个分子和分母,然后将它们相加,输出另一个分数。 当我编译程序时,我遇到了一个问题,涉及: 分数F3=新分数。添加(F1、F2);在主要方法中 错误:找不到类型分数$add 如果我将所有内容都设置为一个类,那么程序将运行,但我希望所有方法都严格位于Fraction类中,并在UseFraction类中调用Fraction。

  • 要在实例上调用方法,您必须获取实例的引用并调用该方法。该示例说明了如何获取引用和调用方法,检查 API 以获取可用方法的列表。 // 3 ways of doing the same thing $('#jstree').jstree(true) .select_node('mn1'); $('#jstree') .jstree('select_node', 'mn2'); $.

  • 问题内容: 在Eclipse中调试时如何调用类实例方法? 例如,假设我有以下代码: 我在canvas.drawColor行上有一个断点。当我调试时,代码停止在那一行,并且我可以查看canvas内的变量,但是我也希望能够像在Visual Studio中那样调用canvas内的方法以查看它们返回的结果? 问题答案: 打开“ 显示” 视图,在其中键入要执行的代码,选择它,单击鼠标右键,然后根据您要 执行

  • 为什么我在java中调用方法而不创建实例?在这里输入图像描述

  • 问题内容: 嗨,有人可以向我解释为什么在Java的主函数中调用非静态方法之前必须创建实例吗?这背后的原因是什么? 问题答案: 因为它们是实例成员,所以要访问它们,您需要实例。 当从同一类蓝图创建多个对象时,每个对象都有各自不同的实例变量副本。对于Bicycle类,实例变量是脚踏圈速,档位和速度。每个Bicycle对象对于这些变量都有其自己的值,存储在不同的存储位置中。 所以现在你的第二个问题 有时