call-template name="$variable"
Kerstin
- xsl
Hallo,
sorry, aber ich muss mich schon wieder an euch wenden. Ich habe mir da so schön gedacht. In meine Daten-XML-Datei schreibe ich mir die Titel für meine einzelnen Kapitel und darunter dann den Namen des Templates, welches aufgerufen wird um das Kapitel dann auch mit Inhalt zu füllen.
Die Daten-XML sieht ungefähr so aus:
<Content>
<SectionTitles manualType="1">
<main>
<title>Einleitung</title>
<sub>
<title>Ziel des Betriebshandbuchs</title>
<template>intention</template>
</sub>
<sub>
<title>Geltungsbereich des Betriebshandbuchs</title>
<template>ambit</template>
</sub>
<sub>
<title>Abgrenzung des Betriebshandbuchs</title> <template>delimitation</template>
</sub>
</main>
</SectionTitles>
</Content>
In der zugehörigen XSL wird das alles durchgelaufen und an der entsprechenden Stelle soll das Template aufgerufen werden:
<xsl:for-each select="$SectionTitles/main">
<section>
<title><xsl:value-of select="title"/></title>
<xsl:variable name="maintemp">
<xsl:value-of select="template"/></xsl:variable>
<xsl:value-of select="$maintemp"/>[1]
<xsl:call-template name="$maintemp"/>[2]
<xsl:for-each select="sub">
<section>
<title><xsl:value-of select="title"/></title>
<xsl:variable name="subtemp">
<xsl:value-of select="template"/></xsl:variable>
<xsl:value-of select="$subtemp"/>[3]
<xsl:call-template name="$subtemp"/>[4]
<xsl:for-each select="subSub">
<section>
<title><xsl:value-of select="title"/></title> <xsl:variable name="subsubtemp">
<xsl:value-of select="template"/></xsl:variable>
<xsl:value-of select="$subsubtemp"/>[5]
<xsl:call-template name="$subsubtemp" />[6]
</section>
</xsl:for-each>
</section>
</xsl:for-each>
</section>
</xsl:for-each>
Bevor unter [1], [3] und [5] der Name des aufzurufenden Template aus Testzwecken ausgeben wird, wird er in eine Variable geschrieben. Funzt auch wunderbar. Wenn ich allerdings versuche die Variable bei [2], [4] und [6] in das Attribut name von <xsl:call-template reinzuschreiben, schmeißt mir der XSLT-Prozessor eine Fehlermeldung: Er könne das Template mit der angegebenen Variable $maintemp, $subtemp, $subsubtemp nicht finden. Klar, er soll ja auch nicht nach der Variable suchen sondern, nach dem Inhalt der Variable. Auch wenn ich geschweifte Klammern um die Variable setze, kommt der selbe Fehler, nur halt die Variablen mit geschweiften Klammern drum rum. Bei anderen Angaben z.B. bei cols="{$cols}" hat das wunderbar geklappt.
Kann ich das denn bei call-template so name="$maintemp" oder name="{$subtemp}" machen ? By the way: die Templatenamen, die in den Variablen stehen, hab ich angelegt. Also finden müsste er sie.
Gruß,
Kerstin
Hallo,
Bevor unter [1], [3] und [5] der Name des aufzurufenden Template aus Testzwecken ausgeben wird, wird er in eine Variable geschrieben. Funzt auch wunderbar. Wenn ich allerdings versuche die Variable bei [2], [4] und [6] in das Attribut name von <xsl:call-template reinzuschreiben, schmeißt mir der XSLT-Prozessor eine Fehlermeldung:
Absolut korrektes Verhalten.
Kann ich das denn bei call-template so name="$maintemp" oder name="{$subtemp}" machen ?
Nein. Im name-Attribut von template und call-temlate muss ein QName (ein Qualifizirter XML-Name) stehen, keine Variablen, keine XPath-Ausdrücke etc.
By the way: die Templatenamen, die in den Variablen stehen, hab ich angelegt.
Um pigelig genau zu sein, hast du es nicht gemacht, denn dann müsste dein Template $template etc. im "name" tragen und das ist eben nicht erlaubt.
Grüße
Thomas
Hallo,
By the way: die Templatenamen, die in den Variablen stehen, hab ich angelegt.
Um pigelig genau zu sein, hast du es nicht gemacht, denn dann müsste dein Template $template etc. im "name" tragen und das ist eben nicht erlaubt.
Danke Dir für die klare Aussage. Es ist trotzdem schade, dass es nicht geht :-(
Gruß,
Kerstin
Hallo Kerstin,
ich wollte auch die templates dynamisch aufrufen und musste dann feststellen, dass dies "noch" nicht geht -wurde schonmal diskutiert in jüngerer Vergangheit. Das Einzige was mir dazu einfällt und glaube auch damals als Lösung vorgeschlagen wurde war - Schritt für Schritt zu Prüfen mit xsl:choose
skizzenhaft etwas so
xsl:choose
<xsl:when test="template='intention'">
<xsl:call-template name="intention"/>
</xsl:when>
xsl:otherwise
<xsl:when test="template='ambit'">
<xsl:call-template name="ambit"/>
</xsl:when>
xsl:otherwise
xsl:when
.....
</xsl:when>
xsl:otherwise
</xsl:otherwise>
</xsl:otherwise>
</xsl:otherwise>
Verklage mich jetzt bitte nicht, wenn das nicht wohlgeformt ist, aber es soll die Idee zeigen, wie man vorgehen könne, wenn nicht gar zu viele Templates bestehen bzw. ich dein Problem richtig verstanden habe.