Использование результата fn:floor() в xsl:для каждого диапазона

#xslt #xslt-2.0 #saxon

#xslt #xslt-2.0 #саксонский

Вопрос:

Я использую XSLT 2.0 (Saxon) и пытаюсь использовать результат floor() вызова в качестве верхней границы диапазона в <xsl:for-each> цикле.

 <xsl:for-each select="1 to floor(string-length($input_string) div 2)">...</xsl:for-each>
  

Я получаю сообщение об ошибке:

XPTY0004: Требуемый тип элемента второго операнда ‘to’ — xs: целое число; предоставленное значение имеет тип элемента xs: десятичное

Я бы подумал, что результирующий тип floor() будет целым числом, но это, похоже, подразумевает, что floor вернет десятичное число, если указано десятичное число: http://saxon.sourceforge.net/saxon7.8/functions.html#fn:floor

Как мне получить целое число, чтобы я мог использовать его в своем диапазоне?

Ответ №1:

Вы должны иметь возможность использовать select="1 to xs:integer(floor(string-length($input_string) div 2))" , конечно, затем необходимо объявить вашу таблицу xmlns:xs="http://www.w3.org/2001/XMLSchema" стилей.

Если по-прежнему возникают проблемы, пожалуйста, сообщите нам, какую версию Saxon вы используете, первой для поддержки XSLT 2.0, как указано в 2007 году, была Saxon 8.9, текущая версия 9.5.

Комментарии:

1. Я не знал, что вы можете «использовать» подобные выражения — спасибо!

Ответ №2:

Вы также можете использовать

 select="1 to ($input_string idiv 2)"
  

хотя мне нужно было бы проверить спецификацию, чтобы быть уверенным, что это возвращает один и тот же ответ при любых обстоятельствах.