[XSLT] in li,p,h1 wird xmlns="" eingefügt

Zatic

Erfahrenes Mitglied
Hallo,

ich habe folgendes Problem. Beim transformieren eines XML Dokuments in XHTML wir d den Elementen li, p und h1 das Attribut xmlns="" automatisch eingefügt. Im Quelldokument sind alle attributslos, und ich gebe auch keine Attribute in der XSL Datei an.
HTML:
<content>
  <p>foo</p>
  <h1>bar</h1>
  <img src="pic.png" alt="pic" />
</content>
Sei meine Quell Node, der XSL Teil sieht so aus:
HTML:
<xsl:copy-of select="content/*"/>
Und als Ergebnis erhalte ich:
HTML:
  <p xmlns="">foo</p>
  <h1 xmlns="">bar</h1>
  <img src="pic.png" alt="pic" />

Darüber beschwert sich dann der Validator, der xmlns in diesen Elementen nicht erlauben will.

Weiß da jemand weiter? Ich bin gerade mit meinem Latein am Ende.

Danke im Voraus,

Manuel
 
Zuletzt bearbeitet:
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;>
 
Zuletzt bearbeitet:
Ich habe Deinen source mal getestet und im xslt einen Fehler gefunden (mal abgesehen davon, daß Du ein paar end-tags beim template match="/nuport" vergessen hast): Das disable...-attribut ist nicht erlaubt:
Code:
<xsl:copy-of select="xhtml/*" disable-output-escaping="yes"/>

Dann habe ich den link auf die bookmarks-xml auskommentiert, da Du sie nicht gepostet hast, dürfte aber im Endeffekt egal sein.

Jedenfalls bekomme ich bei mir das gewünschte Ergebnis ohne xmlns="" . Als Prozessor benutze ich Xalan.

Code:
<?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"/> -->
		<xsl:copy-of select="xhtml/*" /> 
	</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>
</xsl:stylesheet>

Code:
<?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/>
</div>
<div id="Content">
<p>eine testnode</p>
<h1>Texte</h1>
<p>Verzeichnis meiner Essays, Kritiken, zufälligen Gedanken</p>
<h3>
<a href="matrix-reloaded.xml" shape="rect">Filmkritik an Matrix Reloaded</a>
</h3>
<p>Ein Verriss des entäuschendsten Films von 2003.</p>
<h3>
<a href="t-dsl.xml" shape="rect">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" shape="rect">Ãœ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" shape="rect">Instant Hacking</a>
				 von Magnus Lie Hetland angefangen.</p>
<h3>
<a href="gentoo-guide.xml" shape="rect">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" shape="rect">Tutorial ueber Automatisierung in Windows</a>
</h3>
<p>Ich habe mit einem Tutorial ueber Automatierung unter Windows angefangen.</p>
</div>
</body>
</html>
 
Ich habe Deinen source mal getestet und im xslt einen Fehler gefunden (mal abgesehen davon, daß Du ein paar end-tags beim template match="/nuport"
vergessen hast): Das disable...-attribut ist nicht erlaubt:

Stimmt, die Endtags muss ich beim Entfernen von ein paar auskommentierten Sachen ausversehen gelöscht haben, sie sind jedenfalls in meinen Orginaldateien drin.

Wieso ich das disable-output-escaping="yes" drin hatte weiß ich auch nicht mehr genau (war damals in der Vorlesung), bisher hat es jedenfalls nicht geschaden.
Ich habe es auch schon oft genug ohne das probiert, führt bei mir aber trotzdem zum gleichen Ergebnis (gerade eben nochmal rausgenommen - ändert leider nichts).
Interessant, dass bei Dir die shape-Attribute trotzdem eingefügt werden.

Weiterhin habe ich auch das gleiche bei dem per document() eingefügten Teil.
Die Quelle wollte ich nicht posten, die ist etwas groß, aber hier ein Link (Quelltext, der letzte Folder):
http://www.manuelseeger.de/bookmarks/
Der in Frage kommende Folder (ganz am Ende):
HTML:
<folder id="rdf%3A#$UZB8E2">
	<title>nuport</title>
	<bookmark id="rdf%3A#$WZB8E2" href="http://neues.xml">
		<title>Neues</title>
	</bookmark>
	<bookmark id="rdf%3A#$XZB8E2" href="http://index.xml">
		<title>Startseite</title>
	</bookmark>
	<bookmark id="rdf%3A#$.ZB8E2" href="http://software">
		<title>Software</title>
	</bookmark>
</folder>
</xbel>
Spec:
http://pyxml.sourceforge.net/topics/xbel/

Trotzdem soweit danke für die Antwort; Falls Dir sonst was einfällt, ich würde mich freuen :)

Grüße, Manuel
 
Daß shape="rect" eingefügt wird, liegt an der DTD die Du der xml zu Grunde legst. Und zwar beziehst Du Dich in Deiner DTD auf die http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd

Dort findet man:
Code:
<!ATTLIST a
  %attrs;
  %focus;
  charset     %Charset;      #IMPLIED
  type        %ContentType;  #IMPLIED
  name        NMTOKEN        #IMPLIED
  href        %URI;          #IMPLIED
  hreflang    %LanguageCode; #IMPLIED
  rel         %LinkTypes;    #IMPLIED
  rev         %LinkTypes;    #IMPLIED
  shape       %Shape;        "rect"
  coords      %Coords;       #IMPLIED
  >

also wird shape="rect" bei einem <a>-Element eingefügt (warum auch immer).
Kommentierst Du die DOCTYPE-Zeile in deinem XML aus, erscheint kein shape-attribut mehr. (Müßte auch gehen, wenn Du die referenz auf die xhtml-dtd in Deiner dtd weglässt).

Wegen dem xmlns="" nimm dann halt Xalan, ist meiner Meinung nach auch der zuverlässigste Prozessor.

Vielleicht schreibst Du die Sachen nochmal alle neu, mit eigener DTD und wirfst alle namespaces, dtds usw. weg, die Du nicht brauchst. Bau Dir zuerst ein kleines xslt-sheet und dtd, teste und baue sukzessive auf.
 

Neue Beiträge

Zurück