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