[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: SVG charts and graphs from XML input
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: <xsql:query xmlns:xsql="urn:oracle-xsql connection="demo"> select ename, sal from dept </xsql:query> Which under the covers produces a dynamic XML doc like: <?xml version = '1.0'?> <ROWSET> <ROW num="1"> <ENAME>CLARK</ENAME> <SAL>2450</SAL> </ROW> <ROW num="2"> <ENAME>KING</ENAME> <SAL>3900</SAL> </ROW> <ROW num="3"> <ENAME>MILLER</ENAME> <SAL>1300</SAL> </ROW> </ROWSET> 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. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:Color="http://www.oracle.com/XSL/Transform/java/java.awt.Color" xmlns:Integer="http://www.oracle.com/XSL/Transform/java/java.lang.Integer" exclude-result-prefixes="Color Integer"> <xsl:output standalone="yes" doctype-system="svg-19990812.dtd" media-type="image/svg"/> <xsl:template match="/"> <svg xml:space="preserve" width="1000" height="1000"> <desc>Salary Chart</desc> <g style="stroke:#000000;stroke-width:1;font-family:Arial;font-size:16"> <xsl:for-each select="ROWSET/ROW"> <xsl:call-template name="drawBar"> <xsl:with-param name="rowIndex" select="position()"/> <xsl:with-param name="ename" select="ENAME"/> <xsl:with-param name="sal" select="number(SAL)"/> </xsl:call-template> </xsl:for-each> </g> </svg> </xsl:template> <xsl:template name="drawBar"> <xsl:param name="rowIndex" select="number(0)"/> <xsl:param name="ename"/> <xsl:param name="sal" select="number(0)"/> <xsl:variable name="xOffset" select="number(100)"/> <xsl:variable name="yOffset" select="number(20)"/> <xsl:variable name="barHeight" select="number(25)"/> <xsl:variable name="gap" select="number(10)"/> <xsl:variable name="x" select="$xOffset"/> <xsl:variable name="y" select="$yOffset + $rowIndex * ($barHeight + $gap)"/> <xsl:variable name="barWidth" select="$sal div number(10)"/> <rect x="{$x}" y="{$y}" height="{$barHeight}" width="{$barWidth}"> <xsl:attribute name="style"> <xsl:text>fill:#</xsl:text> <xsl:call-template name="getCoolColorStr"> <xsl:with-param name="colorIndex" select="$rowIndex"/> <xsl:with-param name="totalColors" select="number(14)"/> </xsl:call-template> <xsl:text> </xsl:text> </xsl:attribute> </rect> <xsl:variable name="fontHeight" select="number(18)"/> <text x="20" y="{$y + $fontHeight}"> <xsl:value-of select="$ename"/> </text> <xsl:variable name="x2" select="$xOffset + $barWidth + 10"/> <text x="{$x2}" y="{$y + $fontHeight}"> <xsl:value-of select="$sal"/> </text> </xsl:template> <xsl:template name="getCoolColorStr"> <xsl:param name="colorIndex"/> <xsl:param name="totalColors"/> <xsl:variable name="SATURATION" select="number(0.6)"/> <xsl:variable name="BRIGHTNESS" select="number(0.9)"/> <xsl:variable name="hue" select="$colorIndex div $totalColors"/> <xsl:variable name="c" select="Color:getHSBColor($hue, $SATURATION, $BRIGHTNESS)"/> <xsl:variable name="r" select="Color:getRed($c)"/> <xsl:variable name="g" select="Color:getGreen($c)"/> <xsl:variable name="b" select="Color:getBlue($c)"/> <xsl:variable name="rs" select="Integer:toHexString($r)"/> <xsl:variable name="gs" select="Integer:toHexString($g)"/> <xsl:variable name="bs" select="Integer:toHexString($b)"/> <xsl:if test="$r < 16">0</xsl:if><xsl:value-of select="$rs"/> <xsl:if test="$g < 16">0</xsl:if><xsl:value-of select="$gs"/> <xsl:if test="$b < 16">0</xsl:if><xsl:value-of select="$bs"/> </xsl:template> </xsl:stylesheet> __________________________________________________________ Steve Muench, Lead XML Evangelist / Consulting Product Mgr Oracle Corp, Business Components for Java Development Team http://technet.oracle.com/tech/xml ----- Original Message ----- From: "Jon Smirl" <jonsmirl@xxxxxxxxxxxx> To: "XSLList" <xsl-list@xxxxxxxxxxxxxxxx> Sent: Saturday, March 04, 2000 5:29 PM Subject: SVG charts and graphs from XML input | Has anyone tried writing a stylesheet to generate SVG charts and graphs from | XML input? | | This might make a good class assignment; plus I'd like to see the results. | The SVGViewer at IBM alphaworks can be used to check the images. | | Jon Smirl | jonsmirl@xxxxxxxxxxxx | | | | XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list | XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|