I am using Xalan 2.7.0 (as bundled with Apache FOP 1.0) and have problems when using string functions.
The line <xsl:value-of select="fn:replace('test', 't', '*')"/>
results in this exception:
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')"/>
results in:
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)
Now this is weird! Why does Xalan look for a stringLength
function on java.lang.String
? I tested <xsl:value-of select="fn:substring('foobar', 2, 3)"/>
, and indeed: the result is o
, so the arguments were used as startIndex, endIndex
(like java.lang.String.substring()
) instead of XPath's fn:substring(string, start, length)
funcion.
So I think that Xalan is somehow missing its XPath function library and using the regular String class instead. I confirmed this by calling the non-existing function fn:index-of('foobar', 'bar')
which works fine and maps to java.lang.String.indexOf(str)
.
Why does Xalan do that? And how can I fix it?
System info: Xalan uses the standard Mac OS X 10.6.4 Java version, 1.6.0_20.
Update
Okay, leave aside the replace()
function for a moment. Shouldn't Xalan, being an XSLT 1.0 processor, implement the XPath 1.0 function substring (string, startIndex, length)
and not the (string, startIndex, endIndex)
function I see in my expirements? Is it coincidence that this startIndex, endIndex function looks like the substring method of java.lang.String
?
And why do I get a NoSuchMethodError when I use the fn:string-length
function?
Something's wrong here, and it clearly isn`t about XPath 1.0 vs 2.0...
<xsl:value-of select="string-length('foobar')"/>
(i.e. no namespace prefix onstring-length()
), does it still give a NoSuchMethodException? – Politicize