Okay, das letzte Mal, dass ich auf dieses Problem gestoßen bin, war in einer Aufgabe für eine Vorlesung, die dann aber eh fallengelassen wurde.
Jetzt will ich aber etwas ähnliches privat machen, und schon wieder habe ich das gleiche Problem, diesmal aber an zwei Stellen. Deshalb hier eine etwas ausführlichere Beschreibung:
Mein XSL Stylesheet:
HTML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes" omit-xml-declaration="no" doctype-public="-//W3C/DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" />
<xsl:template match="/nuport">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
<xsl:value-of select="metadata/pagetitle"/>
</title>
</head>
<body>
<div id="Header">
<xsl:value-of select="metadata/header"/>
</div>
<div id="Menu">
<ul>
<!-- Lade die Quelle des Menus: -->
<xsl:apply-templates select="document('../bookmarks/xbel.xml')//xbel/folder[title='nuport']"/>
<xsl:call-template name="handleXBEL"/>
</ul>
</div>
<div id="Content">
<p>eine testnode</p>
<!-- copy all childs of xhtml -->
<xsl:copy-of select="xhtml/*" disable-output-escaping="yes"/>
</div>
</body>
</html>
</xsl:template>
<xsl:template match="folder" name="handleXBEL">
<xsl:for-each select="bookmark">
<xsl:call-template name="showBookmark"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="showBookmark" match="bookmark">
<li>
<xsl:element name="a">
<xsl:attribute name="href">
<!-- remove http:// for relative links-->
<xsl:value-of select="substring-after(@href, 'http://')"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="title"/>
</xsl:attribute>
<xsl:value-of select="title" />
</xsl:element>
</li>
</xsl:template>
Das Quelldokument:
HTML:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE nuport SYSTEM "http://www.manuelseeger.de/projekte/nuport/nuport.dtd">
<nuport>
<metadata>
<pagetitle>Texte</pagetitle>
<header>Texte</header>
<description>Texte </description>
<keywords>texte</keywords>
<author>Manuel Seeger</author>
</metadata>
<build>
<mtime>$DATE$</mtime>
<depth>$DEPTH$</depth>
</build>
<files>
</files>
<xhtml>
<h1>Texte</h1>
<p>Verzeichnis meiner Essays, Kritiken, zufälligen Gedanken</p>
<h3><a href="matrix-reloaded.xml">Filmkritik an Matrix Reloaded</a></h3>
<p>Ein Verriss des entäuschendsten Films von 2003.</p>
<h3><a href="t-dsl.xml">Mein Leidensweg zu T-DSL</a></h3>
<p>Wie schwer es war im Jahre 2001 an einen Breitbandanschluss zu kommen.</p>
<h3><a href="instant-hacking.xml">Übersetzung von Instant Hacking</a></h3>
<p>Ich habe mit der Übersetzung von
<a href="http://grace.wharton.upenn.edu/~sok/idtresources/python/instant-hacking.html">Instant Hacking</a>
von Magnus Lie Hetland angefangen.</p>
<h3><a href="gentoo-guide.xml">Gentoo installation Howto</a></h3>
<p>Eine (englishe) Anleitung, wie man Gentoo Linux auf einem Toshiba
Sattelite 5200-903 installiert. Hinweis: Das Howto ist noch (lange?) nicht fertig,
aber schon hilfreich</p>
<h3><a href="cmd-howto">Tutorial ueber Automatisierung in Windows</a></h3>
<p>Ich habe mit einem Tutorial ueber Automatierung unter Windows angefangen.</p>
</xhtml>
</nuport>
Und das Ergebnis:
HTML:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Texte</title>
</head>
<body>
<div id="Header">Texte</div>
<div id="Menu">
<ul>
<li xmlns="">
<a href="neues.xml" title="Neues">Neues</a>
</li>
<li xmlns="">
<a href="index.xml" title="Startseite">Startseite</a>
</li>
<li xmlns="">
<a href="software" title="Software">Software</a>
</li>
</ul>
</div>
<div id="Content">
<p>eine testnode</p>
<h1 xmlns="">Texte</h1>
<p xmlns="">Verzeichnis meiner Essays, Kritiken, zufälligen Gedanken</p>
<h3 xmlns="">
<a href="matrix-reloaded.xml" shape="rect">Filmkritik an Matrix Reloaded</a>
</h3>
<p xmlns="">Ein Verriss des entäuschendsten Films von 2003.</p>
<h3 xmlns="">
<a href="t-dsl.xml" shape="rect">Mein Leidensweg zu T-DSL</a>
</h3>
<p xmlns="">Wie schwer es war im Jahre 2001 an einen Breitbandanschluss zu kommen.</p>
<h3 xmlns="">
<a href="instant-hacking.xml" shape="rect">Übersetzung von Instant Hacking</a>
</h3>
<p xmlns="">Ich habe mit der Übersetzung von
<a href="http://grace.wharton.upenn.edu/~sok/idtresources/python/instant-hacking.html" shape="rect">Instant Hacking</a>
von Magnus Lie Hetland angefangen.</p>
<h3 xmlns="">
<a href="gentoo-guide.xml" shape="rect">Gentoo installation Howto</a>
</h3>
<p xmlns="">Eine (englishe) Anleitung, wie man Gentoo Linux auf einem Toshiba
Sattelite 5200-903 installiert. Hinweis: Das Howto ist noch (lange?) nicht fertig,
aber schon hilfreich</p>
<h3 xmlns="">
<a href="cmd-howto" shape="rect">Tutorial ueber Automatisierung in Windows</a>
</h3>
<p xmlns="">Ich habe mit einem Tutorial ueber Automatierung unter Windows angefangen.</p>
</div>
</body>
</html>
Kurze Erklärung: Das ganze habe ich aus autodidaktischen Gründen geschrieben, um Anwendungserfahrung in XML, DTDs, XSL, XPath zu bekommen. Lief auch alles sehr gut, bis zu diesem Punkt. Es ist eine Publikationssystem für meine Homepage.
Zuerst einmal zu den Childs des <div id="Content"> Elements im Ergebnis-Tree. Dort werden alle Elemente, die mittels <xsl:copy-of> aus dem Quell-Tree 1:1 kopiert werden, mit einem xmlns="" versehen. Außerdem wird den Links das optionale Attribut shape="rect" zugefügt. Das ist nicht weiter schlimm, da das ja noch valid ist, aber das xmlns="" hat das nichts verloren.
Das erste p-Element direkt unter <div id="Content"> wird nicht kopiert, und ist auch nicht von dem Einfügen betroffen.
Noch seltsamer ist der <div id="Menu"> Teil des Ergebnis-Trees. Dieser wird aus einer XBEL Datei gelesen. XBEL ist ein XML Dialekt für Browser-Bookmarks. Ich habe das genommen, weil ich damit das Navigationsmenu meiner Homepage in den Bookmarks von Firefox bearbeiten kann. Die Zeile
HTML:
<xsl:apply-templates select="document('../bookmarks/xbel.xml')//xbel/folder[title='nuport']"/>
holt sich aus meinen Firefox-Bookmarks den Ordner mit dem Navigationsmenu und das Template <xsl:template name="showBookmark"> macht daraus HTML-Verweise.
Während das auch funktioniert, wird auch hier das xmlns="" eingefügt. Das shape="rect" bei den Verweisen nicht, was aber wohl daran liegt, dass die Verweise mit <xsl:element name="a"> zusammengesetzt werden.
Das xmlns="" wird auch anscheinend nur in Block-Elemente eingefügt, nicht in zB a-Elemente oder img-Elemente. Ich vermute zwar, dass hat etwas mit dem Einfügen der XHTML DTD in die nuport.dtd (weiter unten) zu tun, aber das würde nicht das gleiche Problem beim Lesen aus dem XBEL Dokument erklären.
Ich habe gerade bestimmt 3 Stunden lang Referenzen gewälzt, aber nichts dazu gefunden.
Ich habe auch schon diverses mit Namespaces probiert, wie XBEL, XHTML, XSL alle im Stylesheet zu definieren, bleibt aber alles beim gleichen Ergebnis.
Als Prozessor verwende ich die libxslt vom Gnome Projekt, habe es aber auch schon mit Saxon probiert.
Freue mich auf Hilfe!
nuport.dtd:
HTML:
<!ENTITY % xhtml SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
%xhtml;
<!ELEMENT nuport ( metadata,build,files?,menu?,xhtml )>
<!ELEMENT metadata (pagetitle,header,description?,keywords?,csstyle?,author?)>
<!ELEMENT pagetitle (#PCDATA)>
<!ELEMENT header (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT keywords (#PCDATA)>
<!ELEMENT csstyle (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT build (mtime, depth)>
<!ELEMENT mtime (#PCDATA)>
<!ELEMENT depth (#PCDATA)>
<!ELEMENT files ( (dir|file)* )>
<!ELEMENT file (#PCDATA)>
<!ELEMENT dir ( (dir|file)* )>
<!ATTLIST dir name CDATA "">
<!ELEMENT xhtml %Block;>