2

Java クラスの名前空間を定義する次の XSL があります。簡単に言えば、XML ファイルの値に応じて別のリソース バンドルを指定しようとしています (リソース バンドルが実際には国際化のためのものであることはわかっていますが、なぜ車輪を再作成する必要があるのでしょうか?)。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:java="http://xml.apache.org/xalan/java"
                xmlns:pf="my.package.common.PropertiesFinder">

    <xsl:variable name="compType" select="//comp_type"/>
    <xsl:variable name="props" select="pf:getPropsFile($compType)"/>
    <xsl:variable name="DEF6Resources" select="java:util.ResourceBundle.getBundle($props)"/>

変換を実行すると、次のエラーが発生します。

java.lang.NoSuchMethodException: 拡張機能の場合、メソッド org.apache.xml.utils.NodeVector.getProps([ExpressionContext,]) が見つかりませんでした

なぜこれが起こっているのか、誰にでも光を当てることができますか?それは明らかに私のクラスパス/ローダーと関係がありますが、どうすればよいかわかりません...

よろしくお願いします。

アンナ

4

2 に答える 2

1

名前空間の定義を確認する必要があります。

xmlns:pf="my.package.common.PropertiesFinder"

Java クラスの名前空間を定義するときは、先頭にjava:プレフィックスを追加する必要があります。

xmlns:pf="java:my.package.common.PropertiesFinder"

また、呼び出されるメソッド ( getPropsFile) は として宣言する必要がありますstatic

そして、私はこのコードブロックで次のように考えています:

<xsl:variable name="DEF6Resources" select="java:util.ResourceBundle.getBundle($props)"/>

Java ルート パッケージがありません:

<xsl:variable name="DEF6Resources" select="java:java.util.ResourceBundle.getBundle($props)"/>

(これが最後かどうかはわかりません。場合によっては、Xalan パーサーが前に追加するのでしょうか?)

于 2010-10-26T11:39:24.697 に答える
0

同じ問題が発生しました。

最後に、Xalan は静的ブロックや静的変数などを含むクラスをロードできないことがわかりました。たぶんPropertiesFinder、またはResourceBundle静的ブロックを内部で使用します。エラーメッセージは本当に誤解を招くものでした...

于 2012-07-27T08:45:55.707 に答える