在XSLT中使用Variable Argument调用Java方法

时间:2012-11-12 02:55:56

标签: java xslt variadic-functions

我有一个带有变量参数的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方法? 我希望我不必为每个参数创建不同的方法。

非常感谢!

5 个答案:

答案 0 :(得分:3)

就反射而言,像

这样的varargs方法
public static String getValue(String key, String... args)

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

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

答案 1 :(得分:1)

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

尝试

     public static String getValue(String... args) {
           String key = args[0];
           String arg1 = args[1];
           .....  
     }

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

老问题,但是如果有其他人在这里偶然发现并希望传入一个String参数,那么你可以用来绕过不能直接传递一个String数组的hack就是有一个帮助函数构建一个String [],即首先调用一个给出空数组的函数,可能使用默认的给定长度;然后执行尽可能多的调用函数,根据需要将参数添加到该数组;然后将数组作为参数传递。

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

答案 4 :(得分: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'))"/>