# Example from Steve Muench # to Jon Smirl # on 4 March 2000 """ From: "Steve Muench" To: Subject: Re: SVG charts and graphs from XML input Date: Sat, 4 Mar 2000 18:02:53 -0800 (19:02 MST) This is by no means a bullet-proof, one-size-fits all charting stylesheet, but it *was* my first foray into SVG from XSLT. Given XML results of an Oracle XSQL Page like: select ename, sal from dept Which under the covers produces a dynamic XML doc like: [SNIP source] The following "salchart.xsl" XSLT stylesheet renders a dynamic bar chart with "cool colors" for the employees in the department. You may have to modify the namespace of the Java extension functions to get it to work in XT or Saxon or other XSLT engines. [SNIP stylesheet] """ #" from Xml.Xslt import test_harness sheet_1 = ''' Salary Chart fill:# 0 0 0 ''' source_1=""" CLARK 2450 KING 3900 MILLER 1300 """ expected_1=""" Salary Chart CLARK2450 KING3900 MILLER1300 """ #Extensions from Ft.Xml.XPath import Conversions ORACLE_JAVA_NS = 'http://www.oracle.com/XSL/Transform/java' JAVA_COLOR_NS = ORACLE_JAVA_NS + '/java.awt.Color' JAVA_INTEGER_NS = ORACLE_JAVA_NS + '/java.lang.Integer' def Java_Color_GetHSBColor(context, hue, saturation, brightness): hue = Conversions.NumberValue(hue) saturation = Conversions.NumberValue(saturation) brightness = Conversions.NumberValue(brightness) if saturation == 0: r = g = b = int(brightness * 255) else: r = g = b = 0 h = (hue - int(hue)) * 6.0 f = h - int(h) p = brightness * (1.0 - saturation) q = brightness * (1.0 - saturation * f) t = brightness * (1.0 - (saturation * (1.0 - f))) h = int(h) if h == 0: r = int(brightness * 255) g = int(t * 255) b = int(p * 255) elif h == 1: r = int(q * 255) g = int(brightness * 255) b = int(p * 255) elif h == 2: r = int(p * 255) g = int(brightness * 255) b = int(t * 255) elif h == 3: r = int(p * 255) g = int(q * 255) b = int(brightness * 255) elif h == 4: r = int(t * 255) g = int(p * 255) b = int(brightness * 255) elif h == 5: r = int(brightness * 255) g = int(p * 255) b = int(q * 255) return 0xff000000L | (r << 16) | (g << 8) | (b << 0) def Java_Color_GetRed(context, color): color = Conversions.NumberValue(color) return (long(color) >> 16) & 0xff def Java_Color_GetGreen(context, color): color = Conversions.NumberValue(color) return (long(color) >> 8) & 0xff def Java_Color_GetBlue(context, color): color = Conversions.NumberValue(color) return long(color) & 0xff def Java_Integer_ToHexString(context, number): return '%X' % Conversions.NumberValue(number) ExtFunctions = { (JAVA_COLOR_NS, 'getHSBColor') : Java_Color_GetHSBColor, (JAVA_COLOR_NS, 'getRed') : Java_Color_GetRed, (JAVA_COLOR_NS, 'getGreen') : Java_Color_GetGreen, (JAVA_COLOR_NS, 'getBlue') : Java_Color_GetBlue, (JAVA_INTEGER_NS, 'toHexString') : Java_Integer_ToHexString, } def Test(tester): #FIXME: the numerics break under Python 2.3 source = test_harness.FileInfo(string=source_1) sheet = test_harness.FileInfo(string=sheet_1) test_harness.XsltTest(tester, source, [sheet], expected_1, extensionModules=[__name__]) return