Hallo,
Ich experimentiere gerade mit XSLT und bin nun auf ein Problem gestossen, welches ich mir nicht erklären kann. Ich beisse mir sowieso noch die Zähne an XPath aus, aber ich kapier nicht mal das folgende einfache Beispiel richtig.
Ich möchte ein Template erstellen, welches mir alle Kindelemente des body-Elements (ja, es handelt sich um XHTML-Daten) zurückgibt. Mein bester Versuch sieht so aus:
<xsl:template name="DocumentBody" match="/html/body" >
<xsl:copy-of select="." />
</xsl:template>Benutzt wird das Template aus dem folgenden Haupttemplate:
<xsl:template match="/">
<html>
<xsl:copy-of select="/html/head" />
<body>
<xsl:call-template name="DocumentIndex" />
<xsl:call-template name="DocumentBody" />
</body>
</html>
</xsl:template>So weit, so gut. Das Problem liegt beim copy-of-Tag: Hier werden nicht einfach alle Elemente unter body hinkopiert, wie ich das haben möchte, sondern auch noch einmal das Haupttemplate angewandt, wobei DocumentIndex nicht mehr eingefügt wird. Das DocumentIndex-Template alleine funktioniert tadellos.
Sieht jemand von Euch den Fehler? Oder wohl eher mein Verständnisproblem? Ich bin für jede Hilfe dankbar.
Versuche mal vom folgenden selbst weiterzukommen: Angewendet auf ein XHTML Dokment
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="xml"
omit-xml-declaration="yes"
indent="yes"
encoding="iso-8859-1"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" />
<xsl:template match="* | @* | text()">
xsl:copy
<xsl:apply-templates select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="body">
<h3>Inhalt</h3>
<xsl:for-each select=".//h3">
<p><a><xsl:attribute name="href">?xsl=index#<xsl:value-of elect="a/@name"/></xsl:attribute><xsl:value-of select="a"/></a></p>
</xsl:for-each>
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
Grüße
Thomas