2016-11-10 4 views
0

У меня есть шаблон, который вызывается с (не преувеличением) примерно 100 параметров или около того. Мне нужно вызвать этот шаблон несколько раз, так как мне нужно изменить родительский узел (ы) - иногда он не существует, иногда есть несколько узлов, и есть несколько значений, которые можно принять.Избегайте передачи параметров несколько раз при вызове шаблона xsl повторно

Например пример фрагмент текущей настройки:

<xsl:choose> 
    <xsl:when test="$test='1'"> 
    <body1> 
     <body3> 
     <xsl:call-template name="template1"> 
      <xsl:with-param name="param1" select="$previouslydefined1" /> 
      . 
      . 
      . 
      <xsl:with-param name="param100" select="$previouslydefined100" /> 
     </xsl:call-template> 
     <body3> 
    </body1> 
    </when> 
    <xsl:when test="$test='2'"> 
    <body2> 
     <xsl:call-template name="template1"> 
     <xsl:with-param name="param1" select="$previouslydefined1" /> 
     . 
     . 
     . 
     <xsl:with-param name="param100" select="$previouslydefined100" /> 
     </xsl:call-template> 
    </body2> 
    </when> 
    <xsl:otherwise> 
    <xsl:call-template name="template1"> 
     <xsl:with-param name="param1" select="$previouslydefined1" /> 
     . 
     . 
     . 
     <xsl:with-param name="param100" select="$previouslydefined100" /> 
    </xsl:call-template> 
    </otherwise> 
</xsl:choose> 

Я чувствую, что должен быть лучшим способом сделать это (возможно несколько), не печатал огромный кусок параметров неоднократно, но я рисуя пробел.

У меня есть два метода, которые, как я знаю, не работают, но, возможно, есть модифицированная реализация.

Выберите заявление вокруг узлов индивидуально (не может - плохой синтаксис):

<xsl:choose> 
    <xsl:when test="$test='1'"> 
    <body1> 
    </when> 
    <xsl:when test="$test='2'"> 
    <body2> 
    </when> 
    <xsl:otherwise/> 
    <xsl:call-template name="template1"> 
     <xsl:with-param name="param1" select="$previouslydefined1" /> 
     . 
     . 
     . 
     <xsl:with-param name="param1" select="$previouslydefined100" /> 
    </xsl:call-template> 
    <xsl:choose> 
    <xsl:when test="$test='1'"> 
    </body1> 
    </when> 
    <xsl:when test="$test='2'"> 
    </body2> 
    </when> 
    <xsl:otherwise/> 
</xsl:choose> 

Используйте значение для установки узла (не удается - значения могут быть пустыми, в этом случае тег не должен существовать):

<xsl:element name="{$node}"> 
    <xsl:element name="{$node2}"> 
    <xsl:call-template name="template1"> 
     <xsl:with-param name="param1" select="$previouslydefined1" /> 
     . 
     . 
     . 
     <xsl:with-param name="param1" select="$previouslydefined100" /> 
    </xsl:call-template> 
    </xsl:element> 
</xsl:element> 

Я также понимаю, что должно быть возможно использовать туннелирование (возможно) - теперь я проверяю эту возможность.

ответ

0

Кажется, я испортил свою первоначальную реализацию установки узлов через параметр. Можно оставить значения пустыми, и в этом случае узлы не создаются, и это то, что я изначально искал. Используя максимальное количество возможных узлов, необходимых и затем заполняя при необходимости, я могу использовать шаблон только один раз:

<xsl:element name="{$node}"> 
    <xsl:element name="{$node2}"> 
    <xsl:call-template name="template1"> 
     <xsl:with-param name="param1" select="$previouslydefined1" /> 
     . 
     . 
     . 
     <xsl:with-param name="param1" select="$previouslydefined100" /> 
    </xsl:call-template> 
    </xsl:element> 
</xsl:element> 
Смежные вопросы