Я использую 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 vs 2.0...
<xsl:value-of select="string-length('foobar')"/>
(т. е. без префикса пространства имен вstring-length()
), выдает ли он исключение NoSuchMethodException? - person LarsH   schedule 06.09.2010