forum.bitel.ru
http://forum.bitel.ru/

Не проверяется условие в xsl
http://forum.bitel.ru/viewtopic.php?f=22&t=8284
Страница 1 из 1

Автор:  a.lebedev [ 19 июл 2013, 00:32 ]
Заголовок сообщения:  Не проверяется условие в xsl

Вопрос чисто про 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:

Автор:  Artur [ 19 июл 2013, 09:25 ]
Заголовок сообщения:  Re: Не проверяется условие в xsl

А ничего, что у вас переменная pts внутри блока if определена и не видна за его пределами?

Автор:  a.lebedev [ 19 июл 2013, 11:07 ]
Заголовок сообщения:  Re: Не проверяется условие в xsl

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

Автор:  skn [ 19 июл 2013, 13:18 ]
Заголовок сообщения:  Re: Не проверяется условие в xsl

переменные в xsl нельзя изменять, т.е. переменную вне блока установить, а внутри блока поменять, не получиться.

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

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

Автор:  skn [ 19 июл 2013, 13:21 ]
Заголовок сообщения:  Re: Не проверяется условие в xsl

заменить код

Код:
<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>

Автор:  a.lebedev [ 19 июл 2013, 13:50 ]
Заголовок сообщения:  Re: Не проверяется условие в xsl

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

Автор:  skn [ 19 июл 2013, 14:17 ]
Заголовок сообщения:  Re: Не проверяется условие в xsl

можно сделать xsl-шаблон, в него передавать переменные, потом вызывая где нужно.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/