XSL - Переменная в зависимости от условия

timur-kar

Новичок
XSL - Переменная в зависимости от условия

Как сделать:
есть некое условие, в зависимости от его выполнения или невыполнения надо присваивать значение перменной, но значение перменной должно быть XPath выражением (не статическое значение)

к примеру

Код:
<xsl:if text="true()">
  <xsl:variable name='myvar' select='/ROOT/PAGE'/>
</xsl:if>
<xsl:if text="false()">
  <xsl:variable name='myvar' select='/ROOT/COMMON'/>
</xsl:if>
проблема в том что область видимости переменной myvar ограничивается блоком xsl:if
 

slach

Новичок
угу... и это никак не обойти...

в принципе остальную обработку можно вынести в поименованый темплейт
и значение переменной передавать как параметр

т.е..
PHP:
<xsl:if test="true()">
  <xsl:call-template name="func_template">
    <xsl:with-param name='myvar' select='/ROOT/PAGE' />
  </xsl:call-template>
</xsl:if>
<xsl:if test="false()">
  <xsl:call-template name="func_template">
     <xsl:with-param name='myvar' select='/ROOT/COMMON'/>
  </xsl:call-template>
</xsl:if>
 

chameleon

Новичок
такой вариант не подойдет?
PHP:
<xsl:variable name="myvar" select="/ROOT/PAGE[$expr]|/ROOT/COMMON[not($expr)]"/>
 

timur-kar

Новичок
chameleon

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

crocodile2u

http://vbolshov.org.ru
можно и так:
PHP:
<xsl:variable name='myvar'>
  <xsl:if test="true()">
    <xsl:value-of select='/ROOT/PAGE'/>
  </xsl:if>
  <xsl:if test="false()">
    <xsl:value-of select='/ROOT/COMMON'/>
  </xsl:if>
</xsl:variable>
 

crocodile2u

http://vbolshov.org.ru
Ну, часть кода, кот. относится к выбору, я собсно, позаимствовал у автора.
 

timur-kar

Новичок
<xsl:variable name="myvar" select="/ROOT/PAGE[$expr]|/ROOT/COMMON[not($expr)]"/>
вариант работает, но не подходит для случаев где оба условия верны и надо выбрать первое правильное (XSL выбирает по какому-то своему принципу). здесь приходится использовать choose/when, к сожалению :( очень коряво получается :(


crocodile2u
так нельзя
потому-что value-of возвращает не узел, а статическое значение.
 

chameleon

Новичок
но не подходит для случаев где оба условия верны и надо выбрать первое правильное
фиговые случаи :).. то что я привел есть эквивалент тернарной операции. С самими предикатами можно извращаться как душе угодно.
ну делай <xsl:copy-of/> node-set в чистом XSLT1.0 все равно не получишь.
 
Сверху