Freigeben über


Beispiel für <xsl:call-template>

Im folgenden Beispiel wird das <xsl:call-template>-Element zum modularen Transformieren von XSLT verwendet. Im Beispiel werden drei Hauptdateien verwendet:

  • Die XML-Quelldatei topic.xml. Diese Datei stellt ein Thema in einer Buchveröffentlichung dar.

  • Die XSLT-Hauptdatei topic.xsl. Mit dieser Datei wird bestimmt, welche Informationen angezeigt werden.

  • Die aufgerufene XSLT-Datei ui.xsl. Mit dieser Datei wird bestimmt, wie die Informationen gerendert werden.

XML-Datei (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-Hauptdatei (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-Komponentendatei (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>

Ausgabe

Die formatierte Ausgabe lautet:

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.

Dies ist die Prozessorausgabe:

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

Hinweise

Mit der XSLT-Hauptdatei topic.xsl wird bestimmt, welche Informationen angezeigt werden. Der Inhalt des <meta>-Elements wird ausgeblendet, und die Reihenfolge der angezeigten Elemente wird bestimmt. Mithilfe der Datei werden zudem Vorlagenregeln aufgerufen, die in der XSLT-Komponentendatei ui.xsl definiert sind.

Die Datei ui.xsl enthält ausschließlich benannte Vorlagenregeln, die aus der ersten XSLT-Datei abgerufen werden können. Jede benannte Vorlagenregel verhält sich wie eine reguläre Funktion. Sie nimmt die beiden Eingabeparameter $value und $editable an und erstellt eine HTML-Ausgabe. Der $value-Parameter übergibt den anzuzeigenden Text. Mithilfe von $editable wird bestimmt, ob der Ausgabetext bearbeitet werden kann (bei Verwendung von Internet Explorer). Im Gegensatz zu einer regulären Funktion muss die Reihenfolge der Eingabeparameter in der benannten Vorlagenregel nicht der in der aufrufenden Vorlagenregel angegebenen Reihenfolge entsprechen.

Beachten Sie, dass die Vorlagenregeln nicht von den im XML-Quelldokument definierten Knoten abhängig sind. Daher ist die Datei ui.xsl ein Beispiel dafür, wie Sie eine UI-Bibliothek für allgemeine Zwecke schreiben können, die aus beliebigen anderen XSLT-Dateien aufgerufen werden können.

Siehe auch

Referenz

<xsl:template>-Element

<xsl:with-param>-Element