<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blog.trivadis.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>XML Output</title><link>http://blog.trivadis.com/b/andreasmengel/default.aspx</link><description>In this blog I shall write about problems, solutions, and ideas we came across in projects when using XML for the production of visually appealing output.</description><dc:language /><generator>Telligent Community 5.6.583.24393 (Build: 5.6.583.24393)</generator><item><title>Migrating from Apache FOP 0.20.5 to  0.94 or 0.95 (beta)</title><link>http://blog.trivadis.com/b/andreasmengel/archive/2008/04/05/migrating-from-apache-0-20-5-to-fop-0-94-or-0-95-beta.aspx</link><pubDate>Sat, 05 Apr 2008 19:09:00 GMT</pubDate><guid isPermaLink="false">7f420732-9615-472e-9723-d9bd9f35b01c:571</guid><dc:creator>Andreas Mengel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.trivadis.com/b/andreasmengel/rsscomments.aspx?WeblogPostID=571</wfw:commentRss><comments>http://blog.trivadis.com/b/andreasmengel/archive/2008/04/05/migrating-from-apache-0-20-5-to-fop-0-94-or-0-95-beta.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Introduction&lt;/h3&gt; &lt;p&gt;At a customer project we have many PDF Reports we produce with TVDxORA and &lt;a href="http://xmlgraphics.apache.org/fop" target="_blank"&gt;Apache FOP&lt;/a&gt;, alas in version 0.20.5. Knowing, there are newer versions available, I recently migrated the existing reports&amp;#39; stylesheets to version 0.94 (they also work fine with version 0.95 beta which came out last month).&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Changes in the .fo-file&lt;/h3&gt; &lt;p&gt;The calls of the processor remain the same for my case, but I had to rewrite my XSLT-stylesheets. The following is what I had to change, the first item of the list below can also be found at the Apache FOP web site (&lt;a href="http://xmlgraphics.apache.org/fop/0.94/upgrading.html" title="Upgrading" target="_blank"&gt;upgrading&lt;/a&gt;). In order to find problematic regions in your stylesheets, it is handy to produce the .fo file first and to render it with Apache FOP afterwards, otherwise (using only one call for transformation and rendering) you won&amp;#39;t get line numbers for the spots that cause problems.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&amp;lt;fo:table-cell/&amp;gt; or &amp;lt;fo:table-cell&amp;gt;&amp;lt;/fo:table-cell&amp;gt; cannot be empty any more, you must have a &amp;lt;fo:block/&amp;gt; inside: &amp;lt;fo:table-cell&amp;gt;&amp;lt;fo:block/&amp;gt;&amp;lt;/fo:table-cell&amp;gt;&lt;/li&gt; &lt;li&gt;the order of &amp;lt;fo:region-before&amp;gt;, &amp;lt;fo:region-body&amp;gt;, &amp;lt;fo:region-after&amp;gt; matters now: &amp;lt;fo:region-body&amp;gt; must be the first element&lt;/li&gt; &lt;li&gt;when specifying attribute table-layout=&amp;quot;fixed&amp;quot; in &amp;lt;fo:table&amp;gt; you should also include width=&amp;quot;100%&amp;quot; to avoid warning messages of the processor&lt;/li&gt; &lt;li&gt;&amp;lt;fo:instream-foreign-object xmlns:svg=&amp;quot;&lt;a href="http://www.w3.org/2000/svg%22"&gt;http://www.w3.org/2000/svg&amp;quot;&lt;/a&gt;&amp;gt; must be included within an &amp;lt;fo:block&amp;gt; element now&lt;/li&gt; &lt;li&gt;cell, column and table borders have to be reviewed, in my case I had to change the level where I defined them&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Drawbacks&lt;/h3&gt; &lt;p&gt;The primary intention of upgrading the stylesheets for my project was to keep up-to-date with the actual release of FOP. Yet, at the moment I am not sure whether I shall recommend an upgrade of the FOP to 0.94 or 0.94 to my customer for the following reasons:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;there are no issues with the old version in production&lt;/li&gt; &lt;li&gt;the time for rendering the PDFs has increased by 60%&lt;/li&gt; &lt;li&gt;the size of the files has increased by 300%&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Any hints on that issue?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blog.trivadis.com/aggbug.aspx?PostID=571" width="1" height="1"&gt;</description><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/XSLT/default.aspx">XSLT</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/PDF/default.aspx">PDF</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/SVG/default.aspx">SVG</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/XSL_2D00_FO/default.aspx">XSL-FO</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/Apache+FOP/default.aspx">Apache FOP</category></item><item><title>Distributing an Odd Number of Elements Across a Structure preferring Even Numbers with XSLT</title><link>http://blog.trivadis.com/b/andreasmengel/archive/2008/03/19/distributing-an-odd-number-of-elements-across-a-structure-preferring-even-numbers-with-xslt.aspx</link><pubDate>Wed, 19 Mar 2008 21:32:00 GMT</pubDate><guid isPermaLink="false">7f420732-9615-472e-9723-d9bd9f35b01c:559</guid><dc:creator>Andreas Mengel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.trivadis.com/b/andreasmengel/rsscomments.aspx?WeblogPostID=559</wfw:commentRss><comments>http://blog.trivadis.com/b/andreasmengel/archive/2008/03/19/distributing-an-odd-number-of-elements-across-a-structure-preferring-even-numbers-with-xslt.aspx#comments</comments><description>&lt;p&gt;In an output management project we recently faced the problem that we wanted to distribute a given number of elements - odd or even - to a table-like structure of two named columns. As a table it would look like this:&lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt;a&lt;/td&gt; &lt;td&gt;&amp;nbsp;&amp;nbsp; b&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;c&lt;/td&gt; &lt;td&gt;&amp;nbsp;&amp;nbsp; d&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;e&lt;/td&gt; &lt;td&gt;&amp;nbsp;&amp;nbsp; d&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In XML we needed this kind of format:&lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;row&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;left_column&amp;gt;a&amp;lt;/left_column&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;right_column&amp;gt;b&amp;lt;/right_column&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/row&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;row&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;left_column&amp;gt;c&amp;lt;/left_column&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;right_column&amp;gt;d&amp;lt;/right_column&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/row&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;row&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;left_column&amp;gt;e&amp;lt;/left_column&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;right_column&amp;gt;f&amp;lt;/right_column&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/row&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;Suppose this would be our XML input file:&lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;sequence&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;item&amp;gt;a&amp;lt;/item&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;item&amp;gt;b&amp;lt;/item&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;item&amp;gt;c&amp;lt;/item&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;item&amp;gt;d&amp;lt;/item&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;item&amp;gt;e&amp;lt;/item&amp;gt;&lt;br /&gt;&amp;lt;/sequence&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;With this task you face the challenge that you need to determine the position of the actual item and write (and open or close) the appropriate element. &lt;/p&gt;&lt;p&gt;Thus, in a first attempt your XSLT would look like this&lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;xsl:for-each select=&amp;quot;item&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;position() mod&amp;nbsp; 2&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;&amp;lt;row&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;&amp;lt;left_column&amp;gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;&amp;lt;right_column&amp;gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;xsl:value-of select=&amp;quot;text()&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p&gt;and thus be invalid XSLT because the &amp;lt;row&amp;gt;, the &amp;lt;left_column&amp;gt; and the &amp;lt;right_column&amp;gt; elements are not closed inside their parent elements. What you have to do in order to overcome this problem is conceal the code by using CDATA tags.&lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;xsl:for-each select=&amp;quot;item&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;position() mod&amp;nbsp; 2&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;&amp;lt;row&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;left_column&amp;gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;&amp;lt;right_column&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;xsl:value-of select=&amp;quot;text()&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;At least your XSLT is valid now, but the XSLT processor might escape the output and print &amp;quot;&amp;lt;row&amp;gt;&amp;quot; as &amp;quot;&amp;amp;lt;row&amp;amp;gt;&amp;quot;. If you are unhappy with this, you need to disable output-escaping of the CDATA content by wrapping it into an &amp;lt;xsl:text&amp;gt; element with disable-output-escaping set to &amp;quot;no&amp;quot;.&lt;/p&gt; &lt;p&gt;So this is the resulting stylesheet:&lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;xsl:template match=&amp;quot;/sequence&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:for-each select=&amp;quot;item&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;position() mod&amp;nbsp; 2&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:text disable-output-escaping=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;row&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;left_column&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:text disable-output-escaping=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;right_column&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:value-of select=&amp;quot;text()&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;position() mod 2&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:text disable-output-escaping=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/left_column&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:if test=&amp;quot;position() = last()&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:text disable-output-escaping=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/row&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:text disable-output-escaping=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/right_column&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/row&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/table&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p&gt;The result is:&lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt;&lt;font face="Courier New"&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;row&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;left_column&amp;gt;a&amp;lt;/left_column&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;right_column&amp;gt;b&amp;lt;/right_column&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/row&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;row&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;left_column&amp;gt;c&amp;lt;/left_column&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;right_column&amp;gt;d&amp;lt;/right_column&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/row&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;row&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;left_column&amp;gt;e&amp;lt;/left_column&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/row&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blog.trivadis.com/aggbug.aspx?PostID=559" width="1" height="1"&gt;</description><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/XSLT/default.aspx">XSLT</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/XSL_2D00_FO/default.aspx">XSL-FO</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/OM/default.aspx">OM</category></item><item><title>Generating SVG Pie Charts in PDF Documents with XSLT and Apache FOP</title><link>http://blog.trivadis.com/b/andreasmengel/archive/2008/03/14/generating-svg-pie-charts-in-pdf-documents.aspx</link><pubDate>Fri, 14 Mar 2008 21:14:00 GMT</pubDate><guid isPermaLink="false">7f420732-9615-472e-9723-d9bd9f35b01c:552</guid><dc:creator>Andreas Mengel</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.trivadis.com/b/andreasmengel/rsscomments.aspx?WeblogPostID=552</wfw:commentRss><comments>http://blog.trivadis.com/b/andreasmengel/archive/2008/03/14/generating-svg-pie-charts-in-pdf-documents.aspx#comments</comments><description>&lt;p&gt;This article outlines how to draw a pretty print pie chart in a PDF document with XSLT and &lt;a href="http://xmlgraphics.apache.org/fop/" title="Apache FOP"&gt;Apache FOP&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;u&gt;Background&lt;/u&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;In some of our projects with TVDxORA (a lightweight web reporting framework) we produce PDF, some of them populated with pie charts. Our input is XML - representing the result of a query - which is generated from the Oracle database. We transform this output with XSLT (inside the DB or outside with &lt;a href="http://xml.apache.org/xalan-j/"&gt;xalan-j&lt;/a&gt;) and produce an XSL-FO document which again is rendered to PDF by &lt;a href="http://xmlgraphics.apache.org/fop/" title="Apache FOP"&gt;Apache FOP&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Having SVGs embedded in PDF gives you high quality graphical output: Opening the PDF you can&lt;/p&gt; &lt;ul&gt; &lt;li&gt;zoom in without loosing quality  &lt;/li&gt;&lt;li&gt;copy parts of the document or graphic to another application at the resolution level you desire, either by zooming in as much as you wish or by setting the resolution to a fixed dpi value (Preferences -&amp;gt; Page Display -&amp;gt; Custom Resolution in Adobe Reader 8).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;u&gt;&lt;b&gt;SVG and PDF&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;In general - using Apache FOP - it is relatively easy to produce drawings from XML since you can embed SVG (&lt;a href="http://www.w3.org/Graphics/SVG/"&gt;Scalable Vector Graphics&lt;/a&gt;) within an fo:instream-foreign-object element (cf. example):&lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp; &amp;lt;fo:instream-foreign-object&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;svg:svg width=&amp;quot;8&amp;quot; height=&amp;quot;8&amp;quot; viewBox=&amp;quot;0 0 8 8&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;svg:rect stroke=&amp;quot;black&amp;quot; stroke-width=&amp;quot;0.5&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;8&amp;quot; &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;height=&amp;quot;8&amp;quot; fill=&amp;quot;orangered&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/svg:svg&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/fo:instream-foreign-object&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;u&gt;Challenges&lt;/u&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;The tricky thing is the pie chart itself. Whereas drawing bar-charts is rather simple and straigh forward, there is no &amp;quot;pie-command&amp;quot; or &amp;quot;slice-instruction&amp;quot; in SVG that lets you just enter the coordinate and no further preparation is required. You rather have to draw each individual slice yourself. &lt;/p&gt; &lt;p&gt;On the &lt;a href="http://wiki.scribus.net/index.php/Making_a_Pie_Chart"&gt;Making a pie chart&lt;/a&gt; page the general aspects of how to draw arcs and basic trigonometric aspects are introduced.&lt;/p&gt; &lt;p align="left"&gt;This is where I started. Yet, I had to do it in XSLT and I wanted to start at 12 o&amp;#39;clock. And I used XSLT 1.0. this meant I needed a recursive template. The general idea is that I start with the last (clockwise) and smallest segment, draw the full circle in the color of that segment, then go to the last but one, draw a filled arc with an angle of 360° minus the last segment, then the last but two with 360° minus the sum of the previous two, and so on.&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blog.trivadis.com/blogs/andreasmengel/WindowsLiveWriter/GeneratingSVGPieChartsinPDFdocuments_12FA2/pie_2.png"&gt;&lt;img src="http://blog.trivadis.com/blogs/andreasmengel/WindowsLiveWriter/GeneratingSVGPieChartsinPDFdocuments_12FA2/pie_thumb.png" style="border-width:0px;" alt="pie" border="0" height="244" width="240" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;As one can see, I also added some figures and in case the angle of the slice becomes too narrow, I draw a line and add the statistical detail outside the pie.&lt;/p&gt; &lt;p&gt;The FO-code of one of these arcs looks like this. For reasons of convenience I rounded figures in the box below:&lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;lt;svg:svg width=&amp;quot;300&amp;quot; height=&amp;quot;300&amp;quot; viewBox=&amp;quot;0 0 500 500&amp;quot;&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:path stroke=&amp;quot;black&amp;quot; stroke-width=&amp;quot;1&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; fill=&amp;quot;blueviolet&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d=&amp;quot;M 200,200 l 0,-150 a150,150 0 1,1 -0.019,0.000 z&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:path stroke=&amp;quot;black&amp;quot; stroke-width=&amp;quot;1&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; fill=&amp;quot;none&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d=&amp;quot;M 195.964,80.067 L 194.451,35.093 H 184.451&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:text text-anchor=&amp;quot;end&amp;quot; font-size=&amp;quot;8&amp;quot; x=&amp;quot;183.451&amp;quot; y=&amp;quot;36.093&amp;quot;&amp;gt;1.07&amp;lt;/svg:text&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:path stroke=&amp;quot;black&amp;quot; stroke-width=&amp;quot;1&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; fill=&amp;quot;lightgreen&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d=&amp;quot;M 200,200 l 0,-150 a150,150 0 1,1 -10.080,0.339 z&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:text text-anchor=&amp;quot;middle&amp;quot; font-size=&amp;quot;8&amp;quot; x=&amp;quot;178.351&amp;quot; y=&amp;quot;81.968&amp;quot;&amp;gt;3.63&amp;lt;/svg:text&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:path stroke=&amp;quot;black&amp;quot; stroke-width=&amp;quot;1&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; fill=&amp;quot;yellow&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d=&amp;quot;M 200,200 l 0,-150 a150,150 0 1,1 -43.680,6.500 z&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:text text-anchor=&amp;quot;middle&amp;quot; font-size=&amp;quot;8&amp;quot; x=&amp;quot;101.236&amp;quot; y=&amp;quot;131.840&amp;quot;&amp;gt;21.37&amp;lt;/svg:text&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:path stroke=&amp;quot;black&amp;quot; stroke-width=&amp;quot;1&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; fill=&amp;quot;cornflowerblue&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d=&amp;quot;M 200,200 l 0,-150 a150,150 0 1,1 -149.661,160.075 z&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:text text-anchor=&amp;quot;middle&amp;quot; font-size=&amp;quot;8&amp;quot; x=&amp;quot;145.671&amp;quot; y=&amp;quot;306.997&amp;quot;&amp;gt;32.91&amp;lt;/svg:text&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:path stroke=&amp;quot;black&amp;quot; stroke-width=&amp;quot;1&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; fill=&amp;quot;orangered&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d=&amp;quot;M 200,200 l 0,-150 a150,150 0 0,1 80.176,276.774 z&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;nbsp; &amp;lt;svg:text text-anchor=&amp;quot;middle&amp;quot; font-size=&amp;quot;8&amp;quot; x=&amp;quot;315.259&amp;quot; y=&amp;quot;166.603&amp;quot;&amp;gt;41.03&amp;lt;/svg:text&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;lt;/svg:svg&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;This would be the XML input for two companies i.e. pie charts:&lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;ROWSET&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ROW&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;P2&amp;gt;company a&amp;lt;/P2&amp;gt;&amp;lt;P14&amp;gt;192&amp;lt;/P14&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ROW&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;P2&amp;gt;company a&amp;lt;/P2&amp;gt;&amp;lt;P14&amp;gt;154&amp;lt;/P14&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ROW&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;P2&amp;gt;company a&amp;lt;/P2&amp;gt;&amp;lt;P14&amp;gt;100&amp;lt;/P14&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ROW&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;P2&amp;gt;company a&amp;lt;/P2&amp;gt;&amp;lt;P14&amp;gt;17&amp;lt;/P14&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ROW&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;P2&amp;gt;company a&amp;lt;/P2&amp;gt;&amp;lt;P14&amp;gt;5&amp;lt;/P14&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ROW&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;P2&amp;gt;company b&amp;lt;/P2&amp;gt;&amp;lt;P14&amp;gt;200&amp;lt;/P14&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ROW&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;P2&amp;gt;company b&amp;lt;/P2&amp;gt;&amp;lt;P14&amp;gt;175&amp;lt;/P14&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ROW&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;P2&amp;gt;company b&amp;lt;/P2&amp;gt;&amp;lt;P14&amp;gt;89&amp;lt;/P14&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ROW&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;P2&amp;gt;company b&amp;lt;/P2&amp;gt;&amp;lt;P14&amp;gt;88&amp;lt;/P14&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ROW&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;P2&amp;gt;company b&amp;lt;/P2&amp;gt;&amp;lt;P14&amp;gt;10&amp;lt;/P14&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ROW&amp;gt;&lt;br /&gt;&amp;lt;/ROWSET&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;And this is the XSLT code fragment: &lt;/p&gt; &lt;table cellpadding="2" cellspacing="0"&gt;  &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;&lt;/font&gt;&lt;a href="http://www.w3.org/1999/XSL/Transform%22"&gt;&lt;font face="Courier New" size="1"&gt;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="1"&gt; xmlns:fo=&amp;quot;&lt;/font&gt;&lt;a href="http://www.w3.org/1999/XSL/Format%22"&gt;&lt;font face="Courier New" size="1"&gt;http://www.w3.org/1999/XSL/Format&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="1"&gt; xmlns:svg=&amp;quot;&lt;/font&gt;&lt;a href="http://www.w3.org/2000/svg%22"&gt;&lt;font face="Courier New" size="1"&gt;http://www.w3.org/2000/svg&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="1"&gt; xmlns:math=&amp;quot;xalan://java.lang.Math&amp;quot; extension-element-prefixes=&amp;quot;math&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;xsl:output method=&amp;quot;xml&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:call-template name=&amp;quot;pie_chart&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;xsl:template name=&amp;quot;pie_chart&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- draw the pie for every company--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:for-each select=&amp;quot;/ROWSET/ROW[preceding-sibling::ROW[1]/P2/text() != P2/text() or position() = 1]&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;company_name&amp;quot; select=&amp;quot;P2/text()&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;no_products&amp;quot; select=&amp;quot;count(//ROW[P2/text()=$company_name])&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;fo:block space-before=&amp;quot;2cm&amp;quot; text-align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;fo:instream-foreign-object xmlns:svg=&amp;quot;&lt;/font&gt;&lt;a href="http://www.w3.org/2000/svg%22"&gt;&lt;font face="Courier New" size="1"&gt;http://www.w3.org/2000/svg&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="1"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--set the display--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;svg:svg&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;width&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;300&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;height&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;300&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;viewBox&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;&amp;#39;0 0 500 500&amp;#39;&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--call the template starting at the last slice--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:call-template name=&amp;quot;pie_chart_slice&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;company_name&amp;quot; select=&amp;quot;$company_name&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;sum&amp;quot; select=&amp;quot;sum(//ROW[P2/text()=$company_name]/P14/text())&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;position&amp;quot; select=&amp;quot;$no_products&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;no_products&amp;quot; select=&amp;quot;$no_products&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;middle_x&amp;quot; select=&amp;quot;200&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;middle_y&amp;quot; select=&amp;quot;200&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;move_x&amp;quot; select=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;radius&amp;quot; select=&amp;quot;150&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/svg:svg&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/fo:instream-foreign-object&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/fo:block&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;xsl:template name=&amp;quot;pie_chart_slice&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:param name=&amp;quot;company_name&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:param name=&amp;quot;sum&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:param name=&amp;quot;position&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:param name=&amp;quot;no_products&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:param name=&amp;quot;middle_x&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:param name=&amp;quot;middle_y&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:param name=&amp;quot;move_x&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:param name=&amp;quot;radius&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--prepare the middle part of the arc command--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;middle&amp;quot; select=&amp;quot;concat(&amp;#39;M&amp;#39;,&amp;#39; &amp;#39;,$middle_x,&amp;#39;,&amp;#39;,$middle_y)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;part&amp;quot; select=&amp;quot;sum(//ROW[P2/text()=$company_name][position() &amp;amp;lt;= $position]/P14/text())&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;angle&amp;quot; select=&amp;quot;($part div $sum) * 360&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;x&amp;quot; select=&amp;quot;math:sin(3.1415292 * $angle div 180.0) * $radius&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;y&amp;quot; select=&amp;quot;math:cos(3.1415292 * $angle div 180.0) * $radius&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;move_y&amp;quot; select=&amp;quot;-$radius&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;first_line&amp;quot; select=&amp;quot;concat(&amp;#39;l&amp;#39;,&amp;#39; &amp;#39;,$move_x,&amp;#39;,&amp;#39;,$move_y)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;arc_move1&amp;quot; select=&amp;quot;&amp;#39;0&amp;#39;&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;arc_move2&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--check the direction of the arc: inward or outward--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$angle &amp;amp;lt;=180&amp;quot;&amp;gt;0&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:otherwise&amp;gt;1&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;arc_move3&amp;quot; select=&amp;quot;&amp;#39;1&amp;#39;&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;arc_move&amp;quot; select=&amp;quot;concat($arc_move1,&amp;#39; &amp;#39;,$arc_move2,&amp;#39;,&amp;#39;,$arc_move3)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;d&amp;quot; select=&amp;quot;concat($middle,&amp;#39; &amp;#39;,$first_line,&amp;#39; &amp;#39;,&amp;#39;a150,150&amp;#39;,&amp;#39; &amp;#39;,$arc_move,&amp;#39; &amp;#39;,$x,&amp;#39;,&amp;#39;,$radius - $y,&amp;#39; &amp;#39;,&amp;#39;z&amp;#39;)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--put it all together--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;svg:path stroke=&amp;quot;black&amp;quot; stroke-width=&amp;quot;1&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;fill&amp;quot;&amp;gt;&amp;lt;xsl:call-template name=&amp;quot;giveColor&amp;quot;&amp;gt;&amp;lt;xsl:with-param name=&amp;quot;i&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;$position&amp;quot;/&amp;gt;&amp;lt;/xsl:with-param&amp;gt;&amp;lt;/xsl:call-template&amp;gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;d&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;$d&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/svg:path&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--now the percentage--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;percentage&amp;quot; select=&amp;quot;format-number(( //ROW[P2/text()=$company_name][position() = $position]/P14/text() div sum(//ROW[P2/text()=$company_name]/P14/text()) ) * 100,&amp;#39;###,###0.00&amp;#39;)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;part_half&amp;quot; select=&amp;quot;format-number(( //ROW[P2/text()=$company_name][position() = $position]/P14/text() div sum(//ROW[P2/text()=$company_name]/P14/text()) ) div 2 * 360,&amp;#39;###,###0.00&amp;#39;)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;text_x&amp;quot; select=&amp;quot;math:sin(3.1415292 * (($angle - $part_half ) div 180.0)) * ($radius * 0.8)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;text_y&amp;quot; select=&amp;quot;math:cos(3.1415292 * (($angle - $part_half ) div 180.0)) * ($radius * 0.8)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;text_line_x&amp;quot; select=&amp;quot;math:sin(3.1415292 * (($angle - $part_half ) div 180.0)) * ($radius * 1.1)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:variable name=&amp;quot;text_line_y&amp;quot; select=&amp;quot;math:cos(3.1415292 * (($angle - $part_half ) div 180.0)) * ($radius * 1.1)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--we either put it on the cream or have a line pointing into the slice--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$percentage &amp;gt;= 3&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--on the cream--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;svg:text text-anchor=&amp;quot;middle&amp;quot; font-size=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;x&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;$middle_x + $text_x&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;y&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;$middle_y - $text_y&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:value-of select=&amp;quot;$percentage&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/svg:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--extra line pointing into the slice--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;svg:path stroke=&amp;quot;black&amp;quot; stroke-width=&amp;quot;1&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;fill&amp;quot;&amp;gt;none&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;d&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;concat(&amp;#39;M&amp;#39;,&amp;#39; &amp;#39;, $middle_x + $text_x,&amp;#39;,&amp;#39;,$middle_y - $text_y,&amp;#39; &amp;#39;,&amp;#39;L&amp;#39;,&amp;#39; &amp;#39;,$middle_x + $text_line_x,&amp;#39;,&amp;#39;,$middle_y - $text_line_y,&amp;#39; &amp;#39;,&amp;#39;H&amp;#39;,&amp;#39; &amp;#39;,$middle_x + $text_line_x - 10)&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/svg:path&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;svg:text text-anchor=&amp;quot;end&amp;quot; font-size=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;x&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;$middle_x + $text_line_x - 11 &amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name=&amp;quot;y&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;$middle_y - $text_line_y + 1&amp;quot;/&amp;gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:value-of select=&amp;quot;$percentage&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/svg:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--loop until we reach the first part--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:if test=&amp;quot;$position &amp;gt; 1&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:call-template name=&amp;quot;pie_chart_slice&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;company_name&amp;quot; select=&amp;quot;$company_name&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;sum&amp;quot; select=&amp;quot;$sum&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;position&amp;quot; select=&amp;quot;$position - 1&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;no_products&amp;quot; select=&amp;quot;$no_products&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;middle_x&amp;quot; select=&amp;quot;$middle_x&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;middle_y&amp;quot; select=&amp;quot;$middle_y&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;move_x&amp;quot; select=&amp;quot;$move_x&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name=&amp;quot;radius&amp;quot; select=&amp;quot;$radius&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;xsl:template name=&amp;quot;giveColor&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:param name=&amp;quot;i&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=1&amp;quot;&amp;gt;orangered&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=2&amp;quot;&amp;gt;cornflowerblue&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=3&amp;quot;&amp;gt;yellow&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=4&amp;quot;&amp;gt;lightgreen&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=5&amp;quot;&amp;gt;blueviolet&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=6&amp;quot;&amp;gt;chartreuse&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=7&amp;quot;&amp;gt;deepskyblue&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=8&amp;quot;&amp;gt;lightbrown&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=9&amp;quot;&amp;gt;aquamarine&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=10&amp;quot;&amp;gt;pink&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=11&amp;quot;&amp;gt;cornflowerblue&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=12&amp;quot;&amp;gt;lightyellow&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=13&amp;quot;&amp;gt;burlywood&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=14&amp;quot;&amp;gt;cornflowerblue&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:when test=&amp;quot;$i=15&amp;quot;&amp;gt;cornsilk&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:otherwise&amp;gt;black&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;For the different colors I just used a lookup template that provides up to 15 distinct colors, which should be enough in most cases, however, one could add more colors or just use a modulo operation in order to repeat that sequence in case the number of slices is greater that 15.&lt;br /&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blog.trivadis.com/aggbug.aspx?PostID=552" width="1" height="1"&gt;</description><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/XML/default.aspx">XML</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/XSLT/default.aspx">XSLT</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/PDF/default.aspx">PDF</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/SVG/default.aspx">SVG</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/XSL_2D00_FO/default.aspx">XSL-FO</category><category domain="http://blog.trivadis.com/b/andreasmengel/archive/tags/Apache+FOP/default.aspx">Apache FOP</category></item></channel></rss>