2012-11-12 60 views
4

我有一個帶有可變參數的Java方法,我需要從XSLT(1.0)中調用它。 但它不工作,它一直與以下錯誤而失敗:在XSLT中使用變量參數調用Java方法

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')"/> 

因此,沒有人知道我是否可以使用Java方法在XSLT變量參數? 我希望我不必爲每個參數創建不同的方法。

謝謝你!

回答

1

由於你的第一個參數也是類型String,我認爲它引起了這個問題。

嘗試

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

仍然沒有工作 – elefant

+0

@ user1816942你得到同樣的錯誤? –

1

的機制調用從XSLT的Java方法取決於你所使用的XSLT處理器,所以它不可能回答這個問題不知道。

另外,說編譯失敗的異常消息沒有用。我們需要查看傳遞給ErrorListener的特定錯誤消息(默認的ErrorListener可能會將這些寫入System.err或某些日誌文件,但又取決於您使用的是什麼產品。)

2

只要反射而言像

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

一個可變參數的方法是有兩個參數的方法,首先是一個String和第二個是一個String[]。當你從Java代碼中調用varargs方法時,編譯器會生成字節碼來將變量args捆綁到一個數組中,但是當你通過反射調用時,就像在這裏一樣,你必須自己構建數組。

所以問題變成了,您的XSLT處理器是否提供了任何方式將參數類型String[]從XSLT傳遞給Java?在Xalan的情況下(默認javax.xml.transform如果你的類路徑中沒有另一個),我相信答案是否定的,除非String[]被另一個擴展函數返回的特殊情況。

+0

是的,我認爲是這樣。 Xalat處理器Xalan沒有提供將String []傳遞給Java的方法。所以看起來像不幸,我確實已經爲每個參數聲明瞭不同的方法:( – elefant

0

舊的問題,但萬一有人在這裏絆倒,想傳遞一個字符串參數,你可以用來解決不能直接傳入一個字符串數組的攻擊是有一個幫助函數,可以構建即String [],即首先調用一個給出空數組的函數,可能默認給定長度;然後根據需要對參數添加到該數組的函數執行多次調用;然後將該數組作爲參數傳遞。

它可能只會在病理情況下有用,但。

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'))"/> 
相關問題