Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработать каждый символ строки 
:(
    Опции темы
4epT
Дата 14.2.2012, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Добрый день! В xml файле, имеется тег, в котором содержится ФИО. Нужно проверить что данное ФИО содержит только украинские символы ...

Я пока что придумал только одно решение, использовтаь choose в котором будет просто перечень всего алфавита, если встречается символ, то все ок, а в условии otherwise вывести ошибку, что поле содержит недопустимый символ. Но есть проблема, как вызвать этот template для каждого символа строки ?


Или может быть есть более простой вариант ?
PM MAIL   Вверх
diadiavova
Дата 14.2.2012, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(4epT @  14.2.2012,  13:33 Найти цитируемый пост)
как вызвать этот template для каждого символа строки ?

Он должен быть рекурсивным, то есть шаблону передается строка, он проверяет первый символ и вызывает сам себя, только передавая подстроку начинающуюся со второго символа.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
4epT
Дата 14.2.2012, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Да, так и сделал ) Уже все работает. Но есть пару проблем ...

Первое, как остановить рекурсию если уже был найден один недопустимый символ ?
Второе, как проверить симолв на апостаф ? ( это символ - ' ).

Добавлено через 4 минуты и 31 секунду
С апострофом проблему решил =)

Осталась одна проблема  с принудительным выходом из рекурсии ... если был найден  недопустимый сивол.

можно из шаблона вернуть признак какой-то ? или может быть можно изменить значение глобальной переменной ? (хотя когда читал было написано, что значения переменных в xslt менять нельзя).
PM MAIL   Вверх
diadiavova
Дата 14.2.2012, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(4epT @  14.2.2012,  14:40 Найти цитируемый пост)
можно из шаблона вернуть признак какой-то ? или может быть можно изменить значение глобальной переменной ? 

Ну вообще-то я имел в виду, что шаблон должен возвращать булеву величину, поэтому тут рекурсия организуется довольно просто: проверяешь, первый символ строки, если он не отсутствует в списке - возвращаешь false(), если он там есть выполняешь рекурсивную логику дальше. Все при помощи элемента choose


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
4epT
Дата 14.2.2012, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Ммм извиняюсь, а как вернуть из шаблона значение ? (в данном случае булево)

Вот мой вариант шаблона:

Шаблон для проверки символа:
Код

<xsl:template name="chekCharacter">
        <xsl:param name="character" />
        
        <xsl:choose>
            <xsl:when test="$character='а' or $character='А'">
            </xsl:when>
            <xsl:when test="$character='б' or $character='Б'">
                ......
                         <xsl:otherwise>
                <xsl:call-template name="get_error_by_code">
                    <xsl:with-param name="node_name" select="'С4029'" />
                </xsl:call-template>
            </xsl:otherwise>
</xsl:template>


Шаблон вызывающий сам себя:
Код

<xsl:template name="chekFio">
        <xsl:param name="fio" />
        <xsl:param name="current" select="'1'" />
        <xsl:param name="count" select="string-length($fio)" />
        
        <xsl:choose>
            <xsl:when test="$current &gt;= $count" />
            <xsl:when test="not($fio)" />
            
            <xsl:otherwise>
            
                <xsl:call-template name="chekCharacter">
                    <xsl:with-param name="character" select="substring($fio,$current,1)" />
                </xsl:call-template>
                
                <xsl:call-template name="chekFio">
                    <xsl:with-param name="fio" select="$fio" />
                    <xsl:with-param name="current" select="$current + 1" />
                    <xsl:with-param name="count" select="$count" />
                </xsl:call-template>
                
            </xsl:otherwise>
            
        </xsl:choose>
    </xsl:template>


PM MAIL   Вверх
diadiavova
Дата 14.2.2012, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



4epT, ну вот я примерно набросал логику, мог где-то ошибиться, не проверял как работает, но думаю суть понятна будет. Сначала на до объявить переменную, в которой будут содержаться все символы алфавита(можно объявить ее на верхнем уровне, а можно и в самом шаблоне), у меня в примере само собой другие буквы.
Код

<xsl:variable name="alphabeth" select="'абвгдежзАБВГДЕЖЗ'"/>

Далее сам шаблон примерно такой
Код

  <xsl:template name="alph-contains">
    <xsl:param name="input"/>
    <xsl:variable name="first-contains" select="contains($alphabeth, substring($input, 1, 1))"/>
    
    <xsl:choose>
      <xsl:when test="string-length($input) = 0">
        <xsl:value-of select="true()"/>
      </xsl:when>
      <xsl:when test="string-length($input) = 1 and $first-contains">
        <xsl:value-of select="true()"/>
      </xsl:when>
      <xsl:when test="string-length($input) &gt; 0 and not($first-contains) ">
        <xsl:value-of select="false()"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="alph-contains">
          <xsl:with-param name="input" select="substring($input, 2)"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>


Переменная first-contains проверяет, содержится ли первый символ строки в алфавите.

Если строка имеет нулевой размер - возвращаем true(), если это один символ и он содержится в алфавите - то же самое. Если строка длиннее нуля и первого символа в алфавите нет - возвращаем false(). В ином случае(если строка длиннее единицы и первый символ содержится в алфавите, условие можно и явно прописать), то мы вызываем шаблон рекурсивно и передаем строку со второго символа.

Думаю дальше разберешься. Возможно шаблон сработает как есть, возможно что-то подправить надо. Вызывая его, передавай значение какой-то переменной, ее и используй в выражениях.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.