BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 24 июн 2025, 05:24

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Не проверяется условие в xsl
СообщениеДобавлено: 19 июл 2013, 00:32 
Не в сети
Клиент

Зарегистрирован: 06 май 2013, 11:07
Сообщения: 25
Откуда: Тольятти
Карма: 0
Вопрос чисто про xsl... Ну вобщем дело такое. Есть примерно вот такой xml:
Код:
<?xml version="1.0" encoding="windows-1251"?>
<data>
    <bill>
        <pos quantity="1" />
        <pos quantity="2" />
        <pos mid="1" />
        <pos mid="2" />
    </bill>
</data>


К нему есть вот такой xsl:
Код:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:fo="http://www.w3.org/1999/XSL/Format"
   version="1.0">
   <xsl:output encoding="UTF-8" method='xml' />
   <xsl:template match="bill">
      <fo:table>
         <fo:table-body>
            <xsl:for-each select="pos">
               <xsl:if test="1=1">
                   <xsl:variable name="pts" select="number(10)" />
               </xsl:if>
               <xsl:if test="1!=1">
                  <xsl:variable name="pts" select="number(20)" />
               </xsl:if>
               <fo:table-row>
                   <fo:table-cell ><fo:block ><xsl:value-of select="$pts"/></fo:block></fo:table-cell>
                  <fo:table-cell >
                      <fo:block >
                     <xsl:if test="@quantity"><xsl:value-of select="@quantity"/></xsl:if>
                     <xsl:if test="not(@quantity)"> 1 </xsl:if>
                      </fo:block>
                  </fo:table-cell>
               </fo:table-row>
            </xsl:for-each>
         </fo:table-body>
      </fo:table>   
   </xsl:template>
</xsl:stylesheet>


Так вот прямо вот в таком виде этот xsl не работает. Ошибка -- "Переменная или параметр "pts" не определена".
Если вместо условий нарисовать простое присваивание, то всё работает. А вот именно в таком виде - нет.
Причём чуть ниже xsl:if прекрасно реализует значение quantity "по умолчанию". То есть работает на "ура".
Но не могут же быть одновременно ложными оба условия "1=1" и "1!=1".... :shock:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проверяется условие в xsl
СообщениеДобавлено: 19 июл 2013, 09:25 
Не в сети
Аватара пользователя

Зарегистрирован: 27 янв 2010, 16:12
Сообщения: 941
Откуда: Уфа
Карма: 124
А ничего, что у вас переменная pts внутри блока if определена и не видна за его пределами?

_________________
С уважением, Гареев Артур. Вежливый разработчик ООО "Бител".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проверяется условие в xsl
СообщениеДобавлено: 19 июл 2013, 11:07 
Не в сети
Клиент

Зарегистрирован: 06 май 2013, 11:07
Сообщения: 25
Откуда: Тольятти
Карма: 0
Если её дополнительно, например, обнулить вне блока if (и даже вне for-each), то в зависимости от xslt процессора ошибка будет разной. Например msxsl говорит, что переменная определена дважды и вообще ничего не делает. Bgbilling не ругается на двойное определение, но внутрь условия всё равно не заходит. То есть значение переменной не меняется.
Кроме того, писал внутри блока if разные действия. Никаких эффектов! А уж какие только условия не писал...
Кроме того, гонял этот скрипт в отладчике. Точки остановки внутри блока не срабатывают и шаг отладки внутрь if не заходит.
Тут определённо что-то в синтаксисе. Как-то странно срабатывает if сразу после for-each. Но похожих примеров масса и нигде такой особенности не было описано...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проверяется условие в xsl
СообщениеДобавлено: 19 июл 2013, 13:18 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4494
Откуда: Уфа, Россия
Карма: 187
переменные в xsl нельзя изменять, т.е. переменную вне блока установить, а внутри блока поменять, не получиться.

в коде
Код:
<xsl:if test="1!=1">
          <xsl:variable name="pts" select="number(20)" />
</xsl:if>

переменная pts за пределами блока if не доступна


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проверяется условие в xsl
СообщениеДобавлено: 19 июл 2013, 13:21 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4494
Откуда: Уфа, Россия
Карма: 187
заменить код

Код:
<xsl:if test="1=1">
  <xsl:variable name="pts" select="number(10)" />
</xsl:if>
<xsl:if test="1!=1">
  <xsl:variable name="pts" select="number(20)" />
</xsl:if>
<fo:table-row>
  <fo:table-cell ><fo:block ><xsl:value-of select="$pts"/></fo:block></fo:table-cell>

на
Код:
<fo:table-row>
  <fo:table-cell >
    <fo:block >
      <xsl:if test="1=1"><xsl:value-of select="number(10)" /></xsl:if>
      <xsl:if test="1!=1"><xsl:value-of  select="number(20)" /></xsl:if>
    </fo:block>
  </fo:table-cell>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проверяется условие в xsl
СообщениеДобавлено: 19 июл 2013, 13:50 
Не в сети
Клиент

Зарегистрирован: 06 май 2013, 11:07
Сообщения: 25
Откуда: Тольятти
Карма: 0
Спасибо. По крайней мере понятно в чём ошибка.
Осталось понять как с этим жить. :-)
Хотел в одном месте нарисовать алгоритм расчета ндс и сумм, а потом везде пользоваться установленной переменной. Значит не получится так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проверяется условие в xsl
СообщениеДобавлено: 19 июл 2013, 14:17 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4494
Откуда: Уфа, Россия
Карма: 187
можно сделать xsl-шаблон, в него передавать переменные, потом вызывая где нужно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
POWERED_BY
Русская поддержка phpBB
[ Time : 0.041s | 30 Queries | GZIP : On ]