2010-10-24 3 views
5

Предположим, у меня есть шаблон foo, который может выдавать что-то с заданным параметром. Теперь я хочу использовать этот вывод в качестве параметра для моего другого шаблона, loop, чтобы я мог циклически вывести вывод определенное количество раз. Я пытался что-то по путиXST - использование вывода из шаблона вызова в качестве возвращаемого значения

<xsl:call-template name="loop"> 
     <xsl:with-param name="times" select="someParam"/> 
     <xsl:with-param name="output"> 
      <xsl:call-template name="foo"> 
       <xsl:with-param name="type" select="something"/> 
      </xsl:call-template> 
     </xsl:with-param> 
    </xsl:call-template> 

Другими словами, output должен теперь содержать вывод вызова foo. Оба loop и foo работают нормально независимо, но, похоже, я не могу их вложить. Как я должен это сделать? Заранее спасибо.

+0

Хорошего вопроса, +1. См. Мой ответ для рабочего примера вашего предоставленного кода и некоторых рекомендаций. –

ответ

9

Проблема в коде, который вы нам пока не показали. Это правильный путь к шаблонам цепи/трубы, хотя я бы не рекомендовал его (см в конце этого ответа),

Это преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:call-template name="loop"> 
     <xsl:with-param name="times" select="3"/> 
     <xsl:with-param name="output"> 
      <xsl:call-template name="foo"> 
       <xsl:with-param name="pN" select="5"/> 
      </xsl:call-template> 
     </xsl:with-param> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="loop"> 
    <xsl:param name="times" select="1"/> 
    <xsl:param name="output" select="2"/> 

    <xsl:choose> 
     <xsl:when test="not($times > 0)"> 
     <xsl:value-of select="$output"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:call-template name="loop"> 
     <xsl:with-param name="times" select="$times -1"/> 
     <xsl:with-param name="output" select="2*$output"/> 
     </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template name="foo"> 
    <xsl:param name="pN" select="1"/> 

    <xsl:value-of select="2*$pN"/> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на любой XML (не б) производит разыскиваемого, правильный результат:

80 

Stylistic рекомендации:

Старайтесь избегать цепочки шаблонов таким образом, так как это приводит к нечитаемому и недостижимому коду.

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

Здесь же преобразование, но учитываться для удовлетворения рекомендуемых стилистических требований:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:variable name="vTwice"> 
    <xsl:call-template name="twice"> 
     <xsl:with-param name="pN" select="5"/> 
    </xsl:call-template> 
    </xsl:variable> 

    <xsl:call-template name="loop"> 
     <xsl:with-param name="pTtimes" select="3"/> 
     <xsl:with-param name="pN" select="$vTwice"/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="loop"> 
    <xsl:param name="pTtimes" select="1"/> 
    <xsl:param name="pN" select="2"/> 

    <xsl:choose> 
     <xsl:when test="not($pTtimes > 0)"> 
     <xsl:value-of select="$pN"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:call-template name="loop"> 
     <xsl:with-param name="pTtimes" select="$pTtimes -1"/> 
     <xsl:with-param name="pN" select="2*$pN"/> 
     </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template name="twice"> 
    <xsl:param name="pN" select="1"/> 

    <xsl:value-of select="2*$pN"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

+1 Правильный ответ. – 2010-10-24 20:30:42

Смежные вопросы