Вы можете вызвать шаблон в шаблоне в xsl - PullRequest
4 голосов
/ 07 июля 2010

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

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

<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>

Ответы [ 2 ]

6 голосов
/ 07 июля 2010

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

5 голосов
/ 08 июля 2010

Инструкция <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). Будьте ленивы и умны - пусть процессор XSLT сделает проверку типа узла за вас :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...