Xalan 2.7.0(Apache FOP 1.0にバンドルされている)を使用していますが、文字列関数を使用すると問題が発生します。
この行の<xsl:value-of select="fn:replace('test', 't', '*')"/>
結果、次の例外が発生します。
javax.xml.transform.TransformerException: java.lang.IllegalArgumentException: argument type mismatch
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
<xsl:value-of select="fn:string-length('foobar')"/>
結果:
javax.xml.transform.TransformerException: java.lang.NoSuchMethodException: For extension function, could not find method java.lang.String.stringLength([ExpressionContext,] ).
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
今、これは奇妙です!stringLength
Xalanがで関数を探すのはなぜjava.lang.String
ですか?私はテストしました<xsl:value-of select="fn:substring('foobar', 2, 3)"/>
が、実際、結果はo
であるため、引数はXPathの関数の代わりにstartIndex, endIndex
(のように)使用されました。java.lang.String.substring()
fn:substring(string, start, length)
したがって、XalanにはXPath関数ライブラリがなく、代わりに通常のStringクラスを使用していると思います。fn:index-of('foobar', 'bar')
正常に動作し、にマップされる存在しない関数を呼び出すことで、これを確認しましたjava.lang.String.indexOf(str)
。
Xalanがそれを行うのはなぜですか?そして、どうすればそれを修正できますか?
システム情報:Xalanは標準のMac OS X10.6.4Javaバージョン1.6.0_20を使用します。
アップデート
さて、replace()
関数をしばらく脇に置いておきます。XSLT 1.0プロセッサであるXalanは、有効期限に表示される関数ではなく、XPath 1.0関数のサブストリング を実装するべきではありませんか?このstartIndex、endIndex関数がの部分文字列メソッドのように見えるのは偶然ですか?(string, startIndex, length)
(string, startIndex, endIndex)
java.lang.String
fn:string-length
また、関数を使用するとなぜNoSuchMethodErrorが発生するのですか?
ここで何かがおかしいです、そしてそれは明らかにXPath1.0対2.0についてではありません...