[bknr-cvs] r1985 - in branches/xml-class-rework/projects/bos: . statistics
bknr at bknr.net
bknr at bknr.net
Sat Oct 14 06:59:37 UTC 2006
Author: hhubner
Date: 2006-10-14 02:59:35 -0400 (Sat, 14 Oct 2006)
New Revision: 1985
Added:
branches/xml-class-rework/projects/bos/statistics/
branches/xml-class-rework/projects/bos/statistics/Makefile
branches/xml-class-rework/projects/bos/statistics/buildSVGLineChart.xsl
branches/xml-class-rework/projects/bos/statistics/contracts-by-week-2005.svg
branches/xml-class-rework/projects/bos/statistics/contracts-by-week-2006.svg
branches/xml-class-rework/projects/bos/statistics/contracts-by-week.lxsl
branches/xml-class-rework/projects/bos/statistics/contracts-by-week.xml
branches/xml-class-rework/projects/bos/statistics/contracts-by-week.xsl
branches/xml-class-rework/projects/bos/statistics/loop-compiler.xslt
Log:
Generate SVG charts from statistical data.
Added: branches/xml-class-rework/projects/bos/statistics/Makefile
===================================================================
--- branches/xml-class-rework/projects/bos/statistics/Makefile 2006-09-24 19:13:31 UTC (rev 1984)
+++ branches/xml-class-rework/projects/bos/statistics/Makefile 2006-10-14 06:59:35 UTC (rev 1985)
@@ -0,0 +1,21 @@
+
+BASE_URL = http://192.168.254.132:8080/reports-xml
+YEAR = 2005
+LOGIN = ?__username=hans&__password=ognep
+
+GRAPHICS = contracts-by-week.svg
+
+all:
+ $(MAKE) graphics YEAR=2005
+ $(MAKE) graphics YEAR=2006
+
+graphics: $(GRAPHICS)
+
+.SUFFIXES: .lxsl .xsl .svg
+
+.lxsl.xsl:
+ xsltproc -o $@ loop-compiler.xslt $*.lxsl
+
+.xsl.svg:
+ xsltproc -o $*.xml $*.xsl '$(BASE_URL)/$*/$(YEAR)$(LOGIN)'
+ xsltproc -o $*-$(YEAR).svg buildSVGLineChart.xsl $*.xml
\ No newline at end of file
Property changes on: branches/xml-class-rework/projects/bos/statistics/Makefile
___________________________________________________________________
Name: svn:executable
+ *
Name: svn:eol-style
+ native
Added: branches/xml-class-rework/projects/bos/statistics/buildSVGLineChart.xsl
===================================================================
--- branches/xml-class-rework/projects/bos/statistics/buildSVGLineChart.xsl 2006-09-24 19:13:31 UTC (rev 1984)
+++ branches/xml-class-rework/projects/bos/statistics/buildSVGLineChart.xsl 2006-10-14 06:59:35 UTC (rev 1985)
@@ -0,0 +1,827 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xlink="http://www.w3.org/2000/xlink/namespace/"
+ version="1.0">
+ <xsl:output omit-xml-declaration="yes"/>
+ <xsl:template match="/graphData">
+ <xsl:variable name="max">
+ <xsl:value-of select="maxy"/>
+ </xsl:variable>
+ <xsl:variable name="min">
+ <xsl:value-of select="miny"/>
+ </xsl:variable>
+ <xsl:variable name="maxy2">
+ <xsl:value-of select="maxy2"/>
+ </xsl:variable>
+ <xsl:variable name="miny2">
+ <xsl:value-of select="miny2"/>
+ </xsl:variable>
+ <xsl:variable name="maxx">
+ <xsl:value-of select="maxx"/>
+ </xsl:variable>
+ <xsl:variable name="minx">
+ <xsl:value-of select="minx"/>
+ </xsl:variable>
+ <svg width="1200" height="1200" onload="getSVGDoc(evt)" onzoom="ZoomControl()">
+ <defs>
+ <g id="star" transform="scale(0.21)">
+ <polyline points="48,16,16,96,96,48,0,48,80,96">
+ </polyline>
+ </g>
+ <g id="triangle" transform="scale(0.7)">
+ <path id="Triangle" d="M 0 25 L 10 15 L 20 25 z" style="stroke:none"/>
+ </g>
+ <g id="square" transform="scale(1)">
+ <rect width="18" height="18">
+ </rect>
+ </g>
+ <g id="rectangle" transform="scale(1)">
+ <rect width="7" height="22">
+ </rect>
+ </g>
+ <script type="text/javascript">
+ <![CDATA[
+ /* this code was largely reused from the excellent website SVG - Learning by Coding (http://svglbc.datenverdrahten.de/) */
+ var svgdoc,svgroot;
+ function getSVGDoc(load_evt)
+ {
+ svgdoc=load_evt.target.ownerDocument;
+ svgroot=svgdoc.documentElement;
+
+ texte=svgdoc.getElementById("tooltip").getElementsByTagName("text");
+ }
+ function ShowTooltip(mousemove_event,txt)
+ {
+ var ttrelem,tttelem,posx,posy,curtrans,ctx,cty,txt;
+ var sollbreite,maxbreite,ges,anz,tmp,txl,neu,i,k,l
+ ttrelem=svgdoc.getElementById("ttr");
+ tttelem=svgdoc.getElementById("ttt");
+ posx=mousemove_event.clientX;
+ posy=mousemove_event.clientY;
+ for(i=1;i<=5;i++)texte.item(i).firstChild.data="";
+ sollbreite=150;
+ tttelem.childNodes.item(0).data=txt;
+ ges=tttelem.getComputedTextLength();
+ tttelem.childNodes.item(0).data="";
+ anz=Math.ceil(ges/sollbreite);
+ tmp=txt.split(" ");
+ txl=new Array(tmp.length);
+ neu=new Array(anz);
+ for(i=0;i<tmp.length;i++)
+ {
+ tttelem.childNodes.item(0).data=tmp[i];
+ txl[i]=tttelem.getComputedTextLength();
+ }
+ k=0;
+ maxbreite=0;
+ for(i=0;i<anz;i++)
+ {
+ l=0,neu[i]="";
+ while(l+txl[k]<1.1*sollbreite && k<tmp.length)
+ {
+ l+=txl[k];
+ neu[i]+=tmp[k]+" ";
+ k++;
+ if(maxbreite<l)maxbreite=l;
+ }
+ }
+ curtrans=svgroot.currentTranslate;
+ ctx=curtrans.x;
+ cty=curtrans.y;
+ ttrelem.setAttribute("x",posx-ctx+10);
+ ttrelem.setAttribute("y",posy-cty-20+10);
+ ttrelem.setAttribute("width",maxbreite+2*(maxbreite-sollbreite)+40);
+ ttrelem.setAttribute("height",anz*15+3);
+ ttrelem.setAttribute("style","fill: #FFC; stroke: #000; stroke-width: 0.5px");
+ for(i=1;i<=anz;i++)
+ {
+ texte.item(i).firstChild.data=neu[i-1];
+ texte.item(i).setAttribute("x",posx-ctx+15);
+ texte.item(i).setAttribute("y",parseInt(i-1)*15+posy-cty+3);
+ texte.item(i).setAttribute("style","fill: #00C; font-size: 11px");
+ }
+ svgdoc.getElementById("tooltip").style.setProperty("visibility","visible");
+ }
+ function HideTooltip()
+ {
+ svgdoc.getElementById("tooltip").style.setProperty("visibility","hidden");
+ }
+ function ZoomControl()
+ {
+ var curzoom;
+ curzoom=svgroot.currentScale;
+ svgdoc.getElementById("tooltip").setAttribute("transform","scale("+1/curzoom+")");
+ }
+ ]]>
+ </script>
+ </defs>
+ <g transform="translate(150,50) scale(0.5)">
+ <!--Heading-->
+ <text x="5" y="-40" text-anchor="left" font-weight="bolder"
+ font-size="40" fill="maroon" text-decoration="underline">
+ <xsl:value-of select="title"/>
+ </text>
+ <!--Caption (Vertical)-->
+ <g transform="translate(-220, 80) rotate(270, 0, 0)">
+ <text x="0" y="0" text-anchor="middle" font-weight="bolder"
+ font-size="36" fill="black">
+ <xsl:value-of select="ytitle"/>
+ </text>
+ </g>
+ <g transform="translate(1220, 80) rotate(90, 0, 0)">
+ <text x="0" y="0" text-anchor="middle" font-weight="bolder"
+ font-size="36" fill="black">
+ <xsl:value-of select="y2title"/>
+ </text>
+ </g>
+ <!--Caption (Horizontal)-->
+ <text x="1070" y="1000" font-size="36" font-weight="bolder" fill="black">
+ <xsl:value-of select="xtitle"/>
+ </text>
+ <!-- Now Draw the main X and Y axis -->
+ <g style="stroke-width:5; stroke:black">
+ <!-- X Axis -->
+ <path d="M 0 1000 L 1000 1000 Z"/>
+ <!-- Y Axis -->
+ <path d="M 0 0 L 0 1000 Z"/>
+ <xsl:if test="y2axis='true'">
+ <!-- Y2 Axis -->
+ <path d="M 1000 0 L 1000 1000 Z"/>
+ </xsl:if>
+ </g>
+ <xsl:for-each select="sets/set">
+ <!-- display the x-axis labels -->
+ <g style="stroke:red; stroke-width: 3; fill:black; stroke:none ;font-size:24; text-anchor:middle">
+ <xsl:for-each select="measure[xlabel]">
+ <!-- for all measures with an xlabel -->
+ <xsl:call-template name="xlabel">
+ <xsl:with-param name="xvalue" select="xvalue"/>
+ <xsl:with-param name="xlabel" select="xlabel"/>
+ <xsl:with-param name="minx" select="$minx"/>
+ <xsl:with-param name="maxx" select="$maxx"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:for-each select="../../xvalues/xvalue">
+ <!-- for all (explicit) xvalues -->
+ <xsl:call-template name="xlabel">
+ <xsl:with-param name="xvalue" select="value"/>
+ <xsl:with-param name="xlabel" select="label"/>
+ <xsl:with-param name="minx" select="$minx"/>
+ <xsl:with-param name="maxx" select="$maxx"/>
+ <xsl:with-param name="gridline" select="gridline"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </g>
+ <xsl:for-each select="../../xvalues/xmarkers">
+ <!-- draw y-markers on the vertical axis -->
+ <xsl:call-template name="xmarker">
+ <xsl:with-param name="start" select="minvalue"/>
+ <xsl:with-param name="n" select="steps"/>
+ <xsl:with-param name="stepsize"
+ select="(maxvalue - minvalue) div steps"/>
+ <xsl:with-param name="min" select="$minx"/>
+ <xsl:with-param name="max" select="$maxx"/>
+ <xsl:with-param name="gridline" select="gridline"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <!-- end of x-axis markers, labels and vertical grid-lines -->
+ <!-- create the y-axis markers -->
+ <xsl:for-each select="measure[ylabel]">
+ <!-- for all measures with an ylabel -->
+ <xsl:call-template name="ylabel">
+ <xsl:with-param name="yvalue" select="yvalue"/>
+ <xsl:with-param name="ylabel" select="ylabel"/>
+ <xsl:with-param name="min" select="$min"/>
+ <xsl:with-param name="max" select="$max"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:for-each select="../../yvalues/yvalue">
+ <!-- for all (explicit) yvalues -->
+ <xsl:call-template name="ylabel">
+ <xsl:with-param name="yvalue" select="value"/>
+ <xsl:with-param name="ylabel" select="label"/>
+ <xsl:with-param name="min" select="$min"/>
+ <xsl:with-param name="max" select="$max"/>
+ <xsl:with-param name="gridline" select="gridline"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:for-each select="../../yvalues/ymarkers">
+ <!-- draw y-markers on the vertical axis -->
+ <xsl:call-template name="ymarker">
+ <xsl:with-param name="start" select="minvalue"/>
+ <xsl:with-param name="n" select="steps"/>
+ <xsl:with-param name="stepsize"
+ select="(maxvalue - minvalue) div steps"/>
+ <xsl:with-param name="min" select="$min"/>
+ <xsl:with-param name="max" select="$max"/>
+ <xsl:with-param name="gridline" select="gridline"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <!-- end of y-axis markers, labels and horizontal grid-lines -->
+ <!-- create the y2-axis markers -->
+ <xsl:for-each select="measure[y2label]">
+ <!-- for all measures with an ylabel -->
+ <xsl:call-template name="ylabel">
+ <xsl:with-param name="yvalue" select="y2value"/>
+ <xsl:with-param name="ylabel" select="y2label"/>
+ <xsl:with-param name="min" select="$miny2"/>
+ <xsl:with-param name="max" select="$maxy2"/>
+ <xsl:with-param name="axis" select="2"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:for-each select="../../y2values/y2value">
+ <!-- for all (explicit) yvalues -->
+ <xsl:call-template name="ylabel">
+ <xsl:with-param name="yvalue" select="value"/>
+ <xsl:with-param name="ylabel" select="label"/>
+ <xsl:with-param name="min" select="$miny2"/>
+ <xsl:with-param name="max" select="$maxy2"/>
+ <xsl:with-param name="gridline" select="gridline"/>
+ <xsl:with-param name="axis" select="2"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:for-each select="../../y2values/y2markers">
+ <!-- draw y-markers on the vertical axis -->
+ <xsl:call-template name="ymarker">
+ <xsl:with-param name="start" select="minvalue"/>
+ <xsl:with-param name="n" select="steps"/>
+ <xsl:with-param name="stepsize"
+ select="(maxvalue - minvalue) div steps"/>
+ <xsl:with-param name="min" select="$miny2"/>
+ <xsl:with-param name="max" select="$maxy2"/>
+ <xsl:with-param name="gridline" select="gridline"/>
+ <xsl:with-param name="axis" select="2"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <!-- end of y2-axis markers, labels and horizontal grid-lines -->
+
+ <!-- go and draw the line of the chart itself -->
+ <g stylet="stroke:red; stroke-width: 3; fill : none;">
+ <xsl:attribute name="style">
+ stroke:<xsl:value-of select="@color"/>;stroke-width: 3; fill : none;
+ </xsl:attribute>
+ <!-- instead of a polyline, make a line from the previous to each new point -->
+ <xsl:for-each select="measure">
+ <xsl:variable name="x">
+ <xsl:value-of select=" 1000* ((xvalue - ($minx)) div ($maxx - $minx))"/>
+ </xsl:variable>
+ <xsl:variable name="y">
+ <xsl:choose>
+ <xsl:when test="yvalue">
+ <xsl:value-of select="1000 - 1000* ((yvalue - ($min)) div ($max - $min))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="1000 - 1000* ((y2value - ($miny2)) div ($maxy2 - $miny2))"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="not(../@showline='false')">
+ <xsl:if test="(position() > 1)">
+ <line>
+ <xsl:attribute name="x1">
+ <xsl:value-of select=" 1000* ((preceding-sibling::measure[position()=1]/xvalue - ($minx)) div ($maxx - $minx))"/>
+ </xsl:attribute>
+ <xsl:attribute name="y1">
+ <xsl:choose>
+ <xsl:when test="yvalue">
+ <xsl:value-of select="1000 - 1000* ((preceding-sibling::measure[position()=1]/yvalue - ($min)) div ($max - $min))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="1000 - 1000* ((preceding-sibling::measure[position()=1]/y2value - ($miny2)) div ($maxy2 - $miny2))"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="x2">
+ <xsl:value-of select="$x"/>
+ </xsl:attribute>
+ <xsl:attribute name="y2">
+ <xsl:value-of select="$y"/>
+ </xsl:attribute>
+ </line>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="xgrid = 'true'">
+ <xsl:call-template name="gridline">
+ <xsl:with-param name="x1" select="$x"/>
+ <xsl:with-param name="y1" select="$y"/>
+ <xsl:with-param name="type">vertical</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="ygrid = 'true'">
+ <xsl:call-template name="gridline">
+ <xsl:with-param name="x1" select="$x"/>
+ <xsl:with-param name="y1" select="$y"/>
+ <xsl:with-param name="type">horizontal</xsl:with-param>
+ <xsl:with-param name="yaxis">
+ <xsl:choose>
+ <xsl:when test="yvalue">1</xsl:when>
+ <xsl:otherwise>2</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:for-each> <!-- measure -->
+ </g>
+ </xsl:for-each> <!-- sets -->
+ <!-- now again traverse all measures to place markers and create annotations;
+ by doing this in a second go, we ensure (according to the 'painters algoritm'
+ (see: http://wiki.svg.org/index.php/ChangingDrawingOrder)) that the annotations
+ and markers are on top of everything else.
+ -->
+ <xsl:for-each select="sets/set">
+ <xsl:for-each select="measure">
+ <xsl:variable name="x">
+ <xsl:value-of select=" 1000* ((xvalue - ($minx)) div ($maxx - $minx))"/>
+ </xsl:variable>
+ <xsl:variable name="y">
+ <xsl:choose>
+ <xsl:when test="yvalue">
+ <xsl:value-of select="1000 - 1000* ((yvalue - ($min)) div ($max - $min))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="1000 - 1000* ((y2value - ($miny2)) div ($maxy2 - $miny2))"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <g >
+ <xsl:attribute name="style">stroke:<xsl:value-of select="../@color"/> stroke-width: 3; fill : none;</xsl:attribute>
+ <!-- draw a marker -->
+ <xsl:call-template name="marker">
+ <xsl:with-param name="x" select="$x"/>
+ <xsl:with-param name="y" select="$y"/>
+ <xsl:with-param name="label" select="label"/>
+ <xsl:with-param name="marker" select="../@marker-type"/>
+ <xsl:with-param name="color" select="../@color"/>
+ </xsl:call-template>
+ <xsl:if test="annotation">
+ <!-- currently the annotation is written before the line ; that means that the line will cover the annotation -->
+ <xsl:call-template name="annotation">
+ <xsl:with-param name="x" select="$x"/>
+ <xsl:with-param name="y" select="$y"/>
+ <xsl:with-param name="annotation" select="annotation"/>
+ </xsl:call-template>
+ </xsl:if>
+ </g>
+ </xsl:for-each> <!-- measures in set -->
+ </xsl:for-each> <!-- sets -->
+ <!-- legend per set -->
+ <g id="legend" style="fill:lavenderblush;stroke-width:2;stroke:black" transform="translate(1080,500)">
+ <!-- Tooltip - Beginn (ttr=Tooltip-Rechteck, ttt=Tooltip-Text) -->
+ <rect id="legend" x="0" y="0" rx="5" ry="5" width="200" >
+ <xsl:attribute name="height"><xsl:value-of select="29+ 20* count(sets/set)"/></xsl:attribute>
+ </rect>
+ <text x="10" y="15" style="text-decoration:underline;stroke-width:1;stroke:black;fill:black">Legend:</text>
+ <xsl:for-each select="sets/set">
+ <xsl:call-template name="marker">
+ <xsl:with-param name="x">15</xsl:with-param>
+ <xsl:with-param name="y" select="7+20*(position())"/>
+ <xsl:with-param name="label" select="title"/>
+ <xsl:with-param name="marker" select="@marker-type"/>
+ <xsl:with-param name="color" select="@color"/>
+ </xsl:call-template>
+ <text x="27">
+ <xsl:attribute name="y"><xsl:value-of select="15+20*(position())"/></xsl:attribute>
+ <xsl:attribute name="style">stroke-width:1;stroke:<xsl:value-of select="@color" />;fill:<xsl:value-of select="@color" /></xsl:attribute>
+ <xsl:value-of select="@title"/>
+ </text>
+ </xsl:for-each>
+ </g>
+
+ </g>
+ <g id="tooltip" style="visibility: hidden">
+ <!-- Tooltip - Beginn (ttr=Tooltip-Rechteck, ttt=Tooltip-Text) -->
+ <rect id="ttr" x="0" y="0" rx="5" ry="5" width="100" height="16"/>
+ <text id="ttt" x="0" y="0" style="visibility: hidden">dyn. Text</text>
+ <text x="-10" y="-10">dyn. Text</text>
+ <text x="-10" y="-10">dyn. Text</text>
+ <text x="-10" y="-10">dyn. Text</text>
+ <text x="-10" y="-10">dyn. Text</text>
+ <text x="-10" y="-10">dyn. Text</text>
+ </g>
+ <!-- Tooltip - Ende -->
+ </svg>
+ </xsl:template>
+ <xsl:template name="xlabel">
+ <xsl:param name="xvalue"/>
+ <xsl:param name="maxx"/>
+ <xsl:param name="minx"/>
+ <xsl:param name="xlabel"/>
+ <xsl:param name="gridline"/>
+ <g>
+ <xsl:attribute name="transform">rotate(315,
+
+
+ <xsl:value-of select="1000* (($xvalue - ($minx)) div ($maxx - $minx))"/>
+
+
+,1014)</xsl:attribute>
+ <text y="1014" style="text-anchor:end">
+ <xsl:attribute name="x">
+ <xsl:value-of select="1000* (($xvalue - ($minx)) div ($maxx - $minx))"/>
+ </xsl:attribute>
+ <xsl:value-of select="$xlabel"/>
+ </text>
+ </g>
+ <xsl:if test="$gridline = 'true'">
+ <xsl:call-template name="gridline">
+ <xsl:with-param name="x1">
+ <xsl:value-of select="1000* (($xvalue - ($minx)) div ($maxx - $minx))"/>
+ </xsl:with-param>
+ <xsl:with-param name="y1">0</xsl:with-param>
+ <xsl:with-param name="type">vertical</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+ <!-- xlabel -->
+ <xsl:template name="ylabel">
+ <xsl:param name="yvalue"/>
+ <xsl:param name="max"/>
+ <xsl:param name="min"/>
+ <xsl:param name="ylabel"/>
+ <xsl:param name="gridline"/>
+ <xsl:param name="axis">1</xsl:param>
+ <g id="ylabel">
+ <xsl:attribute name="transform">rotate(<xsl:value-of select="325 + ($axis - 1) * -300 "/>, <xsl:value-of select="-10 + ($axis - 1) * 1020 "/>,
+
+
+ <xsl:value-of select="1000-1000* (($yvalue - ($min)) div ($max - $min))"/>
+
+ )</xsl:attribute>
+ <text x="-10" >
+ <xsl:attribute name="style">text-anchor:
+ <xsl:choose>
+ <xsl:when test="$axis=1">end</xsl:when>
+ <xsl:otherwise>start</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="x">
+ <xsl:value-of select="-10 + ($axis - 1) * 1020 "/>
+ </xsl:attribute>
+ <xsl:attribute name="y">
+ <xsl:value-of select="1000 - 1000* (($yvalue - ($min)) div ($max - $min))"/>
+ </xsl:attribute>
+ <xsl:value-of select="$ylabel"/>
+ </text>
+ </g>
+ <xsl:if test="$gridline = 'true'">
+ <xsl:call-template name="gridline">
+ <xsl:with-param name="y1">
+ <xsl:value-of select="1000 - 1000* (($yvalue - ($min)) div ($max - $min))"/>
+ </xsl:with-param>
+ <xsl:with-param name="x1"><xsl:value-of select="1000- 1000*($axis -1 )" /></xsl:with-param>
+ <xsl:with-param name="type">horizontal</xsl:with-param>
+ <xsl:with-param name="yaxis"><xsl:value-of select="$axis" /></xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+ <!-- ylabel -->
+ <xsl:template name="annotation">
+ <xsl:param name="x"/>
+ <xsl:param name="y"/>
+ <xsl:param name="annotation"/>
+ <!-- display an annotation -->
+ <g style="stroke-width:1;stroke:blue">
+ <xsl:variable name="height">
+ <xsl:value-of select="8+16*round(string-length($annotation) div 25)"/>
+ </xsl:variable>
+ <xsl:variable name="y_anno">
+ <xsl:choose>
+ <xsl:when test="$y < 300">-150</xsl:when>
+ <xsl:otherwise>150</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="line_y">
+ <xsl:choose>
+ <xsl:when test="$y < 300"><xsl:value-of select="-40+ $y - $y_anno + 0.35* $height" /></xsl:when>
+ <xsl:otherwise><xsl:value-of select="-40+ $y - $y_anno + 0.65* $height"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <line>
+ <!-- vertical line either upwards (default) or downwards (for the over the 70% of max values -->
+ <xsl:attribute name="x1">
+ <xsl:value-of select="$x"/>
+ </xsl:attribute>
+ <xsl:attribute name="y1">
+ <xsl:value-of select="$y"/>
+ </xsl:attribute>
+ <xsl:attribute name="x2">
+ <xsl:value-of select="$x"/>
+ </xsl:attribute>
+ <xsl:attribute name="y2">
+ <xsl:value-of select="$line_y "/>
+ </xsl:attribute>
+ </line>
+ <line>
+ <!-- horizontal line to right (default) or left (for the over 80% of max x values -->
+ <xsl:attribute name="x1">
+ <xsl:value-of select="$x"/>
+ </xsl:attribute>
+ <xsl:attribute name="y1">
+ <xsl:value-of select="$line_y "/>
+ </xsl:attribute>
+ <xsl:attribute name="x2">
+ <xsl:choose>
+ <xsl:when test="$x > 750"><xsl:value-of select="-7+$x"/></xsl:when>
+ <xsl:otherwise><xsl:value-of select="7+$x"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="y2">
+ <xsl:value-of select="$line_y"/>
+ </xsl:attribute>
+ </line>
+ <rect width="210" style="fill:lightyellow" >
+ <!-- box to hold the annotation; starts at the horizontal line and extends to the right (default) or left (for over 80% of max x value -->
+ <xsl:attribute name="height">
+ <xsl:value-of select="$height"/>
+ </xsl:attribute>
+ <xsl:attribute name="x">
+ <xsl:choose>
+ <xsl:when test="$x > 750"><xsl:value-of select="-7+$x -210"/></xsl:when>
+ <xsl:otherwise><xsl:value-of select="7+$x"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="y">
+ <xsl:value-of select="-40+$y - $y_anno"/>
+ </xsl:attribute>
+ </rect>
+ <!-- we may need to split the text in multiple lines; our annotation textbox has a width of 40 which means around 17 characters??-->
+ <xsl:call-template name="annotationLine">
+ <xsl:with-param name="x" select="$x"/>
+ <xsl:with-param name="y" select="$y - $y_anno"/>
+ <xsl:with-param name="annotation" select="$annotation"/>
+ <xsl:with-param name="line">1</xsl:with-param>
+ </xsl:call-template>
+ </g>
+ </xsl:template>
+ <xsl:template name="marker">
+ <xsl:param name="x"/>
+ <xsl:param name="y"/>
+ <xsl:param name="label"/>
+ <xsl:param name="marker">circle</xsl:param>
+ <xsl:param name="color">red</xsl:param>
+ <g onmouseout="HideTooltip(evt)" transform="scale(1)">
+ <xsl:attribute name="style">
+ stroke:<xsl:value-of select="$color"/>;fill:<xsl:value-of select="$color"/>
+ </xsl:attribute>
+ <xsl:attribute name="onmouseover">
+ ShowTooltip(evt,'<xsl:value-of select="$label"/>')
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="$marker='square'">
+ <use xlink:href="#square">
+ <xsl:attribute name="x">
+ <xsl:value-of select="$x -9"/>
+ </xsl:attribute>
+ <xsl:attribute name="y">
+ <xsl:value-of select="$y -9"/>
+ </xsl:attribute>
+ </use>
+ </xsl:when>
+ <xsl:when test="$marker='triangle'">
+ <use xlink:href="#triangle">
+ <xsl:attribute name="x">
+ <xsl:value-of select="$x -9"/>
+ </xsl:attribute>
+ <xsl:attribute name="y">
+ <xsl:value-of select="$y -9"/>
+ </xsl:attribute>
+ </use>
+ </xsl:when>
+ <xsl:when test="$marker='rectangle'">
+ <use xlink:href="#rectangle">
+ <xsl:attribute name="x">
+ <xsl:value-of select="$x -4"/>
+ </xsl:attribute>
+ <xsl:attribute name="y">
+ <xsl:value-of select="$y -4"/>
+ </xsl:attribute>
+ </use>
+ </xsl:when>
+ <xsl:when test="$marker='star'">
+ <use xlink:href="#star">
+ <xsl:attribute name="x">
+ <xsl:value-of select="$x -9"/>
+ </xsl:attribute>
+ <xsl:attribute name="y">
+ <xsl:value-of select="$y -9"/>
+ </xsl:attribute>
+ </use>
+ </xsl:when>
+ <xsl:when test="$marker='diamond'">
+ <!-- diamond is just a square rotated about its own center for 45 degrees -->
+ <use xlink:href="#square">
+ <xsl:attribute name="x">
+ <xsl:value-of select="$x -9"/>
+ </xsl:attribute>
+ <xsl:attribute name="y">
+ <xsl:value-of select="$y -9"/>
+ </xsl:attribute>
+ <xsl:attribute name="transform">
+ rotate(45,<xsl:value-of select="$x"/>,<xsl:value-of select="$y "/>)
+ </xsl:attribute>
+ </use>
+ </xsl:when>
+ <xsl:when test="$marker='circle'">
+ <circle r="9">
+ <xsl:attribute name="cx">
+ <xsl:value-of select="$x"/>
+ </xsl:attribute>
+ <xsl:attribute name="cy">
+ <xsl:value-of select="$y"/>
+ </xsl:attribute>
+ </circle>
+ </xsl:when>
+ <xsl:when test="$marker='smallcircle'">
+ <circle r="4">
+ <xsl:attribute name="cx">
+ <xsl:value-of select="$x"/>
+ </xsl:attribute>
+ <xsl:attribute name="cy">
+ <xsl:value-of select="$y"/>
+ </xsl:attribute>
+ </circle>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+ </g>
+ </xsl:template>
+ <xsl:template name="xmarker">
+ <xsl:param name="n"/>
+ <xsl:param name="i">0</xsl:param>
+ <xsl:param name="stepsize"/>
+ <xsl:param name="min"/>
+ <xsl:param name="max"/>
+ <xsl:param name="gridline">false</xsl:param>
+ <xsl:param name="start">
+ <xsl:value-of select="$min"/>
+ </xsl:param>
+ <xsl:variable name="x">
+ <xsl:value-of select="1000* (($start + $i* $stepsize - $min) div ($max - $min))"/>
+ </xsl:variable>
+ <line y1="1000" y2="985">
+ <xsl:attribute name="x1">
+ <xsl:value-of select="$x"/>
+ </xsl:attribute>
+ <xsl:attribute name="x2">
+ <xsl:value-of select="$x"/>
+ </xsl:attribute>
+ </line>
+ <xsl:call-template name="xlabel">
+ <xsl:with-param name="xvalue" select="$start + $i* $stepsize"/>
+ <xsl:with-param name="xlabel">
+ <xsl:value-of select="round($i * $stepsize +$start)"/>
+"</xsl:with-param>
+ <xsl:with-param name="minx" select="$min"/>
+ <xsl:with-param name="maxx" select="$max"/>
+ </xsl:call-template>
+ <xsl:if test="$gridline = 'true'">
+ <xsl:call-template name="gridline">
+ <xsl:with-param name="y1">0</xsl:with-param>
+ <xsl:with-param name="x1" select="$x"/>
+ <xsl:with-param name="type">vertical</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$i < $n">
+ <xsl:call-template name="xmarker">
+ <xsl:with-param name="i" select="$i+1"/>
+ <xsl:with-param name="n" select="$n"/>
+ <xsl:with-param name="stepsize" select="$stepsize"/>
+ <xsl:with-param name="min" select="$min"/>
+ <xsl:with-param name="max" select="$max"/>
+ <xsl:with-param name="start" select="$start"/>
+ <xsl:with-param name="gridline" select="$gridline"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+ <!-- end of xmarker -->
+ <xsl:template name="ymarker">
+ <xsl:param name="n"/>
+ <xsl:param name="i">0</xsl:param>
+ <xsl:param name="stepsize"/>
+ <xsl:param name="min"/>
+ <xsl:param name="max"/>
+ <xsl:param name="gridline">false</xsl:param>
+ <xsl:param name="start">
+ <xsl:value-of select="$min"/>
+ </xsl:param>
+ <xsl:param name="axis">1</xsl:param>
+ <xsl:variable name="y">
+ <xsl:value-of select="1000 - 1000* (($start + $i* $stepsize - $min) div ($max - $min))"/>
+ </xsl:variable>
+ <xsl:value-of select="$i"/>
+ <line x1="0" x2="18">
+ <xsl:attribute name="y1">
+ <xsl:value-of select="$y"/>
+ </xsl:attribute>
+ <xsl:attribute name="y2">
+ <xsl:value-of select="$y"/>
+ </xsl:attribute>
+ </line>
+ <text x="-20">
+ <xsl:attribute name="x">
+ <xsl:value-of select="-20 + 1030*($axis -1)"/>
+ </xsl:attribute>
+ <xsl:attribute name="style">text-anchor:
+ <xsl:choose>
+ <xsl:when test="$axis=1">end</xsl:when>
+ <xsl:otherwise>start</xsl:otherwise>
+ </xsl:choose>
+ ;font-size:
+ <xsl:choose>
+ <xsl:when test="$i=$n">40</xsl:when>
+ <xsl:when test="$i=0">40</xsl:when>
+ <xsl:otherwise>20</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="y">
+ <xsl:value-of select="$y +5"/>
+ </xsl:attribute>
+ <xsl:value-of select="round($i * $stepsize +$start)"/>
+ </text>
+ <xsl:if test="$gridline = 'true'">
+ <xsl:call-template name="gridline">
+ <xsl:with-param name="x1"><xsl:value-of select="1000 - 1000*( $axis -1)"/></xsl:with-param>
+ <xsl:with-param name="y1" select="$y"/>
+ <xsl:with-param name="type">horizontal</xsl:with-param>
+ <xsl:with-param name="yaxis"><xsl:value-of select="$axis"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$i < $n">
+ <xsl:call-template name="ymarker">
+ <xsl:with-param name="i" select="$i+1"/>
+ <xsl:with-param name="n" select="$n"/>
+ <xsl:with-param name="stepsize" select="$stepsize"/>
+ <xsl:with-param name="min" select="$min"/>
+ <xsl:with-param name="max" select="$max"/>
+ <xsl:with-param name="start" select="$start"/>
+ <xsl:with-param name="gridline" select="$gridline"/>
+ <xsl:with-param name="axis" select="$axis"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+ <!-- ymarker -->
+ <xsl:template name="gridline">
+ <xsl:param name="x1"/>
+ <xsl:param name="y1"/>
+ <xsl:param name="type"/>
+ <xsl:param name="yaxis">1</xsl:param>
+ <line style="fill:none; stroke:#B0B0B0; stroke-width:2; stroke-dasharray:2 4">
+ <xsl:attribute name="x1">
+ <xsl:value-of select="$x1"/>
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="$type='horizontal'">
+ <xsl:attribute name="x2"><xsl:value-of select="($yaxis -1)* 1000 "/></xsl:attribute>
+ <xsl:attribute name="y2">
+ <xsl:value-of select="$y1"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="y2">1000</xsl:attribute>
+ <xsl:attribute name="x2">
+ <xsl:value-of select="$x1"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:attribute name="y1">
+ <xsl:value-of select="$y1"/>
+ </xsl:attribute>
+ </line>
+ </xsl:template>
+ <!-- gridline -->
+
+ <!-- write line in annotation box -->
+ <xsl:template name="annotationLine" >
+ <xsl:param name="x"/>
+ <xsl:param name="y"/>
+ <xsl:param name="annotation"/>
+ <xsl:param name="line">1</xsl:param>
+ <text font-size="16" fill="black">
+ <xsl:attribute name="text-anchor">
+ <xsl:choose>
+ <xsl:when test="$x > 750">end</xsl:when>
+ <xsl:otherwise>start</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="x">
+ <xsl:choose>
+ <xsl:when test="$x > 750"><xsl:value-of select="-10+$x"/></xsl:when>
+ <xsl:otherwise><xsl:value-of select="10+$x"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="y">
+ <xsl:value-of select="-25+$y +16*($line -1)"/>
+ </xsl:attribute>
+ <xsl:value-of select="substring($annotation,1,25)"/>
+ </text>
+ <xsl:if test="string-length($annotation) > 25">
+ <xsl:call-template name="annotationLine">
+ <xsl:with-param name="x" select="$x"/>
+ <xsl:with-param name="y" select="$y"/>
+ <xsl:with-param name="annotation" select="substring($annotation,26)"/>
+ <xsl:with-param name="line" select="$line+1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
Property changes on: branches/xml-class-rework/projects/bos/statistics/buildSVGLineChart.xsl
___________________________________________________________________
Name: svn:executable
+ *
Added: branches/xml-class-rework/projects/bos/statistics/contracts-by-week-2005.svg
===================================================================
--- branches/xml-class-rework/projects/bos/statistics/contracts-by-week-2005.svg 2006-09-24 19:13:31 UTC (rev 1984)
+++ branches/xml-class-rework/projects/bos/statistics/contracts-by-week-2005.svg 2006-10-14 06:59:35 UTC (rev 1985)
@@ -0,0 +1,75 @@
+<svg xmlns:xlink="http://www.w3.org/2000/xlink/namespace/" width="1200" height="1200" onload="getSVGDoc(evt)" onzoom="ZoomControl()"><defs><g id="star" transform="scale(0.21)"><polyline points="48,16,16,96,96,48,0,48,80,96"/></g><g id="triangle" transform="scale(0.7)"><path id="Triangle" d="M 0 25 L 10 15 L 20 25 z" style="stroke:none"/></g><g id="square" transform="scale(1)"><rect width="18" height="18"/></g><g id="rectangle" transform="scale(1)"><rect width="7" height="22"/></g><script type="text/javascript">
+
+ /* this code was largely reused from the excellent website SVG - Learning by Coding (http://svglbc.datenverdrahten.de/) */
+ var svgdoc,svgroot;
+ function getSVGDoc(load_evt)
+ {
+ svgdoc=load_evt.target.ownerDocument;
+ svgroot=svgdoc.documentElement;
+
+ texte=svgdoc.getElementById("tooltip").getElementsByTagName("text");
+ }
+ function ShowTooltip(mousemove_event,txt)
+ {
+ var ttrelem,tttelem,posx,posy,curtrans,ctx,cty,txt;
+ var sollbreite,maxbreite,ges,anz,tmp,txl,neu,i,k,l
+ ttrelem=svgdoc.getElementById("ttr");
+ tttelem=svgdoc.getElementById("ttt");
+ posx=mousemove_event.clientX;
+ posy=mousemove_event.clientY;
+ for(i=1;i<=5;i++)texte.item(i).firstChild.data="";
+ sollbreite=150;
+ tttelem.childNodes.item(0).data=txt;
+ ges=tttelem.getComputedTextLength();
+ tttelem.childNodes.item(0).data="";
+ anz=Math.ceil(ges/sollbreite);
+ tmp=txt.split(" ");
+ txl=new Array(tmp.length);
+ neu=new Array(anz);
+ for(i=0;i<tmp.length;i++)
+ {
+ tttelem.childNodes.item(0).data=tmp[i];
+ txl[i]=tttelem.getComputedTextLength();
+ }
+ k=0;
+ maxbreite=0;
+ for(i=0;i<anz;i++)
+ {
+ l=0,neu[i]="";
+ while(l+txl[k]<1.1*sollbreite && k<tmp.length)
+ {
+ l+=txl[k];
+ neu[i]+=tmp[k]+" ";
+ k++;
+ if(maxbreite<l)maxbreite=l;
+ }
+ }
+ curtrans=svgroot.currentTranslate;
+ ctx=curtrans.x;
+ cty=curtrans.y;
+ ttrelem.setAttribute("x",posx-ctx+10);
+ ttrelem.setAttribute("y",posy-cty-20+10);
+ ttrelem.setAttribute("width",maxbreite+2*(maxbreite-sollbreite)+40);
+ ttrelem.setAttribute("height",anz*15+3);
+ ttrelem.setAttribute("style","fill: #FFC; stroke: #000; stroke-width: 0.5px");
+ for(i=1;i<=anz;i++)
+ {
+ texte.item(i).firstChild.data=neu[i-1];
+ texte.item(i).setAttribute("x",posx-ctx+15);
+ texte.item(i).setAttribute("y",parseInt(i-1)*15+posy-cty+3);
+ texte.item(i).setAttribute("style","fill: #00C; font-size: 11px");
+ }
+ svgdoc.getElementById("tooltip").style.setProperty("visibility","visible");
+ }
+ function HideTooltip()
+ {
+ svgdoc.getElementById("tooltip").style.setProperty("visibility","hidden");
+ }
+ function ZoomControl()
+ {
+ var curzoom;
+ curzoom=svgroot.currentScale;
+ svgdoc.getElementById("tooltip").setAttribute("transform","scale("+1/curzoom+")");
+ }
+
+ </script></defs><g transform="translate(150,50) scale(0.5)"><text x="5" y="-40" text-anchor="left" font-weight="bolder" font-size="40" fill="maroon" text-decoration="underline">Contracts by week for year 2005</text><g transform="translate(-220, 80) rotate(270, 0, 0)"><text x="0" y="0" text-anchor="middle" font-weight="bolder" font-size="36" fill="black"></text></g><g transform="translate(1220, 80) rotate(90, 0, 0)"><text x="0" y="0" text-anchor="middle" font-weight="bolder" font-size="36" fill="black"></text></g><text x="1070" y="1000" font-size="36" font-weight="bolder" fill="black"></text><g style="stroke-width:5; stroke:black"><path d="M 0 1000 L 1000 1000 Z"/><path d="M 0 0 L 0 1000 Z"/></g><g style="stroke:red; stroke-width: 3; fill:black; stroke:none ;font-size:24; text-anchor:middle"/><g id="ylabel" transform="rotate(325, -10,
692.307692307692
)"><text x="-10" style="text-anchor:
end" y="692.307692307692">20</text></g><line style="fill:none; stroke:#B0B0B0; stroke-width:2; stroke-dasharray:2 4" x1="1000" x2="0" y2="692.307692307692" y1="692.307692307692"/><g id="ylabel" transform="rotate(325, -10,
384.615384615385
)"><text x="-10" style="text-anchor:
end" y="384.615384615385">40</text></g><line style="fill:none; stroke:#B0B0B0; stroke-width:2; stroke-dasharray:2 4" x1="1000" x2="0" y2="384.615384615385" y1="384.615384615385"/><g id="ylabel" transform="rotate(325, -10,
76.9230769230769
)"><text x="-10" style="text-anchor:
end" y="76.9230769230769">60</text></g><line style="fill:none; stroke:#B0B0B0; stroke-width:2; stroke-dasharray:2 4" x1="1000" x2="0" y2="76.9230769230769" y1="76.9230769230769"/><g stylet="stroke:red; stroke-width: 3; fill : none;" style="
stroke:green;stroke-width: 3; fill : none;
"><line x1="117.647058823529" y1="892.307692307692" x2="137.254901960784" y2="938.461538461538"/><line x1="137.254901960784" y1="938.461538461538" x2="156.862745098039" y2="184.615384615385"/><line x1="156.862745098039" y1="184.615384615385" x2="176.470588235294" y2="861.538461538462"/><line x1="176.470588235294" y1="861.538461538462" x2="196.078431372549" y2="923.076923076923"/><line x1="196.078431372549" y1="923.076923076923" x2="215.686274509804" y2="923.076923076923"/><line x1="215.686274509804" y1="923.076923076923" x2="235.294117647059" y2="876.923076923077"/><line x1="235.294117647059" y1="876.923076923077" x2="254.901960784314" y2="907.692307692308"/><line x1="254.901960784314" y1="907.692307692308" x2="274.509803921569" y2="938.461538461538"/><line x1="274.509803921569" y1="938.461538461538" x2="294.117647058824" y2="984.615384615385"/><line x1="294.117647058824" y1="984.615384615385" x2="313.725490196078" y2="876.923076923077"/><line x1="313.725490196078" y1="876.923076923077" x2="333.333333333333" y2="876.923076923077"/><line x1="333.333333333333" y1="876.923076923077" x2="352.941176470588" y2="876.923076923077"/><line x1="352.941176470588" y1="876.923076923077" x2="372.549019607843" y2="938.461538461538"/><line x1="372.549019607843" y1="938.461538461538" x2="392.156862745098" y2="784.615384615385"/><line x1="392.156862745098" y1="784.615384615385" x2="411.764705882353" y2="876.923076923077"/><line x1="411.764705882353" y1="876.923076923077" x2="431.372549019608" y2="923.076923076923"/><line x1="431.372549019608" y1="923.076923076923" x2="450.980392156863" y2="892.307692307692"/><line x1="450.980392156863" y1="892.307692307692" x2="470.588235294118" y2="938.461538461538"/><line x1="470.588235294118" y1="938.461538461538" x2="490.196078431373" y2="984.615384615385"/><line x1="490.196078431373" y1="984.615384615385" x2="509.803921568627" y2="923.076923076923"/><line x1="509.803921568627" y1="923.076923076923" x2="529.411764705882" y2="938.461538461538"/><line x1="529.411764705882" y1="938.461538461538" x2="568.627450980392" y2="984.615384615385"/><line x1="568.627450980392" y1="984.615384615385" x2="588.235294117647" y2="876.923076923077"/><line x1="588.235294117647" y1="876.923076923077" x2="607.843137254902" y2="892.307692307692"/><line x1="607.843137254902" y1="892.307692307692" x2="627.450980392157" y2="461.538461538462"/><line x1="627.450980392157" y1="461.538461538462" x2="647.058823529412" y2="707.692307692308"/><line x1="647.058823529412" y1="707.692307692308" x2="666.666666666667" y2="815.384615384615"/><line x1="666.666666666667" y1="815.384615384615" x2="686.274509803922" y2="923.076923076923"/><line x1="686.274509803922" y1="923.076923076923" x2="705.882352941176" y2="876.923076923077"/><line x1="705.882352941176" y1="876.923076923077" x2="725.490196078431" y2="953.846153846154"/><line x1="725.490196078431" y1="953.846153846154" x2="745.098039215686" y2="907.692307692308"/><line x1="745.098039215686" y1="907.692307692308" x2="764.705882352941" y2="876.923076923077"/><line x1="764.705882352941" y1="876.923076923077" x2="784.313725490196" y2="615.384615384615"/><line x1="784.313725490196" y1="615.384615384615" x2="803.921568627451" y2="784.615384615385"/><line x1="803.921568627451" y1="784.615384615385" x2="823.529411764706" y2="846.153846153846"/><line x1="823.529411764706" y1="846.153846153846" x2="843.137254901961" y2="861.538461538462"/><line x1="843.137254901961" y1="861.538461538462" x2="862.745098039216" y2="923.076923076923"/><line x1="862.745098039216" y1="923.076923076923" x2="882.352941176471" y2="830.769230769231"/><line x1="882.352941176471" y1="830.769230769231" x2="901.960784313726" y2="646.153846153846"/><line x1="901.960784313726" y1="646.153846153846" x2="921.56862745098" y2="630.769230769231"/><line x1="921.56862745098" y1="630.769230769231" x2="941.176470588235" y2="415.384615384615"/><line x1="941.176470588235" y1="415.384615384615" x2="960.78431372549" y2="246.153846153846"/><line x1="960.78431372549" y1="246.153846153846" x2="980.392156862745" y2="0"/><line x1="980.392156862745" y1="0" x2="1000" y2="876.923076923077"/></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="108.647058823529" y="883.307692307692"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="128.254901960784" y="929.461538461538"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="147.862745098039" y="175.615384615385"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="167.470588235294" y="852.538461538462"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="187.078431372549" y="914.076923076923"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="206.686274509804" y="914.076923076923"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="226.294117647059" y="867.923076923077"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="245.901960784314" y="898.692307692308"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="265.509803921569" y="929.461538461538"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="285.117647058824" y="975.615384615385"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="304.725490196078" y="867.923076923077"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="324.333333333333" y="867.923076923077"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="343.941176470588" y="867.923076923077"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="363.549019607843" y="929.461538461538"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="383.156862745098" y="775.615384615385"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="402.764705882353" y="867.923076923077"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="422.372549019608" y="914.076923076923"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="441.980392156863" y="883.307692307692"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="461.588235294118" y="929.461538461538"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="481.196078431373" y="975.615384615385"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="500.803921568627" y="914.076923076923"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="520.411764705882" y="929.461538461538"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="559.627450980392" y="975.615384615385"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="579.235294117647" y="867.923076923077"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="598.843137254902" y="883.307692307692"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="618.450980392157" y="452.538461538462"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="638.058823529412" y="698.692307692308"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="657.666666666667" y="806.384615384615"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="677.274509803922" y="914.076923076923"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="696.882352941176" y="867.923076923077"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="716.490196078431" y="944.846153846154"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="736.098039215686" y="898.692307692308"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="755.705882352941" y="867.923076923077"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="775.313725490196" y="606.384615384615"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="794.921568627451" y="775.615384615385"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="814.529411764706" y="837.153846153846"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="834.137254901961" y="852.538461538462"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="853.745098039216" y="914.076923076923"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="873.352941176471" y="821.769230769231"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="892.960784313726" y="637.153846153846"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="912.56862745098" y="621.769230769231"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="932.176470588235" y="406.384615384615"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="951.78431372549" y="237.153846153846"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="971.392156862745" y="-9"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="991" y="867.923076923077"/></g></g><g id="legend" style="fill:lavenderblush;stroke-width:2;stroke:black" transform="translate(1080,500)"><rect id="legend" x="0" y="0" rx="5" ry="5" width="200" height="49"/><text x="10" y="15" style="text-decoration:underline;stroke-width:1;stroke:black;fill:black">Legend:</text><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="6" y="18"/></g><text x="27" y="35" style="stroke-width:1;stroke:green;fill:green">Contracts</text></g></g><g id="tooltip" style="visibility: hidden"><rect id="ttr" x="0" y="0" rx="5" ry="5" width="100" height="16"/><text id="ttt" x="0" y="0" style="visibility: hidden">dyn. Text</text><text x="-10" y="-10">dyn. Text</text><text x="-10" y="-10">dyn. Text</text><text x="-10" y="-10">dyn. Text</text><text x="-10" y="-10">dyn. Text</text><text x="-10" y="-10">dyn. Text</text></g></svg>
Added: branches/xml-class-rework/projects/bos/statistics/contracts-by-week-2006.svg
===================================================================
--- branches/xml-class-rework/projects/bos/statistics/contracts-by-week-2006.svg 2006-09-24 19:13:31 UTC (rev 1984)
+++ branches/xml-class-rework/projects/bos/statistics/contracts-by-week-2006.svg 2006-10-14 06:59:35 UTC (rev 1985)
@@ -0,0 +1,75 @@
+<svg xmlns:xlink="http://www.w3.org/2000/xlink/namespace/" width="1200" height="1200" onload="getSVGDoc(evt)" onzoom="ZoomControl()"><defs><g id="star" transform="scale(0.21)"><polyline points="48,16,16,96,96,48,0,48,80,96"/></g><g id="triangle" transform="scale(0.7)"><path id="Triangle" d="M 0 25 L 10 15 L 20 25 z" style="stroke:none"/></g><g id="square" transform="scale(1)"><rect width="18" height="18"/></g><g id="rectangle" transform="scale(1)"><rect width="7" height="22"/></g><script type="text/javascript">
+
+ /* this code was largely reused from the excellent website SVG - Learning by Coding (http://svglbc.datenverdrahten.de/) */
+ var svgdoc,svgroot;
+ function getSVGDoc(load_evt)
+ {
+ svgdoc=load_evt.target.ownerDocument;
+ svgroot=svgdoc.documentElement;
+
+ texte=svgdoc.getElementById("tooltip").getElementsByTagName("text");
+ }
+ function ShowTooltip(mousemove_event,txt)
+ {
+ var ttrelem,tttelem,posx,posy,curtrans,ctx,cty,txt;
+ var sollbreite,maxbreite,ges,anz,tmp,txl,neu,i,k,l
+ ttrelem=svgdoc.getElementById("ttr");
+ tttelem=svgdoc.getElementById("ttt");
+ posx=mousemove_event.clientX;
+ posy=mousemove_event.clientY;
+ for(i=1;i<=5;i++)texte.item(i).firstChild.data="";
+ sollbreite=150;
+ tttelem.childNodes.item(0).data=txt;
+ ges=tttelem.getComputedTextLength();
+ tttelem.childNodes.item(0).data="";
+ anz=Math.ceil(ges/sollbreite);
+ tmp=txt.split(" ");
+ txl=new Array(tmp.length);
+ neu=new Array(anz);
+ for(i=0;i<tmp.length;i++)
+ {
+ tttelem.childNodes.item(0).data=tmp[i];
+ txl[i]=tttelem.getComputedTextLength();
+ }
+ k=0;
+ maxbreite=0;
+ for(i=0;i<anz;i++)
+ {
+ l=0,neu[i]="";
+ while(l+txl[k]<1.1*sollbreite && k<tmp.length)
+ {
+ l+=txl[k];
+ neu[i]+=tmp[k]+" ";
+ k++;
+ if(maxbreite<l)maxbreite=l;
+ }
+ }
+ curtrans=svgroot.currentTranslate;
+ ctx=curtrans.x;
+ cty=curtrans.y;
+ ttrelem.setAttribute("x",posx-ctx+10);
+ ttrelem.setAttribute("y",posy-cty-20+10);
+ ttrelem.setAttribute("width",maxbreite+2*(maxbreite-sollbreite)+40);
+ ttrelem.setAttribute("height",anz*15+3);
+ ttrelem.setAttribute("style","fill: #FFC; stroke: #000; stroke-width: 0.5px");
+ for(i=1;i<=anz;i++)
+ {
+ texte.item(i).firstChild.data=neu[i-1];
+ texte.item(i).setAttribute("x",posx-ctx+15);
+ texte.item(i).setAttribute("y",parseInt(i-1)*15+posy-cty+3);
+ texte.item(i).setAttribute("style","fill: #00C; font-size: 11px");
+ }
+ svgdoc.getElementById("tooltip").style.setProperty("visibility","visible");
+ }
+ function HideTooltip()
+ {
+ svgdoc.getElementById("tooltip").style.setProperty("visibility","hidden");
+ }
+ function ZoomControl()
+ {
+ var curzoom;
+ curzoom=svgroot.currentScale;
+ svgdoc.getElementById("tooltip").setAttribute("transform","scale("+1/curzoom+")");
+ }
+
+ </script></defs><g transform="translate(150,50) scale(0.5)"><text x="5" y="-40" text-anchor="left" font-weight="bolder" font-size="40" fill="maroon" text-decoration="underline">Contracts by week for year 2006</text><g transform="translate(-220, 80) rotate(270, 0, 0)"><text x="0" y="0" text-anchor="middle" font-weight="bolder" font-size="36" fill="black"></text></g><g transform="translate(1220, 80) rotate(90, 0, 0)"><text x="0" y="0" text-anchor="middle" font-weight="bolder" font-size="36" fill="black"></text></g><text x="1070" y="1000" font-size="36" font-weight="bolder" fill="black"></text><g style="stroke-width:5; stroke:black"><path d="M 0 1000 L 1000 1000 Z"/><path d="M 0 0 L 0 1000 Z"/></g><g style="stroke:red; stroke-width: 3; fill:black; stroke:none ;font-size:24; text-anchor:middle"/><g id="ylabel" transform="rotate(325, -10,
696.969696969697
)"><text x="-10" style="text-anchor:
end" y="696.969696969697">20</text></g><line style="fill:none; stroke:#B0B0B0; stroke-width:2; stroke-dasharray:2 4" x1="1000" x2="0" y2="696.969696969697" y1="696.969696969697"/><g id="ylabel" transform="rotate(325, -10,
393.939393939394
)"><text x="-10" style="text-anchor:
end" y="393.939393939394">40</text></g><line style="fill:none; stroke:#B0B0B0; stroke-width:2; stroke-dasharray:2 4" x1="1000" x2="0" y2="393.939393939394" y1="393.939393939394"/><g id="ylabel" transform="rotate(325, -10,
90.909090909091
)"><text x="-10" style="text-anchor:
end" y="90.909090909091">60</text></g><line style="fill:none; stroke:#B0B0B0; stroke-width:2; stroke-dasharray:2 4" x1="1000" x2="0" y2="90.909090909091" y1="90.909090909091"/><g stylet="stroke:red; stroke-width: 3; fill : none;" style="
stroke:green;stroke-width: 3; fill : none;
"><line x1="0" y1="787.878787878788" x2="19.6078431372549" y2="712.121212121212"/><line x1="19.6078431372549" y1="712.121212121212" x2="39.2156862745098" y2="60.6060606060605"/><line x1="39.2156862745098" y1="60.6060606060605" x2="58.8235294117647" y2="712.121212121212"/><line x1="58.8235294117647" y1="712.121212121212" x2="78.4313725490196" y2="848.484848484848"/><line x1="78.4313725490196" y1="848.484848484848" x2="98.0392156862745" y2="939.393939393939"/><line x1="98.0392156862745" y1="939.393939393939" x2="117.647058823529" y2="954.545454545455"/><line x1="117.647058823529" y1="954.545454545455" x2="137.254901960784" y2="939.393939393939"/><line x1="137.254901960784" y1="939.393939393939" x2="156.862745098039" y2="863.636363636364"/><line x1="156.862745098039" y1="863.636363636364" x2="176.470588235294" y2="696.969696969697"/><line x1="176.470588235294" y1="696.969696969697" x2="196.078431372549" y2="560.606060606061"/><line x1="196.078431372549" y1="560.606060606061" x2="215.686274509804" y2="787.878787878788"/><line x1="215.686274509804" y1="787.878787878788" x2="235.294117647059" y2="803.030303030303"/><line x1="235.294117647059" y1="803.030303030303" x2="254.901960784314" y2="742.424242424242"/><line x1="254.901960784314" y1="742.424242424242" x2="274.509803921569" y2="772.727272727273"/><line x1="274.509803921569" y1="772.727272727273" x2="294.117647058824" y2="954.545454545455"/><line x1="294.117647058824" y1="954.545454545455" x2="313.725490196078" y2="878.787878787879"/><line x1="313.725490196078" y1="878.787878787879" x2="333.333333333333" y2="893.939393939394"/><line x1="333.333333333333" y1="893.939393939394" x2="352.941176470588" y2="848.484848484848"/><line x1="352.941176470588" y1="848.484848484848" x2="372.549019607843" y2="772.727272727273"/><line x1="372.549019607843" y1="772.727272727273" x2="392.156862745098" y2="863.636363636364"/><line x1="392.156862745098" y1="863.636363636364" x2="411.764705882353" y2="575.757575757576"/><line x1="411.764705882353" y1="575.757575757576" x2="431.372549019608" y2="818.181818181818"/><line x1="431.372549019608" y1="818.181818181818" x2="450.980392156863" y2="878.787878787879"/><line x1="450.980392156863" y1="878.787878787879" x2="470.588235294118" y2="712.121212121212"/><line x1="470.588235294118" y1="712.121212121212" x2="490.196078431373" y2="772.727272727273"/><line x1="490.196078431373" y1="772.727272727273" x2="509.803921568627" y2="439.393939393939"/><line x1="509.803921568627" y1="439.393939393939" x2="529.411764705882" y2="757.575757575758"/><line x1="529.411764705882" y1="757.575757575758" x2="549.019607843137" y2="833.333333333333"/><line x1="549.019607843137" y1="833.333333333333" x2="568.627450980392" y2="909.090909090909"/><line x1="568.627450980392" y1="909.090909090909" x2="588.235294117647" y2="833.333333333333"/><line x1="588.235294117647" y1="833.333333333333" x2="607.843137254902" y2="818.181818181818"/><line x1="607.843137254902" y1="818.181818181818" x2="627.450980392157" y2="893.939393939394"/><line x1="627.450980392157" y1="893.939393939394" x2="647.058823529412" y2="848.484848484848"/><line x1="647.058823529412" y1="848.484848484848" x2="666.666666666667" y2="0"/><line x1="666.666666666667" y1="0" x2="686.274509803922" y2="878.787878787879"/><line x1="686.274509803922" y1="878.787878787879" x2="705.882352941176" y2="515.151515151515"/><line x1="705.882352941176" y1="515.151515151515" x2="725.490196078431" y2="803.030303030303"/><line x1="725.490196078431" y1="803.030303030303" x2="745.098039215686" y2="772.727272727273"/><line x1="745.098039215686" y1="772.727272727273" x2="764.705882352941" y2="757.575757575758"/><line x1="764.705882352941" y1="757.575757575758" x2="784.313725490196" y2="969.69696969697"/></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="-9" y="778.878787878788"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="10.6078431372549" y="703.121212121212"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="30.2156862745098" y="51.6060606060605"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="49.8235294117647" y="703.121212121212"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="69.4313725490196" y="839.484848484848"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="89.0392156862745" y="930.393939393939"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="108.647058823529" y="945.545454545455"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="128.254901960784" y="930.393939393939"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="147.862745098039" y="854.636363636364"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="167.470588235294" y="687.969696969697"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="187.078431372549" y="551.606060606061"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="206.686274509804" y="778.878787878788"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="226.294117647059" y="794.030303030303"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="245.901960784314" y="733.424242424242"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="265.509803921569" y="763.727272727273"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="285.117647058824" y="945.545454545455"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="304.725490196078" y="869.787878787879"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="324.333333333333" y="884.939393939394"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="343.941176470588" y="839.484848484848"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="363.549019607843" y="763.727272727273"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="383.156862745098" y="854.636363636364"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="402.764705882353" y="566.757575757576"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="422.372549019608" y="809.181818181818"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="441.980392156863" y="869.787878787879"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="461.588235294118" y="703.121212121212"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="481.196078431373" y="763.727272727273"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="500.803921568627" y="430.393939393939"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="520.411764705882" y="748.575757575758"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="540.019607843137" y="824.333333333333"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="559.627450980392" y="900.090909090909"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="579.235294117647" y="824.333333333333"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="598.843137254902" y="809.181818181818"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="618.450980392157" y="884.939393939394"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="638.058823529412" y="839.484848484848"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="657.666666666667" y="-9"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="677.274509803922" y="869.787878787879"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="696.882352941176" y="506.151515151515"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="716.490196078431" y="794.030303030303"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="736.098039215686" y="763.727272727273"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="755.705882352941" y="748.575757575758"/></g></g><g style="stroke:green stroke-width: 3; fill : none;"><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="775.313725490196" y="960.69696969697"/></g></g><g id="legend" style="fill:lavenderblush;stroke-width:2;stroke:black" transform="translate(1080,500)"><rect id="legend" x="0" y="0" rx="5" ry="5" width="200" height="49"/><text x="10" y="15" style="text-decoration:underline;stroke-width:1;stroke:black;fill:black">Legend:</text><g onmouseout="HideTooltip(evt)" transform="scale(1)" style="
stroke:green;fill:green" onmouseover="
ShowTooltip(evt,'')
"><use xlink:href="#triangle" x="6" y="18"/></g><text x="27" y="35" style="stroke-width:1;stroke:green;fill:green">Contracts</text></g></g><g id="tooltip" style="visibility: hidden"><rect id="ttr" x="0" y="0" rx="5" ry="5" width="100" height="16"/><text id="ttt" x="0" y="0" style="visibility: hidden">dyn. Text</text><text x="-10" y="-10">dyn. Text</text><text x="-10" y="-10">dyn. Text</text><text x="-10" y="-10">dyn. Text</text><text x="-10" y="-10">dyn. Text</text><text x="-10" y="-10">dyn. Text</text></g></svg>
Added: branches/xml-class-rework/projects/bos/statistics/contracts-by-week.lxsl
===================================================================
--- branches/xml-class-rework/projects/bos/statistics/contracts-by-week.lxsl 2006-09-24 19:13:31 UTC (rev 1984)
+++ branches/xml-class-rework/projects/bos/statistics/contracts-by-week.lxsl 2006-10-14 06:59:35 UTC (rev 1985)
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:loop="http://informatik.hu-berlin.de/loop">
+ <xsl:output method="xml"/>
+
+ <xsl:template match="/response">
+ <xsl:variable name="year">
+ <xsl:value-of select="substring(/response/week[1]/@key, 1, 4)"/>
+ </xsl:variable>
+ <xsl:variable name="max_contracts">
+ <xsl:for-each select="week">
+ <xsl:sort select="@contracts" data-type="number" order="descending"/>
+ <xsl:if test="position()=1"><xsl:value-of select="@contracts"/></xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <graphData>
+ <sets>
+ <set title="Contracts" marker-type="triangle" color="green">
+ <xsl:for-each select="week">
+ <measure>
+ <xvalue><xsl:value-of select="substring(@key, 6)"/></xvalue>
+ <yvalue><xsl:value-of select="@contracts"/></yvalue>
+ </measure>
+ </xsl:for-each>
+ </set>
+ </sets>
+ <minx>1</minx>
+ <maxx>52</maxx>
+ <miny>0</miny>
+ <maxy><xsl:value-of select="$max_contracts"/></maxy>
+ <title>Contracts by week for year <xsl:value-of select="$year"/></title>
+ <yvalues>
+ <loop:for name="i" from="20" to="$max_contracts" step="20">
+ <yvalue>
+ <value><xsl:value-of select="$i"/></value>
+ <label><xsl:value-of select="$i"/></label>
+ <gridline>true</gridline>
+ </yvalue>
+ </loop:for>
+ </yvalues>
+ </graphData>
+ </xsl:template>
+</xsl:stylesheet>
Property changes on: branches/xml-class-rework/projects/bos/statistics/contracts-by-week.lxsl
___________________________________________________________________
Name: svn:executable
+ *
Added: branches/xml-class-rework/projects/bos/statistics/contracts-by-week.xml
===================================================================
--- branches/xml-class-rework/projects/bos/statistics/contracts-by-week.xml 2006-09-24 19:13:31 UTC (rev 1984)
+++ branches/xml-class-rework/projects/bos/statistics/contracts-by-week.xml 2006-10-14 06:59:35 UTC (rev 1985)
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<graphData xmlns:loop="http://informatik.hu-berlin.de/loop"><sets><set title="Contracts" marker-type="triangle" color="green"><measure><xvalue>1</xvalue><yvalue>14</yvalue></measure><measure><xvalue>2</xvalue><yvalue>19</yvalue></measure><measure><xvalue>3</xvalue><yvalue>62</yvalue></measure><measure><xvalue>4</xvalue><yvalue>19</yvalue></measure><measure><xvalue>5</xvalue><yvalue>10</yvalue></measure><measure><xvalue>6</xvalue><yvalue>4</yvalue></measure><measure><xvalue>7</xvalue><yvalue>3</yvalue></measure><measure><xvalue>8</xvalue><yvalue>4</yvalue></measure><measure><xvalue>9</xvalue><yvalue>9</yvalue></measure><measure><xvalue>10</xvalue><yvalue>20</yvalue></measure><measure><xvalue>11</xvalue><yvalue>29</yvalue></measure><measure><xvalue>12</xvalue><yvalue>14</yvalue></measure><measure><xvalue>13</xvalue><yvalue>13</yvalue></measure><measure><xvalue>14</xvalue><yvalue>17</yvalue></measure><measure><xvalue>15</xvalue><yvalue>15</yvalue></measure><measure><xvalue>16</xvalue><yvalue>3</yvalue></measure><measure><xvalue>17</xvalue><yvalue>8</yvalue></measure><measure><xvalue>18</xvalue><yvalue>7</yvalue></measure><measure><xvalue>19</xvalue><yvalue>10</yvalue></measure><measure><xvalue>20</xvalue><yvalue>15</yvalue></measure><measure><xvalue>21</xvalue><yvalue>9</yvalue></measure><measure><xvalue>22</xvalue><yvalue>28</yvalue></measure><measure><xvalue>23</xvalue><yvalue>12</yvalue></measure><measure><xvalue>24</xvalue><yvalue>8</yvalue></measure><measure><xvalue>25</xvalue><yvalue>19</yvalue></measure><measure><xvalue>26</xvalue><yvalue>15</yvalue></measure><measure><xvalue>27</xvalue><yvalue>37</yvalue></measure><measure><xvalue>28</xvalue><yvalue>16</yvalue></measure><measure><xvalue>29</xvalue><yvalue>11</yvalue></measure><measure><xvalue>30</xvalue><yvalue>6</yvalue></measure><measure><xvalue>31</xvalue><yvalue>11</yvalue></measure><measure><xvalue>32</xvalue><yvalue>12</yvalue></measure><measure><xvalue>33</xvalue><yvalue>7</yvalue></measure><measure><xvalue>34</xvalue><yvalue>10</yvalue></measure><measure><xvalue>35</xvalue><yvalue>66</yvalue></measure><measure><xvalue>36</xvalue><yvalue>8</yvalue></measure><measure><xvalue>37</xvalue><yvalue>32</yvalue></measure><measure><xvalue>38</xvalue><yvalue>13</yvalue></measure><measure><xvalue>39</xvalue><yvalue>15</yvalue></measure><measure><xvalue>40</xvalue><yvalue>16</yvalue></measure><measure><xvalue>41</xvalue><yvalue>2</yvalue></measure></set></sets><minx>1</minx><maxx>52</maxx><miny>0</miny><maxy>66</maxy><title>Contracts by week for year 2006</title><yvalues><yvalue><value>20</value><label>20</label><gridline>true</gridline></yvalue><yvalue><value>40</value><label>40</label><gridline>true</gridline></yvalue><yvalue><value>60</value><label>60</label><gridline>true</gridline></yvalue></yvalues></graphData>
Added: branches/xml-class-rework/projects/bos/statistics/contracts-by-week.xsl
===================================================================
--- branches/xml-class-rework/projects/bos/statistics/contracts-by-week.xsl 2006-09-24 19:13:31 UTC (rev 1984)
+++ branches/xml-class-rework/projects/bos/statistics/contracts-by-week.xsl 2006-10-14 06:59:35 UTC (rev 1985)
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!--
+
+ File generated by translating loops into recursive template calls.
+ XSLT Loop Compiler, Version 1.0
+ GPL (c) O. Becker
+
+ -->
+<xsl:stylesheet xmlns:loop="http://informatik.hu-berlin.de/loop" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:output method="xml"/>
+
+ <xsl:template match="/response">
+ <xsl:variable name="year">
+ <xsl:value-of select="substring(/response/week[1]/@key, 1, 4)"/>
+ </xsl:variable>
+ <xsl:variable name="max_contracts">
+ <xsl:for-each select="week">
+ <xsl:sort select="@contracts" data-type="number" order="descending"/>
+ <xsl:if test="position()=1"><xsl:value-of select="@contracts"/></xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <graphData>
+ <sets>
+ <set title="Contracts" marker-type="triangle" color="green">
+ <xsl:for-each select="week">
+ <measure>
+ <xvalue><xsl:value-of select="substring(@key, 6)"/></xvalue>
+ <yvalue><xsl:value-of select="@contracts"/></yvalue>
+ </measure>
+ </xsl:for-each>
+ </set>
+ </sets>
+ <minx>1</minx>
+ <maxx>52</maxx>
+ <miny>0</miny>
+ <maxy><xsl:value-of select="$max_contracts"/></maxy>
+ <title>Contracts by week for year <xsl:value-of select="$year"/></title>
+ <yvalues>
+ <xsl:call-template name="for-loop-id4477040"><xsl:with-param name="i" select="20"/><xsl:with-param name="toid4477040" select="$max_contracts"/><xsl:with-param name="stepid4477040" select="20"/><xsl:with-param name="year" select="$year"/><xsl:with-param name="max_contracts" select="$max_contracts"/></xsl:call-template>
+ </yvalues>
+ </graphData>
+ </xsl:template>
+<xsl:template name="for-loop-id4477040"><xsl:param name="i"/><xsl:param name="toid4477040"/><xsl:param name="stepid4477040"/><xsl:param name="year"/><xsl:param name="max_contracts"/>
+ <yvalue>
+ <value><xsl:value-of select="$i"/></value>
+ <label><xsl:value-of select="$i"/></label>
+ <gridline>true</gridline>
+ </yvalue>
+ <xsl:if test="$i+$stepid4477040 <= $toid4477040"><xsl:call-template name="for-loop-id4477040"><xsl:with-param name="i" select="$i + $stepid4477040"/><xsl:with-param name="toid4477040" select="$toid4477040"/><xsl:with-param name="stepid4477040" select="$stepid4477040"/><xsl:with-param name="year" select="$year"/><xsl:with-param name="max_contracts" select="$max_contracts"/></xsl:call-template></xsl:if></xsl:template></xsl:stylesheet>
Property changes on: branches/xml-class-rework/projects/bos/statistics/contracts-by-week.xsl
___________________________________________________________________
Name: svn:executable
+ *
Added: branches/xml-class-rework/projects/bos/statistics/loop-compiler.xslt
===================================================================
--- branches/xml-class-rework/projects/bos/statistics/loop-compiler.xslt 2006-09-24 19:13:31 UTC (rev 1984)
+++ branches/xml-class-rework/projects/bos/statistics/loop-compiler.xslt 2006-10-14 06:59:35 UTC (rev 1985)
@@ -0,0 +1,504 @@
+<?xml version="1.0"?>
+
+<!--
+ XSLT Loop Compiler,
+ translates iteration (for and while) into recursion
+ Version 1.0
+ GPL (c) Oliver Becker, 2000-07-06
+ obecker at informatik.hu-berlin.de
+-->
+
+<xslt:transform version="1.0"
+ xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
+ xmlns:axslt="http://www.w3.org/1999/XSL/Transform/Alias"
+ xmlns:loop="http://informatik.hu-berlin.de/loop"
+ exclude-result-prefixes="loop">
+
+<xslt:namespace-alias stylesheet-prefix="axslt" result-prefix="xslt" />
+
+<xslt:output method="xml" indent="no" encoding="iso-8859-1" />
+
+
+<xslt:template match="/">
+ <!-- first validate ... -->
+ <xslt:variable name="errors">
+ <xslt:apply-templates mode="validate-loops" />
+ </xslt:variable>
+ <xslt:if test="string-length($errors)!=0">
+ <xslt:message terminate="yes">
+ <xslt:value-of select="string-length($errors)"/>
+ <xslt:text> error(s) detected</xslt:text>
+ </xslt:message>
+ </xslt:if>
+
+ <!-- ... then generate code -->
+ <xslt:comment>
+
+ File generated by translating loops into recursive template calls.
+ XSLT Loop Compiler, Version 1.0
+ GPL (c) O. Becker
+
+ </xslt:comment>
+ <xslt:apply-templates />
+</xslt:template>
+
+
+<!-- ====================== Validation code ======================= -->
+
+<xslt:template match="loop:for" mode="validate-loops">
+ <xslt:if test="not(@name!='')">
+ <xslt:message>
+ <xslt:text>Missing required attribute 'name' of '</xslt:text>
+ <xslt:value-of select="name()" />' <xslt:text />
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ <xslt:if test="not(@from!='')">
+ <xslt:message>
+ <xslt:text>Missing required attribute 'from' of '</xslt:text>
+ <xslt:value-of select="name()" />' <xslt:text />
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ <xslt:if test="not(@to!='')">
+ <xslt:message>
+ <xslt:text>Missing required attribute 'to' of '</xslt:text>
+ <xslt:value-of select="name()" />' <xslt:text />
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ <xslt:for-each select="@*">
+ <xslt:if test="name()!='name' and name()!='from' and
+ name()!='to' and name()!='step'">
+ <xslt:message>
+ <xslt:text>Unknown attribute '</xslt:text>
+ <xslt:value-of select="name()" />
+ <xslt:text>' of '</xslt:text>
+ <xslt:value-of select="name(..)" />' <xslt:text />
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ </xslt:for-each>
+ <xslt:apply-templates mode="validate-loops" />
+</xslt:template>
+
+<xslt:template match="loop:while" mode="validate-loops">
+ <xslt:if test="not(@test!='')">
+ <xslt:message>
+ <xslt:text>Missing required attribute 'test' of '</xslt:text>
+ <xslt:value-of select="name()" />' <xslt:text />
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ <xslt:for-each select="@*">
+ <xslt:if test="name()!='test'">
+ <xslt:message>
+ <xslt:text>Unknown attribute '</xslt:text>
+ <xslt:value-of select="name()" />
+ <xslt:text>' of '</xslt:text>
+ <xslt:value-of select="name(..)" />' <xslt:text />
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ </xslt:for-each>
+ <xslt:for-each select="*|text()">
+ <xslt:if test="not(self::xslt:variable or self::loop:do or
+ self::loop:last or self::loop:update or
+ (self::text() and normalize-space(.)=''))" >
+ <xslt:message>
+ <xslt:text>Forbidden </xslt:text>
+ <xslt:choose>
+ <xslt:when test="self::text()">
+ <xslt:text>text '</xslt:text>
+ <xslt:value-of select="normalize-space(.)" />
+ </xslt:when>
+ <xslt:otherwise>
+ <xslt:text>element '</xslt:text>
+ <xslt:value-of select="name()" />
+ </xslt:otherwise>
+ </xslt:choose>
+ <xslt:text>' - expected '</xslt:text>
+ <xslt:value-of
+ select="substring-before(name(//xslt:*),':')" />
+ <xslt:text>:variable', '</xslt:text>
+ <xslt:value-of select="substring-before(name(..),':')" />
+ <xslt:text>:do', '</xslt:text>
+ <xslt:value-of select="substring-before(name(..),':')" />
+ <xslt:text>:last' or '</xslt:text>
+ <xslt:value-of select="substring-before(name(..),':')" />
+ <xslt:text>:update'</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ </xslt:for-each>
+ <xslt:if test="not(loop:update)">
+ <xslt:message>
+ <xslt:text />Warning: '<xslt:value-of select="name()" />
+ <xslt:text>' contains no '</xslt:text>
+ <xslt:value-of select="substring-before(name(..),':')" />
+ <xslt:text>:update' - infinite loop!</xslt:text>
+ </xslt:message>
+ </xslt:if>
+ <xslt:apply-templates mode="validate-loops" />
+</xslt:template>
+
+<xslt:template match="loop:while/xslt:variable" mode="validate-loops">
+ <xslt:choose>
+ <xslt:when test="preceding-sibling::loop:do">
+ <xslt:message>
+ <xslt:text />'<xslt:value-of select="name()" />
+ <xslt:text>' must not follow a preceding '</xslt:text>
+ <xslt:value-of select="substring-before(name(..),':')" />
+ <xslt:text>:do'</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:when>
+ <xslt:when test="preceding-sibling::loop:last">
+ <xslt:message>
+ <xslt:text />'<xslt:value-of select="name()" />
+ <xslt:text>' must not follow a preceding '</xslt:text>
+ <xslt:value-of select="substring-before(name(..),':')" />
+ <xslt:text>:last'</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:when>
+ <xslt:when test="preceding-sibling::loop:update">
+ <xslt:message>
+ <xslt:text />'<xslt:value-of select="name()" />
+ <xslt:text>' must not follow a preceding '</xslt:text>
+ <xslt:value-of select="substring-before(name(..),':')" />
+ <xslt:text>:update'</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:when>
+ </xslt:choose>
+</xslt:template>
+
+<xslt:template match="loop:do | loop:last" mode="validate-loops">
+ <xslt:if test="not(parent::loop:while)">
+ <xslt:message>
+ <xslt:text />'<xslt:value-of select="name()" />
+ <xslt:text>' must be an immediate child of '</xslt:text>
+ <xslt:value-of select="substring-before(name(),':')" />
+ <xslt:text>:while'</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ <xslt:for-each select="@*">
+ <xslt:message>
+ <xslt:text>Unknown attribute '</xslt:text>
+ <xslt:value-of select="name()" />
+ <xslt:text>' of '</xslt:text>
+ <xslt:value-of select="name(..)" />' <xslt:text />
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:for-each>
+ <xslt:choose>
+ <xslt:when test="self::loop:do and preceding-sibling::loop:do">
+ <xslt:message>
+ <xslt:text />'<xslt:value-of select="name()" />
+ <xslt:text>' must not follow a preceding '</xslt:text>
+ <xslt:value-of select="substring-before(name(),':')" />
+ <xslt:text>:do'</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:when>
+ <xslt:when test="preceding-sibling::loop:last">
+ <xslt:message>
+ <xslt:text />'<xslt:value-of select="name()" />
+ <xslt:text>' must not follow a preceding '</xslt:text>
+ <xslt:value-of select="substring-before(name(),':')" />
+ <xslt:text>:last'</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:when>
+ <xslt:when test="preceding-sibling::loop:update">
+ <xslt:message>
+ <xslt:text />'<xslt:value-of select="name()" />
+ <xslt:text>' must not follow a preceding '</xslt:text>
+ <xslt:value-of select="substring-before(name(),':')" />
+ <xslt:text>:update'</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:when>
+ </xslt:choose>
+ <xslt:apply-templates mode="validate-loops" />
+</xslt:template>
+
+<xslt:template match="loop:update" mode="validate-loops">
+ <xslt:if test="not(parent::loop:for) and not(parent::loop:while)">
+ <xslt:message>
+ <xslt:text />'<xslt:value-of select="name()" />
+ <xslt:text>' must be an immediate child of '</xslt:text>
+ <xslt:value-of select="substring-before(name(),':')" />
+ <xslt:text>:for' or '</xslt:text>
+ <xslt:value-of select="substring-before(name(),':')" />
+ <xslt:text>:while'</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ <xslt:if test="not(@name!='')">
+ <xslt:message>
+ <xslt:text>Missing required attribute 'name' of '</xslt:text>
+ <xslt:value-of select="name()" />'<xslt:text/>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ <xslt:for-each select="@*">
+ <xslt:if test="name()!='name' and name()!='select'">
+ <xslt:message>
+ <xslt:text>Unknown attribute '</xslt:text>
+ <xslt:value-of select="name()" />
+ <xslt:text>' of '</xslt:text>
+ <xslt:value-of select="name(..)" />' <xslt:text />
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ </xslt:for-each>
+ <xslt:if test="preceding-sibling::loop:update
+ [@name=current()/@name]">
+ <xslt:message>
+ <xslt:text />'<xslt:value-of select="name()" />
+ <xslt:text>' for variable '</xslt:text>
+ <xslt:value-of select="@name" />
+ <xslt:text>' already defined</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ <xslt:call-template name="var-wrapper">
+ <xslt:with-param name="action" select="'validate-update'" />
+ <xslt:with-param name="loop-node" select=".." />
+ </xslt:call-template>
+ <xslt:apply-templates mode="validate-loops" />
+</xslt:template>
+
+<xslt:template match="loop:*" mode="validate-loops">
+ <xslt:message>
+ <xslt:text />Unknown element '<xslt:value-of select="name()" />
+ <xslt:text>'</xslt:text>
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ <xslt:apply-templates mode="validate-loops" />
+</xslt:template>
+
+<xslt:template match="text()" mode="validate-loops" />
+
+<!-- =================== End of validation ======================== -->
+
+
+
+<!-- ================= General template rules ===================== -->
+
+<xslt:template match="xslt:stylesheet | xslt:transform">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates />
+ <xslt:apply-templates mode="create-templates" />
+ </xslt:copy>
+</xslt:template>
+
+<xslt:template match="text()" mode="create-templates" />
+
+<xslt:template match="*">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates />
+ </xslt:copy>
+</xslt:template>
+
+<xslt:template match="comment()|processing-instruction()">
+ <xslt:copy />
+</xslt:template>
+
+
+
+<!-- ========================= for-loop =========================== -->
+
+<xslt:template match="loop:for">
+ <xslt:variable name="step">
+ <xslt:choose>
+ <xslt:when test="not(@step)">1</xslt:when>
+ <xslt:otherwise>
+ <xslt:value-of select="@step" />
+ </xslt:otherwise>
+ </xslt:choose>
+ </xslt:variable>
+ <xslt:variable name="id" select="generate-id()" />
+ <axslt:call-template name="for-loop-{$id}">
+ <axslt:with-param name="{@name}" select="{@from}" />
+ <axslt:with-param name="to{$id}" select="{@to}" />
+ <axslt:with-param name="step{$id}" select="{$step}" />
+ <xslt:call-template name="var-wrapper">
+ <xslt:with-param name="action"
+ select="'create-call-with-params'" />
+ </xslt:call-template>
+ </axslt:call-template>
+</xslt:template>
+
+
+<xslt:template match="loop:for" mode="create-templates">
+ <xslt:variable name="id" select="generate-id()" />
+
+ <axslt:template name="for-loop-{$id}">
+ <axslt:param name="{@name}" />
+ <axslt:param name="to{$id}" />
+ <axslt:param name="step{$id}" />
+ <xslt:call-template name="var-wrapper">
+ <xslt:with-param name="action" select="'create-loop-params'" />
+ </xslt:call-template>
+
+ <xslt:apply-templates />
+
+ <xslt:variable name="comp-op">
+ <xslt:choose>
+ <xslt:when test="@step < 0">>=</xslt:when>
+ <xslt:otherwise><=</xslt:otherwise>
+ </xslt:choose>
+ </xslt:variable>
+
+ <axslt:if test="${@name}+$step{$id} {$comp-op} $to{$id}">
+ <axslt:call-template name="for-loop-{$id}">
+ <axslt:with-param name="{@name}"
+ select="${@name} + $step{$id}" />
+ <axslt:with-param name="to{$id}" select="$to{$id}" />
+ <axslt:with-param name="step{$id}" select="$step{$id}" />
+ <xslt:call-template name="var-wrapper">
+ <xslt:with-param name="action"
+ select="'create-loop-with-params'" />
+ </xslt:call-template>
+ </axslt:call-template>
+ </axslt:if>
+ </axslt:template>
+
+ <xslt:apply-templates mode="create-templates" />
+</xslt:template>
+
+<!-- ============================================================== -->
+
+
+
+<!-- ====================== while-loop ============================ -->
+
+<xslt:template match="loop:while">
+ <axslt:call-template name="while-loop-{generate-id()}">
+ <xslt:call-template name="var-wrapper">
+ <xslt:with-param name="action"
+ select="'create-call-with-params'" />
+ </xslt:call-template>
+ </axslt:call-template>
+</xslt:template>
+
+
+<xslt:template match="loop:while" mode="create-templates">
+ <xslt:variable name="id" select="generate-id()" />
+
+ <axslt:template name="while-loop-{$id}">
+ <xslt:call-template name="var-wrapper">
+ <xslt:with-param name="action" select="'create-loop-params'" />
+ </xslt:call-template>
+
+ <xslt:copy-of select="xslt:variable" />
+ <axslt:choose>
+ <axslt:when test="{@test}">
+ <xslt:apply-templates select="loop:do" />
+ <axslt:call-template name="while-loop-{$id}">
+ <xslt:call-template name="var-wrapper">
+ <xslt:with-param name="action"
+ select="'create-loop-with-params'" />
+ </xslt:call-template>
+ </axslt:call-template>
+ </axslt:when>
+ <xslt:if test="loop:last">
+ <axslt:otherwise>
+ <xslt:apply-templates select="loop:last" />
+ </axslt:otherwise>
+ </xslt:if>
+ </axslt:choose>
+ </axslt:template>
+
+ <xslt:apply-templates mode="create-templates" />
+</xslt:template>
+
+
+<xslt:template match="loop:do | loop:last">
+ <xslt:apply-templates />
+</xslt:template>
+
+
+<xslt:template match="loop:update" />
+
+<!-- ============================================================== -->
+
+
+
+<!-- =================== variable wrapper ========================= -->
+<!-- separated because the expression for $vars was a little bit
+ difficult to determine -->
+
+<xslt:template name="var-wrapper">
+ <xslt:param name="action" />
+ <xslt:param name="loop-node" select="." />
+ <xslt:variable name="vars" select=
+ "$loop-node/ancestor-or-self::*/preceding-sibling::xslt:variable
+ [ancestor::xslt:template] |
+ $loop-node/ancestor-or-self::*/preceding-sibling::xslt:param
+ [ancestor::xslt:template] |
+ $loop-node/ancestor::loop:for" />
+ <xslt:choose>
+ <xslt:when test="$action='create-call-with-params'">
+ <xslt:for-each select="$vars">
+ <axslt:with-param name="{@name}" select="${@name}" />
+ </xslt:for-each>
+ </xslt:when>
+ <xslt:when test="$action='create-loop-params'">
+ <xslt:for-each select="$vars">
+ <axslt:param name="{@name}" />
+ </xslt:for-each>
+ </xslt:when>
+ <xslt:when test="$action='create-loop-with-params'">
+ <xslt:for-each select="$vars">
+ <xslt:variable name="update"
+ select="$loop-node/loop:update
+ [@name=current()/@name]" />
+ <xslt:choose>
+ <xslt:when test="$update">
+ <axslt:with-param name="{@name}">
+ <xslt:if test="$update/@select">
+ <xslt:attribute name="select">
+ <xslt:value-of select="$update/@select" />
+ </xslt:attribute>
+ </xslt:if>
+ <xslt:apply-templates select="$update"
+ mode="process-update" />
+ </axslt:with-param>
+ </xslt:when>
+ <xslt:otherwise>
+ <axslt:with-param name="{@name}" select="${@name}" />
+ </xslt:otherwise>
+ </xslt:choose>
+ </xslt:for-each>
+ </xslt:when>
+
+ <!-- the following is validation code -->
+ <xslt:when test="$action='validate-update'">
+ <xslt:if test="@name and not($vars[@name=current()/@name])">
+ <xslt:message>
+ <xslt:text>Cannot update variable '</xslt:text>
+ <xslt:value-of select="@name" />
+ <xslt:text>' - not locally visible at parent node '</xslt:text>
+ <xslt:value-of select="name(..)" />' <xslt:text />
+ </xslt:message>
+ <xslt:text>.</xslt:text>
+ </xslt:if>
+ </xslt:when>
+
+ </xslt:choose>
+</xslt:template>
+
+
+<xslt:template match="loop:update" mode="process-update">
+ <xslt:apply-templates />
+</xslt:template>
+
+
+</xslt:transform>
Property changes on: branches/xml-class-rework/projects/bos/statistics/loop-compiler.xslt
___________________________________________________________________
Name: svn:executable
+ *
More information about the Bknr-cvs
mailing list