XHTML-Dokument mittels XSLT "erweitern:
ChrisB
- xsl
Hi,
ich versuche ein XHTML-Dokument mittels XSLT zu "erweitern" - sprich, beim Auftauchen eines bestimmten Elements möchte ich dieses mit einem Container-Element einfassen.
Mein XHTML-Dokument:
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Titel</title>
</head>
<body>
<div>
<h1>Überschrift</h1>
<p>Testabsatz.</p>
</div>
<p>Text, Text, Text</p>
</body>
</html>
In diesem möchte ich jetzt alle P-Elemente mit einem <div class="paragraph">...</div> umschliessen (nur als Beispiel!), d.h. als Ergebnis hätte ich gerne
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Titel</title>
</head>
<body>
<div>
<h1>Überschrift</h1>
<div class="paragraph">
<p>Testabsatz.</p>
</div>
</div>
<div class="paragraph">
<p>Text, Text, Text</p>
</div>
</body>
</html>
Mein XSL-Stylesheet:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="p">
<div class="paragraph">
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="*">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
(Die Tranformation führe ich momentan mittels PHPs XSLTProcessor->importStyleSheet und ->transformToXML(DOMDocument) durch; Kontrolle dann durch Ausgabe nach Behandlung mit htmlspecialchar.)
Leider erhalte ich nicht das gewünschte Ergebnis.
Lasse ich den letzten Teil im Stylesheet weg, <xsl:template match="*"> - dann bekomme ich nur noch die Textnodes ausgegeben, die Elemente fehlen vollständig.
Kommentiere ich <xsl:template match="p"> aus, erhalte ich keine Veränderung.
Also wird dieses Template gar nicht auf meine P-Elemente angewandt? Wenn nein, warum nicht?
Wird <xsl:template match="*"> auch auf meine P-Elemente angewandt, obwohl es nach meinem Verständnis "allgemeiner" sein sollte, und deshalb zuerst eigentlich <xsl:template match="p"> doch zuerst angewandt werden sollte, wenn es sich beim aktuellen Element um ein P handelt?
Müsste ich hier mit priority bei meinen Templates arbeiten? (So wie ich die Erklärung in SELFHTML verstanden habe, müsste doch match="p" automatisch eine höhere Priorität haben als match="*", oder?)
Wie bekomme ich es hin, dass beim Auftreten eines bestimmten Elements darum herum ein weiteres eingefügt wird, es selber und alle seine Nachfahren jedoch inkl. aller Attribute übernommen werden; und alle nicht betroffenen Elemente ausserhalb ebenfalls?
MfG ChrisB
Hallo Chris,
ich versuche ein XHTML-Dokument mittels XSLT zu "erweitern" - sprich, beim Auftauchen eines bestimmten Elements möchte ich dieses mit einem Container-Element einfassen.
Probiere es so:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="html">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="html:p">
<div class="paragraph">
<xsl:copy-of select="."/>
</div>
</xsl:template>
</xsl:stylesheet>
Einerseits kommt das Identity-Template zum Einsatz, welches alle Inhalte 1:1 in die Ausgabe übernimmt und anderseits sollen p-Elemente gesondert behandelt werden, welche wiederum im Default-XML-Namespace liegen. Der Zugriff darauf erfolgt hier mittels html:p (Prefix beliebig wählbar). Die nochmalige Verwendung von xmlns="http://www.w3.org/1999/xhtml" als Default-Namensraum im Stylesheet vermeidet die Ausgabe von xmlns="" bei den neu erzeugten div-Elementen.
Grüße,
Thomas
Hi Thomas,
Probiere es so:
Danke, das bewirkt erst mal das gewünschte.
Einerseits kommt das Identity-Template zum Einsatz, welches alle Inhalte 1:1 in die Ausgabe übernimmt und anderseits sollen p-Elemente gesondert behandelt werden, welche wiederum im Default-XML-Namespace liegen. Der Zugriff darauf erfolgt hier mittels html:p (Prefix beliebig wählbar). Die nochmalige Verwendung von xmlns="http://www.w3.org/1999/xhtml" als Default-Namensraum im Stylesheet vermeidet die Ausgabe von xmlns="" bei den neu erzeugten div-Elementen.
Werd' mal sehen, ob ich das auf den etwas komplexeren realen Einsatzfall übertragen kann, aber das klingt erst mal gut.
MfG ChrisB