Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Как вернуть значение из темплейта


Автор: sol78 19.4.2009, 18:24
Помогите правельно вернуть значение из темплата:
Код

xsl:template name="tmpltGetBranchNextNode">
    <xsl:param name="curr"></xsl:param>
       .....
      xsl:choose>
      <xsl:when test="$curr/SibbDescriptor/@id != $END_BRANCH_TYPE">
      .....
         <xsl:variable name="outputList">
                  <xsl:call-template name="tmpltGetCellexOutputListByType">
                    <xsl:with-param name="type" select="$curr/SibbDescriptor/@id"></xsl:with-param>
                  </xsl:call-template>
            </xsl:variable>
             <xsl:for-each select="msxsl:node-set(msxsl:node-set($outputList)/Output)">
               <xsl:variable name="currOutput" select="current()"/>
                  <xsl:call-template name="tmpltLinker">
                    <xsl:with-param name="src" select="$srcId"></xsl:with-param>
                    <xsl:with-param name="dest" select="$destId"></xsl:with-param>
                    <xsl:with-param name="srcOp" select="$currOutput/@Name"></xsl:with-param>
                  </xsl:call-template>
             </xsl:for-each>
          ....
           рекурсивный вызов
           <xsl:call-template name="tmpltGetBranchNextNode">
          <xsl:with-param name="curr" select="$nextNode"></xsl:with-param>
            ....
        </xsl:when>
       выход без рекурсии
       <xsl:value-of select="$curr"/>
        </xsl:call-template>

 Почему на выходе в <xsl:value-of select="$curr"/>
я собираю весь 'мусор' (значения других переменных включая нужное). Как решить эту проблему?

Автор: sir_nuf_nuf 20.4.2009, 11:10
"Значение" темплейта составляется из всех данных которые были выведены при его обработке.
Наприрмер, простые тэги (не xsl), все value-of и т.п. которые не лежали внутри variable

Так же, замечу, что если у вас режимом обработки "по-умолчанию" для любого XML элемента - это вывод его содержимого.

Проверьте содержимое вашего темплейта на такие конструкции. Добавьте пустой шаблон для обработки тегов по умолчанию

Автор: sol78 20.4.2009, 11:23
sir_nuf_nuf, немогли бы вы обьяснить что такое режим обработки "по умолчанию" для любого XML элемента  и как ето проверить?

Автор: sir_nuf_nuf 20.4.2009, 22:57
sol78, ну есть два способа вызова темплейтов
1) call-template - когда вы явно указываете имя темплейта которой вызывать
2) apply-templates - когда XSLT сам выбирает темплейты подходящие под обрабатываемые тэги.
т.е. темплейты описываются как
Код

<xsl:template match="/aa/bla:bu">....</xsl:template>

или
Код

<xsl:template match="//bla:*">...</xsl:template>

а XSLT движок сам выбирает какой темплей применить в зависимости от тэгов.
(наприрмер первый темплейт более специфичен (точнее указано множество подходящих тегов), поэтому
к тэгам вида /aa/bla:bu - будет применен именно он,
ко всем тэгам в пространстве имен "bla", за исключением тех которые попадают в первый пункт будет применен второй темплейт.

XSLT движок имеет встроенный темплей по умолчанию
что-то типа такого
Код

<xsl:template match="*|@*"><xsl:value-of select="."/></xsl:template>


Срабатывание этого темплейта приводит к выводу текста тэга (и его аттрибутов) без всякой разметки..
т.е.
Код

<a b="hi,">Jack!</a>

будет выведено как
Код

hi,Jack!


проверьте, может у вас похожий вывод.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)