共用方式為


<xsl:call-template> 的範例

下列範例使用 <xsl:call-template> 項目,以模組化的方式轉換 XSLT。 此範例使用三個主要的檔案:

  • XML 來源檔 topic.xml。 此檔案代表書籍出版的主題。

  • 主要 XSLT 檔 topic.xsl。 此檔案控制要顯示哪些資訊。

  • 被呼叫的 XSLT 檔 ui.xsl。 此檔案可決定資訊的呈現方式。

XML 檔 (topic.xml)

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="topic.xsl"?>
<topic name="My_topic"
       title="My Topic">
  <meta>
    <owner>
      <name>Jane</name>
      <email>jane@topicfactory.com</email>
      <since></since>
    </owner>
    <history>
      <created-by>
        <name>John</name>
        <email>john@topicfactory.com</email>
        <date>Nov 5, 2001</date>
      </created-by>
      <modifiers>
      </modifiers>
    </history>
    <keyword></keyword>
    <refs></refs>
  </meta>

  <para name="para1" title="First Paragraph">
    The first para has both name and title.
  </para>
  <para title="Second Paragraph">
     the second para has a title but no name.
  </para>

  <para>
    Third para has neither name nor title.
  </para>
</topic>

主要 XSLT 檔 (topic.xsl)

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

  <xsl:import href="ui.xsl"/>
  <xsl:param name="editable" select="true"/>

  <xsl:template match="/topic">
    <xsl:if test="@title">
      <xsl:call-template name="topic_title">
         <xsl:with-param name="editable" select="$editable"/>
         <xsl:with-param name="value" select="@title"/>
      </xsl:call-template>
    </xsl:if>
    <xsl:apply-templates/>
  </xsl:template>

  <!-- Don't display meta information. -->
  <xsl:template match="meta"/>

  <xsl:template match="para">
    <P>
    <xsl:if test="@title">
      <xsl:call-template name="para_title">
         <xsl:with-param name="value" select="@title"/>
         <xsl:with-param name="editable" select="$editable"/>
      </xsl:call-template>
    </xsl:if>
    <xsl:apply-templates/>
    </P>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:call-template name="text">
      <xsl:with-param name="value">
        <xsl:value-of select="."/>
      </xsl:with-param>
      <xsl:with-param name="editable">true</xsl:with-param>
    </xsl:call-template>
  </xsl:template>

</xsl:stylesheet>

元件 XSLT 檔 (ui.xsl)

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

  <xsl:template name="topic_title">
    <xsl:param name="editable"/>
    <xsl:param name="value"/>
    <H2>
      <xsl:attribute name="CONTENTEDITABLE">
         <xsl:value-of select="$editable"/>
      </xsl:attribute>
      <xsl:value-of select="$value"/>
    </H2>
  </xsl:template>

  <xsl:template name="para_title">
    <xsl:param name="value"/>
    <xsl:param name="editable"/>
    <DIV STYLE="font-size:16;
                font-family:Arial;
                font-weight:bold;
                font-style:italic"
         CONTENTEDITABLE="{$editable}">
      <xsl:value-of select="$value"/>
    </DIV>
  </xsl:template>

  <xsl:template name="text">
    <xsl:param name="value"/>
    <xsl:param name="editable"/>
    <SPAN CONTENTEDITABLE="{$editable}">
      <xsl:value-of select="$value"/>
    </SPAN>
  </xsl:template>


</xsl:stylesheet>

輸出

下列是格式化輸出:

My Topic

First Paragraph
The first para has both name and title. 

Second Paragraph
the second para has a title but no name. 

Third para has neither name nor title.

此為處理器輸出:

<H2 CONTENTEDITABLE="true">My Topic</H2>
<P>
   <DIV STYLE="font-size:16;
               font-family:Arial;
               font-weight:bold;
               font-style:italic"
        CONTENTEDITABLE="true">First Paragraph<DIV>
   <SPAN CONTENTEDITABLE="true">
     The first para has both name and title.
   </SPAN>
</P>
<P>
   <DIV STYLE="font-size:16;
               font-family:Arial;
               font-weight:bold;
               font-style:italic"
        CONTENTEDITABLE="true">Second Paragraph<DIV>
   <SPAN CONTENTEDITABLE="true">
     The second para has a title but no name.
   </SPAN>
</P>
<P>
   <SPAN CONTENTEDITABLE="true">
     The third para has neither name nor title.
   </SPAN>
</P>

備註

主要 XSLT 檔案 topic.xsl 可控制要顯示的資訊。 它可隱藏 <meta> 項目的內容,並控制顯示項目的順序。 它也可呼叫元件 XSLT 檔案 ui.xsl 中所定義的範本規則。

ui.xsl 檔案僅包含可從第一個 XSLT 檔案呼叫的具名範本規則。 每個具名範本規則的運作方式都類似規則函式,而會採用兩個輸入參數 $value 與 $editable,並產生 HTML 輸出。 $value 參數會傳遞要顯示的文字;$editable 則用來決定輸出文字是否可進行編輯 (若使用 Internet Explorer)。 但與規則函式不同的是,具名範本規則中的輸入參數順序,不需符合呼叫範本規則中所指定的順序。

請注意,範本規則獨立於來源 XML 文件所定義的節點之外。 因此,ui.xsl 檔案可以當做一個範例,指示您撰寫可從任何其他 XSLT 檔案中叫用的一般用途 UI 程式庫。

請參閱

參考

<xsl:template> 元素

<xsl:with-param> 元素