我有一个带有变量参数的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方法? 我希望我不必为每个参数创建不同的方法。
非常感谢!
答案 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'))"/>