Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=4635913&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 18:06:01 2016
Кодировка: Windows-1251
[xslt2] error внутри variable - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
Tarass
парень в форуме

Рег.: 26.01.2003
Сообщений: 7913
Рейтинг: 697
  [xslt2] error внутри variable
      24.05.2006 17:18
 

Saxon8.6
Такой код обрабатывается без ошибок
code:

<xsl:function name="fun:runerror">
    <xsl:copy-of select="1 div 0"/>
</xsl:function>
<xsl:variable name="x" select="fun:runerror()"/>
<!--или <xsl:variable name="x" select="1 div 0"/> -->


Такой все-таки выдаст runtime error и преобразование остановится
code:

<xsl:function name="fun:runerror">
    <xsl:copy-of select="1 div 0"/>
</xsl:function>
<xsl:variable name="x" select="fun:runerror()"/>
<!--или <xsl:variable name="x" select="1 div 0"/> -->
<xsl:value-of select="$x"/>


То есть получается, что exception хранится в переменной и если мы не сделаем что-нибудь из
<xsl:value-of select="$x"/>, <xsl:copy-of select="$x"/> или <xsl:message select="$x"/>, то преобразование благополучно закончится.
Хочется написать функцию проверки параметов, котрая если-что не так останавливает преобразование.
Вопрос: как можно остановить преобразование внутри функции?

vond

Рег.: 08.04.2004
Сообщений: 6076
Из: Москва
Рейтинг: 1202
  Re: [xslt2] error внутри variable [re: Tarass]
      25.05.2006 23:45
 

В ответ на:

То есть получается, что exception хранится в переменной и если мы не сделаем что-нибудь из
<xsl:value-of select="$x"/>, <xsl:copy-of select="$x"/> или <xsl:message select="$x"/>, то преобразование благополучно закончится.




Может я не в тему, но погуглив "xslt lazy evaluation", нашел в частности вот такое:

DevChannel | Overview of an XSLT stylesheet:

Lazy evaluation. With a functional language such as XSLT, the only result of a variable declaration is that the variable now exists; no side effects are possible or allowed. This allows the XSLT processor to optimize stylesheet execution by declaring the variable only when - and if - necessary. This feature is called lazy evaluation, but not all XSLT processors behave that way; one of the "lazy" processors is Saxon.

Lazy evaluation means that if, for example, your xsl:variable declaration contains a debugging output (xsl:message) or a document creation instruction (xsl:result-document), neither will ever get control if its parent variable is not used. And the variable may remain unused simply because none of the templates that reference it are triggered by the current source document.





В ответ на:

Вопрос: как можно остановить преобразование внутри функции?



А как ты себе представляешь остановку преобразования?



Редактировал vond (26.05.2006 00:13)
vond

Рег.: 08.04.2004
Сообщений: 6076
Из: Москва
Рейтинг: 1202
  Re: [xslt2] error внутри variable [re: vond]
      25.05.2006 23:57
 

XSLT2 - 2.9 Error Handling:

In cases where an implementation is able to produce the final result trees without evaluating a particular construct, the implementation is never required to evaluate that construct solely in order to determine whether doing so causes a dynamic error. For example, if a variable is declared but never referenced, an implementation may choose whether or not to evaluate the variable declaration, which means that if evaluating the variable declaration causes a dynamic error, some implementations will signal this error and others will not.




Tarass
парень в форуме

Рег.: 26.01.2003
Сообщений: 7913
Рейтинг: 697
  Re: [xslt2] error внутри variable [re: vond]
      27.05.2006 14:54
 

В ответ на:

Может я не в тему, но погуглив "xslt lazy evaluation", нашел в частности вот такое:



очень даже в тему, спасибо
В ответ на:

А как ты себе представляешь остановку преобразования?



хотелось написать что-то типа:
code:

<xsl:template match="XXX">
....
    <xsl:variable name="x" select="f:getX($y)"/>
....
</xsl:template>
<xsl:function name="f:getX">
   <xsl:param name="y"/>
   <xsl:variabble name="tmp" select="f:checkPar($y)"/>
   .....
</xsl:function>
<xsl:function name="f:checkPar">
   <xsl:param name="y"/>
   <xsl:variabble name="tmp" select="if (not($y)) f:runError()"/>
</xsl:function>
<xsl:function name="f:runError">
  <xsl:message select="error(collection(),'Err_Info')"/>
</xsl:function>


Остановить хотел вот так: <xsl:message select="error(collection(),'Err_Info')"/>



Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
2 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

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

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в