Hallo Christian,
Es existiert ein XML-Dokument, dass aus
XHTML-Elementen und eigenen Elementen besteht. Es
importiert also bestimmte Teile des
XHTML-Namensraums. Aber gleichzeitig existieren
auch eigene Elemente in diesem Dokument. Nun soll
dieses XML-Dokument komplett nach XHTML
transformiert werden: die schon bestehenden
XHTML-Elemente sollen weiter drin bleiben, die
eigenen XML-Teile sollen in XHTML uebersetzt
werden. Beispiel (rein fiktiv):<doc>
<a href="blahr">Link</a> nach irgendwo
</doc><doc> soll umgesetzt werden nach XHTML, <a> soll
jedoch unveraendert uebernommen werden. Und fuer
dieses Problem suche ich nun eine generische
Loesung, ich moechte also eine Loesung fuer alle
XHTML-Elemente, ohne dass ich fuer jedes einzelne
ein xsl:template schreiben muss oder es im
<xsl:template match=""> auffuehren muss. Ich
moechte also quasi eine Art Default-Regel
definieren, die immer dann in Kraft tritt, wenn
kein passendes Template fuer ein Element gefunden
wurde.
Ich kann dir dazu jetzt nur einen Ansatz geben, aber damit wirst du schon weiterkommen:
<xsl:template name="html">
<xsl:param name="knoten" />
<xsl:copy-of select="$knoten" />
</xsl:template>
<xsl:call-template name="html">
<xsl:with-param name="knoten" select=".//*[not(name() = document('')//xsl:template/@match)]" />
</xsl:call-template>
Das kannst du für Elemente machen die nicht XHTML-Elemente sind:
<xsl:template match="doc">
<div>
<xsl:call-template name="html">
<xsl:with-param name="knoten" select=".//*[not(name() = document('')//xsl:template/@match)]" />
</xsl:call-template>
</div>
</xsl:template>
-----------
Warum call-template? Weil im Pattern von @match von xsl:template das document() Funktion nicht verwendet werden kann/darf.
Der Ausdruck .//*[not(name() = document('')//xsl:template/@match)]
selectiert _ab_ dem Kontextknoten alle Elemente dessen Name nicht in einem match Attribut in einem xsl:template vorkommt.
Ein andere Möglichkeit wäre es mit key() was zu machen. hier nur als ungetestete Bsp:
<xsl:key name="html" match="//*[not(name() = document('')//xsl:template/@match)]" use="." />
<xsl:template match="*[name() = key('html', .)]">
<xsl:copy-of select="." />
</xsl:template>
Hoffe du kommst damit weiter.
Grüße
Thomas