Загрузка внешних блоков кода XSL - PullRequest
2 голосов
/ 15 февраля 2012

Можно ли загружать внешние блоки кода XSL аналогично тому, как можно загружать блоки кода, например, в aspx include? EG:

    <xsl:if test="$ShowNextButton='No'">
        <!-- A Block of external code would be loaded here -->
    </xsl:if>

Я использую XSLT 1.0, если это имеет значение.

1 Ответ

7 голосов
/ 15 февраля 2012

Если ваши блоки «внешнего кода XSL» можно поместить в именованный шаблон, вы можете сделать это легко.

Вот общий пример использования основной таблицы стилей XSLT (base.xsl) и включения внешнегоТаблица стилей XSLT (include.xsl).

input.xml

<test>
  <foo trigger-template="yes">
    <bar>Original "bar".</bar>
  </foo>
  <foo trigger-template="no">
    <bar>Original "bar".</bar>
  </foo>
</test>

base.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:include href="include.xsl"/>
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="foo">
    <foo>
      <xsl:if test="@trigger-template='yes'">
        <xsl:call-template name="external-template">
          <xsl:with-param name="statement" select="'Successfully called external XSL code!'"/>
        </xsl:call-template>
      </xsl:if>
      <xsl:apply-templates/>
    </foo>
  </xsl:template>

</xsl:stylesheet>

include.xsl

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

  <xsl:template name="external-template">
    <xsl:param name="statement"/>
    <bar><xsl:value-of select="$statement"/></bar>
  </xsl:template>  

</xsl:stylesheet>

output.xml

<test>
   <foo>
      <bar>Successfully called external XSL code!</bar>
      <bar>Original "bar".</bar>
   </foo>
   <foo>
      <bar>Original "bar".</bar>
   </foo>
</test>
...