3

XSLT (1.0) から呼び出す必要がある変数引数を持つ 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')"/>

では、XSLT で可変引数を使用して Java メソッドを使用できるかどうかを知っている人はいますか? 引数の数ごとに異なるメソッドを作成する必要がないことを願っています。

どうもありがとう!

4

5 に答える 5

3

リフレクションに関する限り、次のような可変引数メソッド

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

は 2 つのパラメーターを持つメソッドです。最初のパラメーターは aStringで、2 番目のパラメーターは aString[]です。Java コードから varargs メソッドを呼び出すと、コンパイラはバイトコードを生成して変数 args を配列にまとめますが、リフレクションによって呼び出す場合は、この場合のように、自分で配列を作成する必要があります。

質問は、XSLT プロセッサがString[]XSLT から Java に型のパラメータを渡す方法を提供するかどうかです。javax.xml.transformXalan (クラスパスに別の Xalan がない場合のデフォルトの実装) の場合String[]、別の拡張関数によって が返されたという特別な状況を除いて、答えはノーだと思います。

于 2012-11-12T10:52:48.810 に答える
1

最初の引数も typeStringであるため、問題が発生していると思います。

試す

     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

古い質問ですが、他の誰かがここでつまずいて文字列パラメーターを渡したい場合に備えて、文字列配列を直接渡すことができないことを回避するために使用できるハックは、String[] を構築するヘルパー関数を持つことです、つまり、空の配列を与える関数を最初に呼び出します。デフォルトの長さである可能性があります。次に、その配列にパラメーターを追加する関数を必要なだけ呼び出します。次に、配列をパラメーターとして渡します。

おそらく病理学的な場合にのみ役立つでしょうが.

于 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 に答える