Mozilla und xsl:variable
Thomas Meinike
- xsl
Hallo,
Ich habe heute eine Beobachtung bzgl. xsl:variable gemacht, die mir zwar gut passen wuerde, aber offenbar nicht der XSLT-Spezifikation entspricht. Gegeben sind test.xml und test.xsl:
test.xml
--------
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="test.xsl" type="text/xsl"?>
<wurzel>
<inhalt>
<a>5</a>
<b>6</b>
</inhalt>
</wurzel>
test.xsl
--------
<?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="html"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
doctype-system="http://www.w3.org/TR/html401/loose.dtd"
encoding="ISO-8859-1"
version="1.0"
indent="yes"
/>
<xsl:template match="/">
<html>
<head>
<title>Test</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="wurzel/inhalt">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="a">
<xsl:variable name="test"><xsl:value-of select="." /></xsl:variable>
<xsl:call-template name="abc" />
</xsl:template>
<xsl:template match="b">
<xsl:variable name="test"><xsl:value-of select="." /></xsl:variable>
<xsl:call-template name="abc" />
</xsl:template>
<xsl:template name="abc">
<p>
<xsl:value-of select="$test * $test" />
</p>
</xsl:template>
</xsl:stylesheet>
Die Werte von a und b (5 bzw. 6) werden in den Templates jeweils der Variablen $test zugewiesen. Dann wird versucht, das Template abc aufzurufen und dort das Quadrat von $test zu berechnen (also 25 bzw. 36).
Normalerweise sollte aber eine solche Template-uebergreifende Variablenuebergabe scheitern, weil die Variablen nur in ihrem jeweiligen Template gelten (oder global bei Definition auf oberster Ebene sind, dann aber auch nicht mehr aenderbar).
Waehrend IE mit MSXML3, Saxon und Sablotron die Verarbeitung verweigern, macht Mozilla 1.0 (Win) den Job und gibt die Quadrate aus.
Eigentlich ein Bug, aber auch ein gar nicht so uebles Feature ...
Der Hintergrund ist das Beispiel zu diesem Artikel: http://www.styleassistant.de/tips/tip94.htm. In der winamp.xsl wollte ich die Zeitumrechnung nach mm:ss fuer die Einzeltitel und die Gesamtlaenge in ein Template auslagern und dann nur die Variable $tmp uebergeben (also wie oben beschrieben). Eigentlich hatte ich erwartet, dass es nicht funktionieren sollte.
Hier mal ein Testdokument fuer Mozilla (Fehlermeldung im IE): http://www.styleassistant.de/test/beispiel94moz.xml.
MfG, Thomas
<xsl:output
method="html"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
doctype-system="http://www.w3.org/TR/html401/loose.dtd"
encoding="ISO-8859-1"
version="1.0"
indent="yes"
/>
Das muss schon version = '4.01' heissen, vgl. http://www.w3.org/TR/xslt#section-HTML-Output-Method
Normalerweise sollte aber eine solche Template-uebergreifende Variablenuebergabe scheitern, weil die Variablen nur in ihrem jeweiligen Template gelten (oder global bei Definition auf oberster Ebene sind, dann aber auch nicht mehr aenderbar).
Du übergibst keine Variablen, du deklarierst Variablen, die plötzlich global funktionieren, das ist natürlich ein Bug.
Eigentlich ein Bug, aber auch ein gar nicht so uebles Feature ...
Bugs sind immer ganz üble Features.
Der Hintergrund ist das Beispiel zu diesem Artikel: http://www.styleassistant.de/tips/tip94.htm. In der winamp.xsl wollte ich die Zeitumrechnung nach mm:ss fuer die Einzeltitel und die Gesamtlaenge in ein Template auslagern und dann nur die Variable $tmp uebergeben (also wie oben beschrieben). Eigentlich hatte ich erwartet, dass es nicht funktionieren sollte.
xsl:call-template mit xsl:with-param gefällt dir nicht?
Hier mal ein Testdokument fuer Mozilla (Fehlermeldung im IE): http://www.styleassistant.de/test/beispiel94moz.xml.
Ich hoffe, du hast das bereits gemeldet.
Hallo,
version="1.0"
indent="yes"
/>
Das muss schon version = '4.01' heissen, vgl. http://www.w3.org/TR/xslt#section-HTML-Output-Method
OK, kam durch eine zeitgleich verwendete SVG-Vorlage ...
Bugs sind immer ganz üble Features.
Ja sicher, ich wollte das auch bestimmt nicht verwenden oder gar gut heißen ;-).
xsl:call-template mit xsl:with-param gefällt dir nicht?
Jetzt schon, sehr sogar. Besten Dank.
Ich hoffe, du hast das bereits gemeldet.
Dazu bin ich noch nicht gekommen.
MfG, Thomas
Hallo,
Ich hoffe, du hast das bereits gemeldet.
Vom Prinzip her steckt das Problem schon in diesem Bug-Report: http://bugzilla.mozilla.org/show_bug.cgi?id=134013. Oder?
MfG, Thomas
Hallo Thomas,
Ich hoffe, du hast das bereits gemeldet.
Vom Prinzip her steckt das Problem schon in diesem Bug-Report: http://bugzilla.mozilla.org/show_bug.cgi?id=134013. Oder?
nein.
dort wird eine variable-reference an einem ort verwendet wo es nichts zu suchen hat (im match-attr. vom xsl:template)
der fehler bei dir leigt aber wo anders, nämlich dass es möglich ist auf eine lokale variable-reference zuzugrifen die außerhalb des gültigkeitsbereichs des referenzierenden temlates liegen.
grüße
thomas
Hallo,
dort wird eine variable-reference an einem ort verwendet wo es nichts zu suchen hat (im match-attr. vom xsl:template)
der fehler bei dir leigt aber wo anders, nämlich dass es möglich ist auf eine lokale variable-reference zuzugrifen die außerhalb des gültigkeitsbereichs des referenzierenden temlates liegen.
So hatte ich das ja auch im Ausgangsposting beschrieben. Werde ich dann mal next week den Bugreport angehen.
MfG, Thomas
Hallo,
Werde ich dann mal next week den Bugreport angehen.
Ok done: http://bugzilla.mozilla.org/show_bug.cgi?id=162258.
Dem Hinweis zum Test mit der Nightly Build konnte ich noch nicht nachgehen, weil der Installer defekt war.
MfG, Thomas