Я использую 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)
Теперь это странно! Почему Xalan ищет stringLength
функцию на java.lang.String
? Я протестировал <xsl:value-of select="fn:substring('foobar', 2, 3)"/>
, и действительно: результат - o
, поэтому аргументы использовались как startIndex, endIndex
(например, java.lang.String.substring()
) вместо fn:substring(string, start, length)
функции XPath.
Так что я думаю, что Xalan почему-то не хватает своей библиотеки функций XPath и вместо этого использует обычный класс String. Я подтвердил это, вызвав несуществующую функцию fn:index-of('foobar', 'bar')
, которая отлично работает и отображается на java.lang.String.indexOf(str)
.
Почему Ксалан делает это? И как я могу это исправить?
Системная информация: Xalan использует стандартную версию Mac OS X 10.6.4 Java, 1.6.0_20.
Обновление
Хорошо, оставьте на минутку в стороне функцию replace()
. Разве Xalan, будучи процессором XSLT 1.0, не должен реализовывать подстроку функции XPath 1.0 (string, startIndex, length)
, а не функцию (string, startIndex, endIndex)
, которую я вижу по истечении срока действия? Является ли совпадением, что эта функция startIndex, endIndex выглядит как метод подстроки java.lang.String
?
И почему я получаю ошибку NoSuchMethodError, когда использую функцию fn:string-length
?
Что-то здесь не так, и дело явно не в XPath 1.0 против 2.0 ...