[XSLT] Template innerhalb von for-each aufrufen



  • Hi,

    Ich habe hartnäckiges Problem mit eine XML Transformation. Gegeben ist ein Dokument mit einer Reihe von <link> Elementen, sowie ein Template um diese in HTML <a> Elemente zu transformieren. Soweit klappt auch alles.
    Nun will ich jedoch in einem speziellen Fall jeden Link mit Hilfe einer for-each Schleife auf einer separaten Zeile ausgeben. Meine bisherige Lösung sieht wie folgt aus:

    <xsl:for-each select="link">
      <a href="{@href}" class="{@class}">
        <xsl:apply-templates/>
      </a>
      <br/>
    </xsl:for-each>
    

    Diese Lösung funktioniert zwar, ist jedoch nicht was ich will, denn wie zu sehen ist habe ich den Inhalt meines Link Templates (<a> Block) einfach hinüber kopiert. Ich würde jedoch gerne das Template link aus der Schleife heraus aufrufen. Das Problem dabei ist, dass die for-each Schleife bereits innerhalb des link Elementes ist und ein apply-templates deshalb nur die Attribute und Childs betrifft, nicht jedoch das link Element selbst. Ich habe bereits mit call-template und XPath herumgespielt, finde aber einfach keine funktionierde Lösung.

    Danke für die Hilfe
    ToyToy



  • Ich glaube das Problem liegt schon in der Definitionsdatei. Du musst dort sagen, dass das link-Element wiederum ein link-Element enthalten kann.



  • Das ist ein Missverständnis, ein link Element enthält keine weiteren link Elemente. Ich mache mal ein konkretes Beispiel, dann ist mein Problem wahrscheinlich besser verständlich:

    XML Daten:

    <link href="welcome.html">Startseite</link>
    <link href="disclaimer.html">Disclaimer</link>
    ...
    

    Das Template, das ich gerne verwenden würde:

    <xsl:template match="link">
      <a href="{@href}" class="{@class}">
        <xsl:apply-templates/>
      </a>
    </xsl:template>
    

    Wenn ich jetzt mein Dokument transformieren will:

    <xsl:template match="page">
      <xsl:for-each select="link"> 
        <!-- würde ich gerne ersetzen durch etwas wie <xsl:call-template name="link"> -->
        <a href="{@href}" class="{@class}"> 
          <xsl:apply-templates/> 
        </a> 
    
        <br/> 
      </xsl:for-each>
    </xsl:template>
    

Anmelden zum Antworten