3

我有一个带有变量参数的 Java 方法,我需要从 XSLT (1.0) 调用它。但它不起作用,它不断失败并出现以下错误:

javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet

但是,如果我扩展变量参数,它会起作用!

例子:

 public static String getValue(String key, String... args) {  // this is what I want, but doesn't work

 public static String getValue(String key, String args1) { // this works

 public static String getValue(String key, String args1, String args2) { // this works

在 XSLT 中:

<xsl:value-of select="myjavaclass:getValue('MyKey','Arg1')"/>

<xsl:value-of select="myjavaclass:getValue('MyKey','Arg1','Arg2')"/>

那么,有谁知道我是否可以在 XSLT 中使用带有可变参数的 Java 方法?我希望我不必为每个参数数量创建不同的方法。

非常感谢!

4

5 回答 5

3

就反射而言,可变参数方法如

public static String getValue(String key, String... args)

是一个有两个参数的方法,第一个是 a String,第二个是 a String[]。当您从 Java 代码调用 varargs 方法时,编译器会生成字节码以将变量 args 捆绑到一个数组中,但是当您通过反射调用时,就像这里的情况一样,您必须自己构建数组。

那么问题就变成了,您的 XSLT 处理器是否提供了将类型参数String[]从 XSLT 传递到 Java 的任何方法?在 Xalan 的情况下(javax.xml.transform如果你的类路径上没有另一个,则默认实现)我相信答案是否定的,除非在String[]另一个扩展函数返回的特殊情况下。

于 2012-11-12T10:52:48.810 回答
1

由于您的第一个参数也是 type String,我认为它导致了问题。

尝试

     public static String getValue(String... args) {
           String key = args[0];
           String arg1 = args[1];
           .....  
     }
于 2012-11-12T03:02:53.437 回答
1

从 XSLT 调用 Java 方法的机制取决于您使用的 XSLT 处理器,因此在不知道的情况下无法回答这个问题。

此外,说编译不成功的异常消息也没有用。我们需要查看传递给您的 ErrorListener 的特定错误消息(默认的 ErrorListener 可能会将这些消息写入 System.err 或某个日志文件,但这又取决于您使用的产品。)

于 2012-11-12T10:24:52.903 回答
0

老问题,但万一其他人在这里绊倒并想要传递一个字符串参数,你可以用来解决无法直接传递字符串数组的一个技巧是有一个帮助函数来构建字符串 [] ,即首先调用一个函数,该函数给出一个空数组,可能具有默认给定长度;然后根据需要对将参数添加到该数组的函数进行尽可能多的调用;然后将数组作为参数传入。

它可能只在病理情况下有用,但是。

于 2013-06-11T15:55:16.033 回答
0

我遇到了同样的问题,但它适用于我使用以下代替。希望它对你们有用

public static String getValue(String key, String args) { 
String[] parameters = args.split("####");
// here you got you args array   

}

并连接 String args 变量中的所有参数:

<xsl:value-of select="myjavaclass:getValue('MyKey',concat('Arg1','####','Arg2','####','Arg3'))"/>
于 2014-12-16T09:57:54.810 回答