Unerwünschte konvertierung <x></x> zu <x />
Olaf Schneider
- xsl
Hallo,
in einem xsl-Stylesheet, das xhtml als Ausgabe generiert, werden mit xsl:copy-of verschiedene Codeschnipsel in die Ausgabe kopiert.
Leider wird dabei
<textarea name="example"></textarea>
automatisch in
<textarea name="example" />
umgewandelt, womit zumindest der Firefox-Browser Probleme hat. Verschiedene Möglichkeiten, im xml oder xsl Namespaces für diese Textarea anzugeben, hat an dieser Art der Umwandlung nichts geändert.
Ist es möglich, copy-of beizubringen, dass es sich bei dem zu Kopierenden xml um (x)html handelt, damit er die Regeln von leeren bzw. nichtleeren Elementen beachtet?
Gruß
Olaf Schneider
Hi,
Ist es möglich, copy-of beizubringen, dass es sich bei dem zu Kopierenden xml um (x)html handelt, damit er die Regeln von leeren bzw. nichtleeren Elementen beachtet?
das hängt vom XSLT-Prozessor ab. Ein allgemein funktionierender Workaround wäre, einfach ein Leerzeichen oder einen SGML-Kommentar einzufügen.
Cheatah
Hi Cheatah,
ich hab's befürchtet. Da ich in eine Textarea leider keinen Kommentar der Form <!-- --> schreiben kann, ohne dass dieser Text im Browser als value interpretiert wird, muss ich mir eine andere Lösung überlegen, die ohne das copy-of auskommt.
Vielen Dank und Gruß
Olaf
Hallo,
ich hab's befürchtet. Da ich in eine Textarea leider keinen Kommentar der Form <!-- --> schreiben kann, ohne dass dieser Text im Browser als value interpretiert wird, muss ich mir eine andere Lösung überlegen, die ohne das copy-of auskommt.
Die Lösung wäre natürlich » output method="html" «, es sei denn du willst wirklich XHTML am Ende haben. Dann ist aber dein XHTML richtig und du weisst jetzt, dass die Browser vom richtigen XHTML noch immer recht wenig wissen. (*)
Eine andere Möglichkeit wäre, dass du die zu kopierenden Elemente einzeln mit einer rekursiven Template erzeugst:
<xsl:template match="element-mit-html-inhalt">
<xsl:call-template name="createElement">
<xsl:with-param name="node" select="child::*" />
</xsl:call-template>
</xsl:template>
<xsl:template name="createElement">
<xsl:param name="node" />
<xsl:element name="{name($node)}">
<xsl:for-each select="@*">
<xsl:copy />
</xsl:for-each>
<xsl:if test="name($node) = 'textarea'">
xsl:text </xsl:text>
</xsl:if>
<xsl:if test="$node/child::*">
<xsl:for-each select="$node/child::*">
<xsl:call-template name="createElement">
<xsl:with-param name="node" select="current()" />
</xsl:call-template>
</xsl:for-each>
</xsl:if>
</xsl:element>
</xsl:template>
Grüße
Thomas
PS: (*) ich höre/lese schon wie hier viele aufschreien und beteuern, dass das nicht so ist.
Hallo Thomas,
ich liefere die Seiten mit dem herrlichen Mischmasch Doctype XHTML 1.0 Transitional, aber Content-Type text/html aus (wie wohl viele andere Seiten auch). Damit ist <textarea /> als leeres Element nicht funktionabel.
Vielen Dank für Dein xsl-Snippet, aber ich habe inzwischen entschieden, in der Stufe eins die Textarea schon mit einem Character (\r) in das zu transformierende xml zu hängen.
(Erläuterung: Ein cms hat für jeden Feldtypen einen Handler, der durch eine Factory instanziert wird. Dieser hängt in der Edit-Darstellung Html-Code mit dem passenden Formularelement und dem aktuellen Wert in das Ausgabe-xml, welches dann für die Darstellung mittels xsl transformiert wird. In einer weiteren Stufe wird der Handler wohl später nur die nötigen Daten ins xml hängen und die Formularelemente werden ebenfalls wie der Rest der Seite durch das xsl erzeugt.)
Gruß
Olaf