XSLAnwender: Templates Tausch ?

Hallo !

Ist es möglich, Templates während des Ablaufs auszutauschen ?
z.B. um 2 verschiedene Styles auf einen Knoten einsetzen zu können.

Beispiel

XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- edited with XMLSpy v2008 sp1 (http://www.altova.com) by Juergen (none) -->
<BUCHVERWALTUNG>
    <BUECHER>
    </BUECHER>
    <GENRES>
        <GENRE GENRETyp="ROMAN">
            <ID>1</ID>
            <TITEL>Fantasy</TITEL>
            <AUTOR  freischaffen="JA">Herbert</AUTOR>
        </GENRE>
        <GENRE GENRETyp="ROMAN">
            <ID>2</ID>
            <TITEL>Krimi</TITEL>
            <AUTOR  freischaffen="Nein">Klaus</AUTOR>
        </GENRE>
        ...
    </GENRES>
</BUCHVERWALTUNG>

XSL: (Auflistung)

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

<xsl:template match="/">
  <html>
    <head>
      <title>Das ist ein Genre-Example</title>
    </head>
    <body>

<xsl:apply-templates select="*"/>

</body>
  </html>
</xsl:template>

<xsl:template match="GENRES">
   <xsl:for-each select="GENRE">
      <xsl:value-of select="ID"/> -
      <b><xsl:value-of select="AUTOR"/></b><br/>           <=========
   </xsl:for-each>
</xsl:template>

</xsl:transform>

--------------------------------------------

Nun das Ziel: Das Template "GENRES" soll "AUTOR" einmal fett <b> drucken,
und das andere mal nicht. Also

<xsl:template match="GENRES">
   <xsl:for-each select="GENRE">
      <xsl:value-of select="ID"/> -
      <xsl:value-of select="AUTOR"/><br/>               <=========
   </xsl:for-each>
</xsl:template>

--------------------------------------------

Nun das Problem:
Ein Template darf nur einmal vorkommen.

Wie kann man das lösen ?

Die gezielte Einbindung über xsl:import bzw. xsl:include
scheint hier keine Lösung zu bieten.

  1. Hallo XSLAnwender,

    Nun das Problem:
    Ein Template darf nur einmal vorkommen.

    Wie kann man das lösen ?

    Gib beiden Templates ein mode-Attribut mit und rufe xsl:apply-templates mit dem jeweils gewünschten mode auf:

    <xsl:template match="GENRES" mode="normal">  
      <!-- ... -->  
    </xsl:template>  
      
    <xsl:template match="GENRES" mode="spezial">  
      <!-- ... -->  
    </xsl:template>
    

    und

    <xsl:apply-templates mode="normal"/>
    bzw.
    <xsl:apply-templates mode="spezial"/>

    Grüße,
    Thomas