Kind-Elemente kopieren
Tom2
- xsl
Hi Leute
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.
Peace
Tom2
Hallo,
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.
Das Weglassen der literalen html- und body-Elemente im Stylesheet sollte reichen:
<xsl:template match="/">
<xsl:copy-of select="/html/head" />
<xsl:call-template name="DocumentIndex" />
<xsl:call-template name="DocumentBody" />
</xsl:template>
(unter Vorbehalt der Unkenntnis des DocumentIndex-Templates)
MfG, Thomas
Hi Thomas
Das Weglassen der literalen html- und body-Elemente im Stylesheet sollte reichen:
Nein, das funktioniert leider nicht: Der Body des XML-Dokuments soll in den neu generierten Body, der nun auch einen Index enthält, kopiert werden.
<xsl:template match="/">
<xsl:copy-of select="/html/head" />
<xsl:call-template name="DocumentIndex" />
<xsl:call-template name="DocumentBody" />
</xsl:template>(unter Vorbehalt der Unkenntnis des DocumentIndex-Templates)
<xsl:template name="DocumentIndex">
<h3>Inhalt</h3>
<xsl:for-each select="/html/body/h3">
<xsl:variable name="anc" select="a/@name"/>
<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:template>
Dieses Template generiert Links zu den h3-Tags. Es ist ein Proof-of-Concept-Template für ein Inhaltsverzeichnis, welches über dem Dokument im Body-Tag stehen soll. Deshalb darf das DocumentBody-Template den Body-Tag selbst nicht ausgeben. Wenn ich den copy-of-Tag mit einem fixen Text ersetze, dann steht da alles wie ich's haben will.
Freundliche Grüsse
Tom2
Ich seh gerade, dass das scriptschnipsel bei mehren <index>-elementen auf gleicher ebene, die ebenfalls zusammenzieht und ich so keine möglichkeit sehe die zu trennen :(
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