xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

Сравнение символов в XSLT 1.0


Автор Сообщение
versus_spb
Новичок

Зарегистрирован: 23.03.2009
Сообщения: 17

[13828] Ср Июн 10, 2009 15:48
Сравнение символов в XSLT 1.0
Как уже много тут обсуждалось, в XSLT 1.0 нет приличного сравнения строк или символов.
А также, нету преобразования символа в число, чтобы в дальнейшем можно было сравнить числа.
Столкнувшись с такой задачей придумал такое вот решение. Решил написать - вдруг кому пригодится, а может кто-то предложит более совершенное.
Итак, допустим, что мы знаем, какие символы нам предстоит сравнить, например, только русские буквы. Тогда создаём переменную со всем алфавитом, а дальше чтобы определить номер символа пользуемся парой функций. Привожу код:

Код:


<xsl:variable name="alphabet">абвгдеёжзийклмнопрстуфхцчшщъыьэюя</xsl:variable>
<xsl:value-of select="string-length(substring-before($alphabet, 'д'))" />



Вот и получили номер символа - 4.
По-моему, довольно компактное решение. Какие ещё будут предложения?
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13829] Ср Июн 10, 2009 22:15

Почему нельзя сравнить непосредственно строки и символы?

Код:

<xsl:if test="'A' &lt; 'Z'">
<xsl:if test="'папа' &lt;= 'мама'">


_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
versus_spb
Новичок

Зарегистрирован: 23.03.2009
Сообщения: 17

[13830] Ср Июн 10, 2009 22:28

Vasilisk писал(а):

Почему нельзя сравнить непосредственно строки и символы?

Код:

<xsl:if test="'A' &lt; 'Z'">
<xsl:if test="'папа' &lt;= 'мама'">



Возможно, у меня какая-то другая версия парсера, но у меня
такая конструкция

Код:


<xsl:if test="'A' &lt; 'Z'">
done
</xsl:if>


не выдаёт ничего.
У меня libxml, версия 2.6.19.
Да и проблема эта неоднократно встречалась на этом форуме. Официально, вроде, считается, XSLT 1.0 не поддерживает сравнение строк. Могу найти соответствующие ссылки.
olpa
Любитель

Зарегистрирован: 23.04.2002
Сообщения: 981
Откуда: Санкт-Петербург
Посетить сайт автора
[13831] Чт Июн 11, 2009 07:15

Я думаю, что обычно достаточно использовать xsl:sort (только не знаю, как он работает с не-английским).

Но вообще, неплохая идея. Спасибо, пригодится.
versus_spb
Новичок

Зарегистрирован: 23.03.2009
Сообщения: 17

[13832] Чт Июн 11, 2009 09:37

Не за что Smile
А есть предложение, как использовать xsl:sort для такой, к примеру, задачи нужно выбрать из xml все слова (ну скажем они в тэгах <word>), которые начинаются с букв до "Л"? Просто xsl:sort ведь может только отсортировать, он не может задать условие. Или я ошибаюсь?