2010-07-07 4 views
4

можете ли вы вызвать шаблон в шаблоне? например:вы можете вызвать шаблон в шаблоне в xsl

Если бы я хотел использовать

<xsl:choose> 
    <xsl:when test="//*[local-name()='RetrieveCCTransRq']"> 
    <xsl:call-template name="SOAPOutput"/> 
    </xsl:when> 
</xsl:choose> 

<xsl:template name="SOAPOutput"> 
    <SOAP-ENV:Envelope> 
    <SOAP-ENV:Body> 
     <OutputPayload> 
     <TotalTransactions> 
      <xsl:value-of select="count(//Transaction)"/> 
     </TotalTransactions> 
     <Transactions> 
      <xsl:apply-templates/> 
     </Transactions> 
     </OutputPayload> 
    </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 
    <xsl:template match="Transaction"> 
    <xsl:choose> 
     <xsl:when test="contains(Type,'Debit')"> 
     <Debit> 
      <xsl:apply-templates select="Date"/> 
      <xsl:apply-templates select="PostDate"/> 
      <xsl:apply-templates select="Description"/> 
      <xsl:apply-templates select="Amount"/> 
     </Debit> 
     </xsl:when> 
     <xsl:otherwise> 
     <Credit> 
      <xsl:apply-templates select="Date"/> 
      <xsl:apply-templates select="PostDate"/> 
      <xsl:apply-templates select="Description"/> 
      <xsl:apply-templates select="Amount"/> 
     </Credit> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

    <xsl:template match="Date"> 
    <Date> 
     <xsl:value-of select="."/> 
    </Date> 
    </xsl:template> 

    <xsl:template match="PostDate"> 
    <PostDate> 
     <xsl:value-of select="."/> 
    </PostDate> 
    </xsl:template> 

    <xsl:template match="Description"> 
    <Description> 
     <xsl:value-of select="."/> 
    </Description> 
    </xsl:template> 

    <xsl:template match="Amount"> 
    <Amount> 
     <xsl:value-of select="."/> 
    </Amount> 
    </xsl:template> 
</xsl:template> 
+0

Что вы пробовали? Какой результат вы получили? Это то, чего вы ожидали? Если нет, что вы ожидали, и чем он отличался от того, что вы получили? –

+0

Я исправил ваше форматирование. В будущем, отправляя XML-код, попробуйте отложить его для удобства чтения. –

+0

Хороший вопрос (+1). См. Мой ответ для объяснения и рекомендации по стилю кода. :) –

ответ

5

<xsl:template> инструкция может быть определена только на глобальном уровне (должен быть потомком <xsl:stylesheet> инструкции).

Другая рекомендация - избегать условных испытаний типа узла. Вместо этого:

<xsl:choose> 
    <xsl:when test="//*[local-name()='RetrieveCCTransRq']"> 

    <xsl:call-template name="SOAPOutput"/> 
    </xsl:when> 
</xsl:choose> 

рекомендуется использовать этот:

<xsl:template match="RetrieveCCTransRq"> 

    <!-- Place the body of the named template here --> 

</xsl:template> 

Таким образом, вам не придется писать шесть строк кода, приведенные выше, в которые вы могли бы легко совершить любую ошибку. Кроме того, вы преобразовали именованный шаблон в соответствующий, получив большую гибкость и возможность повторного использования, и вы исключили часть процедурной (pull-style) обработки. Будьте ленивы и умны - пусть XSLT-процессор выполнит проверку типа узла :)

6

Вы можете вызвать шаблон из другого шаблона, вы можете не ПОНЯТИЕ шаблона гнезда, как вы сделали. Переместите все внутренние определения шаблонов на верхний уровень и повторите попытку.

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