posts - 40, comments - 13, trackbacks - 0, articles - 1
  IT博客 :: 首页 :: 新随笔 :: 联系 ::  :: 管理

 在SVG中使用滤镜效果和输出文字
在SVG中使用滤镜效果和输出文字

为了使图像更生动形象,可以在SVG中使用滤镜效果和输出文字的基本方法。   
一、在SVG中使用滤镜效果 
在SVG中,我们可以直接对基本图象和文字使用这些效果,在SVG使用滤竟效果就和Adobe Photoshop、Macromedia Fireworks中一样,比如:阴影、高斯模糊、金属效果,颜色渐变等,SVG中的滤镜效果有feBlend、feColorMatrix、feComponentTransfer、feComposite、feConvolveMatrix、feDiffuseLighting、feDisplacementMap、feFlood、feGaussianBlur、feImage、feMerge、feMorphology、feOffset、feSpecularLighting、feTile、feTurbalance、feDistantLight、fePointLight、feSpotLight等。我们可以单独使用这些滤镜效果,也可以组合起来使用。由于这些滤镜的组合很多,我们很难在较短的篇幅里全部讲述,我们只是举其中的几个例子,来让初步认识一下在SVG中如何使用滤镜。   
 要在SVG中使用滤镜效果,必须把滤镜的定义嵌套在<defs>标记中,顾名思义,defs就是定义(definitions)的意思,它的作用就是定义一些特殊的元素,滤镜的定义也必须放到其中。定义一个滤镜效果,必须使用<filter>标记,同时必须指定一个id名(即唯一标识符),用以标识这个效果是应用到哪些图像上,下面举个具体的例子来加以说明: 
 <?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" 
 

  

"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
 

  

<svg width="400" height="400"> 
 

  

<defs> 
 

  

<filter id="Gaussian_Blur_Test_for_Mengxianhui"> 
 

  

<feGaussianBlur in="SourceGraphic" stdDeviation="2"/> 
 

  

</filter> 
 

  

</defs> 
 

  

<rect x="59" y="77" width="163" height="34" style="filter:url(#Gaussian_Blur_Test_for_Mengxianhui);fill:rgb(128,128,255);stroke:rgb(128,0,128);stroke-width:5;" /> 
 

  

</svg> 
 

  

在上面的例子中,<filter id="Gaussian_Blur_Test_for_Mengxianhui">标记定义了一个高斯模糊的滤镜效果,id值在整个文件中应当是唯一的,文档中的其它元素也可以通过这个id值来重复使用这个滤镜,换句话说,<filter id="Gaussian_Blur_Test_for_Mengxianhui">就相当于一个模板,可以多次被调用。当我们要对某元素使用这个滤镜时,采用的语法是:filter:url(#Gaussian_Blur_Test_for_Mengxianhui),并把它做为style属性的一部分,圆括号的“#”不能省略,它后面的文字就是滤镜定义中的id值。滤镜效果的定义放到<feGaussianBlur in="SourceGraphic" stdDeviation="2"/>标记中,前导符“fe”在所有的滤镜中都有,是filter effect的缩写。例子中的滤镜效果是高斯模糊,stdDeviation属性描述模糊的强弱,数值越大,就越模糊。in="SourceGraphic"定义模糊模糊的效果是对整个图像,若使用SourceAlpha,则表示模糊效果是对图像的alpha通道的,in属性除了用在结果输出之外只有这两种可选择使用的值,在其它滤镜里也是这样,下面也将会讲到。高斯模糊中的stdDeviation这个属性值描述高斯模糊的偏离大小,如果给出两个属性值,则前一个参数代表沿x轴方向的偏离值,后一个值代表沿y轴的偏离值;如果给出一个参数,则代表沿x,y轴的偏离值是一样的。上面的例子的效果如下图所示: 
 

  

  
 

  


 

  

  
 

  

前面已经提到,对一个SVG图像来说,可以组合应用多个滤镜效果,下面看一个紊乱的效果: 
 

  

<?xml version="1.0" standalone="no"?> 
 

  

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
 

  

<svg width="100%" height="100%"> 
 

  

<defs> 
 

  

<filter id="Turbulence"> 
 

  

<feTurbulence baseFrequency="0.03 0.02" numOctaves="5" type="turbulence" result="turbulenceOutput"/> 
 

  

<feComposite in="turbulenceOutput" in2="SourceAlpha" operator="in"/> 
 

  

</filter> 
 

  

</defs> 
 

  

<path d="M193.1 79.292 C224.16 88.7968 242.127 121.499 232.627 154.414 C223.127 187.328 239.995 220.003 271.913 229.504 C303.83 239.006 336.35 218.61 345 188.876 C323.124 264.909 248.755 285.576 198.994 270.349 C149.231 255.12 98.1789 196.096 120.144 119.992 C129.376 88.0081 162.039 69.7869 193.1 79.292 zM167.341 136.242 C167.341 141.144 170.673 145.311 176.03 145.311 C181.386 145.311 184.242 140.899 184.242 136.242 C184.242 131.584 180.796 127.762 175.91 127.785 C171.025 127.809 167.341 131.339 167.341 136.242 z" 
 

  

style="fill:rgb(192,192,255);stroke:rgb(130,0,61);stroke-width:1;filter:url(#Turbulence);" /> 
 

  

</svg> 
 

  

这个例子里使用了feTurbulence和feComposite滤镜的效果,在SVG中,滤镜可以使用result和in属性进行滤镜的相互嵌套。例子中,在turbulence滤镜里使用了result="turbulenceOutput"属性,表示这个滤镜的结果要输出到别的滤镜中去,feComposite使用in="turbulenceOutput"属性来使用上一个滤镜的输出结果,由于在这个滤镜中已经使用了in属性,因此,SVG提供了in2属性供我们使用,in和in2的作用是一样的;例子中in2="SourceAlpha"属性定义了这个滤镜的单一通道;operator 属性是feComposite滤镜特有的,用来描述合成的类型,可设定over,in,out,atop,xor,arithmetic中的任一个值,大家可以替换不同的值来查看效果的变化。例子中的baseFrequency属性用来描述混沌出现的频率,有x、y两方向的值可以设置。numOctaves属性设定混沌的间隔,可选1-8,默认为1。上面例子的结果如下: 
 

  

  
 


 

  

  
 

  

下面是一个比较复杂的例子,大家可以看看他的效果: 
 

  

<svg width="100%" height="100%"> 
 

  

<defs> 
 

  

<filter id="metallic"> 
 

  

<feGaussianBlur result="blurredAlpha" in="SourceAlpha" stdDeviation="3"/> 
 

  

<feOffset result="offsetBlurredAlpha" in="blurredAlpha" dx="2" dy="1"/> 
 

  

<feDiffuseLighting result="bumpMapDiffuse" in="blurredAlpha" surfaceScale="5" diffuseConstant="0.5" style="lighting-color:rgb(255,255,255)"> 
 

  

<feDistantLight azimuth="135" elevation="60"/> 
 

  

</feDiffuseLighting> 
 

  

<feComposite result="litPaint" in="bumpMapDiffuse" operator="arithmetic" k1="1" k2="0" k3="0" k4="0" in2="SourceGraphic"/> 
 

  

<feSpecularLighting result="bumpMapSpecular" in="blurredAlpha" surfaceScale="5" specularConstant="0.5" specularExponent="10" style="lighting-color:rgb(255,255,255)"> 
 

  

<feDistantLight azimuth="135" elevation="60"/> 
 

  

</feSpecularLighting> 
 

  

<feComposite result="litPaint" in="litPaint" operator="arithmetic" k1="0" k2="1" k3="1" k4="0" in2="bumpMapSpecular"/> 
 

  

<feComposite result="litPaint" in="litPaint" operator="in" in2="SourceAlpha"/> 
 

  

<feMerge> 
 

  

<feMergeNode in="offsetBlurredAlpha"/> 
 

  

<feMergeNode in="litPaint"/> 
 

  

</feMerge> 
 

  

</filter> 
 

  

</defs> 
 

  

<path d="M233.642 288 C249.9 265.728 318 231.266 318 195.613 C318 133.896 247.069 148.581 232.993 172.957 C218.041 147.832 149 137.805 149 195.613 C149 232.135 219.429 265.911 233.642 288 z" style="filter:url(#metallic);fill:rgb(255,38,255);stroke:rgb(11,11,13);stroke-width:1;" /> 
 

  

</svg> 
 

  

上面的例子的结果如下: 
 

  

  
 

  


 

  

  
 

  

下面我们看看渐变效果。渐变效果是指从一种颜色到另一种颜色的平滑过渡。SVG中有两种渐变方式:直线渐变和放射渐变。 
 

  

直线渐变<linearGradient>有水平渐变、垂直渐变和任意角度的渐变三种情况,如果y1、y2的值相同,而x2、x2的值不同,则代表水平渐变;y1、y2不同而x1、x2相同,达标垂直渐变;如果x1、x2,y1、y2都不同,则是角度渐变。颜色可以是两种或多种颜色的组合,每种颜色都要用<stop>标记来指定,它有两个属性:stop-color和stop-opacity,分别表示颜色和透明度。 
 

  

<?xml version="1.0" standalone="no"?> 
 

  

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" 
 

  

"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
 

  

<svg width="100%" height="100%"> 
 

  

<defs> 
 

  

<linearGradient id="Linear_Gradient_Test_For_Mengxianhui" x1="0%" y1="100%" x2="0%" y2="0%"> 
 

  

<stop offset="0%" style="stop-color:yellow;stop-opacity:1"/> 
 

  

<stop offset="50%" style="stop-color:red;stop-opacity:1"/> 
 

  

<stop offset="100%" style="stop-color:blue;stop-opacity:1"/> 
 

  

</linearGradient> 
 

  

</defs> 
 

  

<ellipse cx="200" cy="200" rx="80" ry="60" style="fill:url(#Linear_Gradient_Test_For_Mengxianhui)"/> 
 

  

</svg> 
 

  

上例中<linearGradient>标记定义了一个直线渐变,id属性定义该渐变的唯一标识,x1、y1定义了渐变的开始点坐标,x2、y2定义了渐变的结束点坐标,标记<stop>定义每一种颜色的信息,offset属性渐变色的开始或结束位置。该例子的结果如下: 
 

  

  
 

  


 

  

  
 

  

放射渐变由<radialGradient>标记定义,例子如下: 
 

  

<?xml version="1.0" standalone="no"?> 
 

  

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
 

  

<svg width="420" height="220"> 
 

  

<defs> 
 

  

<radialGradient id="fade-to-black" cx="0%" cy="0%" r="20%" spreadMethod="reflect" gradientUnits="objectBoundingBox"> 
 

  

<stop offset="0%" style="stop-color:#F8C806;stop-opacity:1"/> 
 

  

<stop offset="50%" style="stop-color:#000099;stop-opacity:1"/> 
 

  

<stop offset="100%" style="stop-color:#458900;stop-opacity:1"/> 
 

  

</radialGradient> 
 

  

</defs> 
 

  

<rect x="10" y="10" width="400" height="200" style="fill:url(#fade-to-black);stroke:rgb(0,0,128); stroke-width:0" /> 
 

  

</svg> 
 

  

上面的cx,cy代表椭圆的圆心,r及rx,ry代表x方向和y方向的半径,spreadMethod代表平铺的方式,有pad,reflect和repeat三种方式。为了理解个参数的意义,您可以试着改变个参数的值,看看它们是如何控制的。该例子的结果如下: 
 

  

  
 

  

  
 

  


 

  

  
 

  

二、在SVG中输出文字 
 

  

  
 

  

在SVG中,文字都被看成是字符数据,所有的文字放到<text>标记中,但允许使用<tspan>标记进行嵌套,文字也是使用x,y属性在浏览器上进行定位的。例如: 
 

  

<?xml version="1.0" standalone="no"?> 
 

  

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" 
 

  

"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
 

  

<svg width="100%" height="100%"> 
 

  

<text x="100px" y="120px" 
 

  

style="fill:rgb(0,0,0);font-size:36;font-family:Arial">WelCome To Mxh's Colorful World!</text> 
 

  

<text x="100px" y="160px" 
 

  

style="fill:rgb(255,0,0);font-size:36;font-family:Arial">http://lucky.myrice.com!</text> 
 

  

</svg> 
 

  

上面例子的结果如下: 
 

  

  
 

  


 

  

  
 

  

SVG中的文字是放在一个不可见的矩形区域里,因此,那个矩形区域内的文字被当成一行来处理,而不是象通常的浏览器那样把文字折行显示,要显示多行文字,就必须使用多个<text>标记。当然,我们也可以对文字使用样式,fill属性定义文字的填充颜色,font-size定义文字的字号大小,font-family属性定义文字的字型,SVG中的文字样式和CSS2中的文字样式一样,也有font-style,font-stretch等属性,Web开发人员对文字的显示有了更多的选择。 
 

  

文字也可以有透明度和图案填充,下面的例子是一个渐变的效果: 
 

  

<?xml version="1.0" standalone="no"?> 
 

  

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" 
 

  

"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
 

  

<svg width="100%" height="100%"> 
 

  

<defs> 
 

  

<linearGradient id="violet-orange" x1="0%" y1="0%" x2="100%" y2="0%" 
 

  

spreadMethod="pad" gradientUnits="objectBoundingBox"> 
 

  

<stop offset="0%" style="stop-color:rgb(216,192,216);stop-opacity:1"/> 
 

  

<stop offset="100%" style="stop-color:rgb(175,23,87);stop-opacity:1"/> 
 

  

</linearGradient> 
 

  

</defs> 
 

  

<rect x="49" y="29" width="450" height="41" 
 

  

style="fill:rgb(0,0,0);stroke:none;stroke-width:1"/> 
 

  

<text x="70px" y="56px" 
 

  

style="fill:url(#violet-orange); font-size:20;font-weight:bold;font-family:Arial">Welcome to Meng Xianhui's Colorful World!</text> 
 

  

</svg> 
 

  

结果如下: 
 

  

  
 

  


 

  

  
 

  

此外,文字也可以使用滤镜效果,下面的例子就是显示阴影效果的文字: 
 

  

<?xml version="1.0" standalone="no"?> 
 

  

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" 
 

  

"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
 

  

<svg width="100%" height="100%"> 
 

  

<defs> 
 

  

<filter id="Drop_Shadow" filterUnits="objectBoundingBox" x="-10%" y="-10%" width="150%" height="150%"> 
 

  

<feGaussianBlur in="SourceAlpha" stdDeviation="3" result="blurredAlpha"/> 
 

  

<feOffset in="blurredAlpha" dx="3" dy="3" result="offsetBlurredAlpha"/> 
 

  

<feFlood result="flooded" style="flood-color:rgb(99,7,7);flood-opacity:0.65"/> 
 

  

<feComposite in="flooded" operator="in" in2="offsetBlurredAlpha" result="coloredShadow"/> 
 

  

<feComposite in="SourceGraphic" in2="coloredShadow" operator="over"/> 
 

  

</filter> 
 

  

</defs> 
 

  

<text x="126px" y="155px" style="fill:rgb(0,0,0); font-size:30; 
 

  

filter:url(#Drop_Shadow)">Welcome to Meng Xianhui's Colorful World!</text> 
 

  

</svg> 
 

  

结果如下: 
 

  

  
 

  


 

  

  
 

  

SVG中另一个重要的概念就是文字或图像的旋转,SVG中,任何元素都可以进行旋转,下面就是旋转文字的例子: 
 

  

<?xml version="1.0" standalone="no"?> 
 

  

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" 
 

  

"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
 

  

<svg width="100%" height="100%"> 
 

  

<g style="color:#000000;font-weight:bold;font-style:normal;font-size:24"> 
 

  

<text x="18" y="18" transform="translate(7,7) rotate(30)">Welcome to Meng Xianhui's Colorful World!</text> 
 

  

</g> 
 

  

</svg> 
 

  

上面例子的结果如下: 
 

  

  
 

  


 

  

  
 

  

在上面的例子中使用了<g>标记,这个标记的作用是把里面的其他元素看成是一个完整的组, 和SVG中的嵌套相类似,但有一点是不同的,<g>元素允许使用transform属性,这个属性允许我们操纵其他对象的尺寸位置和形状,即可以是静态的,也可以是动态的。因此,如果你想对一个对象做旋转运动,或者做螺旋运动,或者是变形的效果,那么就可以使用transform属性,translate的值描述旋转的圆心坐标,rotate的值描述旋转的角度。 
 

  

要浏览以上例子的结果,你可以把代码拷贝到记事本里,最好是拷贝到XMLSpy里,然后保存为*.svg格式,就可以直接用IE6(IE5能否浏览我没有试验)或SVG Viewer来看到效果了。保存时应该注意编码方式,SVG是基于XML的文档格式,因此,文档结构应当满足XML的格式规范(Well-Formed)的要求。

posted @ 2005-12-16 18:49 WJH 阅读(386) | 评论 (0)编辑 收藏

发贴心情 利用XSLT生成SVG格式的数据统计图[推荐]
利用XSLT生成SVG格式的数据统计图


可升级矢量图象(SVG)是新一代的图象标准,它具有矢量化、符合XML规范、可样式单化、文字可搜索、开放源代码等特性,正在逐渐被世界各大计算机软件厂商所支持。由于SVG图象完全符合XML标准,因此,我们就可以利用XSLT来生成SVG图象。下面,我们就某公司一年中的所有产品的月销售额来看看如何利用XSLT来生成SVG格式的数据统计图。数据统计图的样式非常多,有柱状图、饼图、折线图、三维立体效果图等等,我们这里将介绍簇状柱形图、堆积柱形图和饼图。由于篇幅所限,我们这次仅介绍簇状柱形图,我们会在以后文章中介绍其它两种数据统计图的生成方法。 

目前,没有一个浏览器完全支持SVG图象的显示,为了能够看到本例子中效果,您必须安装SVG Viewer 3.0插件,下载地址:http://www.adobe.com/svg/viewer/install/main.html。在Windows XP平台上,自带了Microsoft Internet Explorer 6,但是它是Adobe SVG Viewer 2.0的插件,对中文的支持不好,但可以直接浏览没有中文文字的SVG图象,把本例中的中文换成英文,也可以浏览本例中的代码。我们的例子在支持UTF-16的平台上可以很好地显示,我们就以中文为例。 

首先,我们准备所需要的数据,格式是XML的。由于目前许多大型数据库都提供了对XML查询结果的支持,因此,您可以直接利用数据库来生成XML数据文件,也可以经过查询,再用编写组件的方法来生成需要的XML数据文件。我们的XML数据文件Data.xml格式如下: 

<?xml version="1.0" encoding="UTF-8"?> 

<sales_summary> 

<Month_sales Month_no="1"> 

<product_sales product_id="PC_INTEL_001" quantity="5" value="5000.00"/> 

<product_sales product_id="PC_INTEL_002" quantity="10" value="1500.00"/> 

</Month_sales> 

<Month_sales Month_no="2"> 

<product_sales product_id="PC_INTEL_001" quantity="4" value="4000.00"/> 

<product_sales product_id="PC_INTEL_002" quantity="10" value="3000.00"/> 

<product_sales product_id="PC_AMD_001" quantity="20" value="1500.00"/> 

<product_sales product_id="PC_AMD_002" quantity="20" value="1800.00"/> 

<product_sales product_id="PC_DIGITAL_001" quantity="11" value="50.00"/> 

<product_sales product_id="PC_DIGITAL_002" quantity="18" value="600.00"/> 

</Month_sales> 

<!-- 限于篇幅所限,我们这里省略了3月份到11月份的数据,如果浏览时,请自行添加上,格式同前 --> 

<Month_sales Month_no="12"> 

<product_sales product_id="PC_INTEL_001" quantity="56" value="200.00"/> 

<product_sales product_id="PC_INTEL_002" quantity="10" value="500.00"/> 

<product_sales product_id="PC_AMD_001" quantity="61" value="1500.00"/> 

<product_sales product_id="PC_AMD_002" quantity="8" value="2100.00"/> 

<product_sales product_id="PC_DIGITAL_001" quantity="2" value="500.00"/> 

<product_sales product_id="PC_DIGITAL_002" quantity="6" value="1200.00"/> 

</Month_sales> 

</sales_summary> 

下面,我们看看最关键的XSLT部分,由于在这里用到了XSLT,请把您的MsXML2文件升级到最新的MsXML3.0 SP2或MsXML4.0,可以到微软的网站下载:http://www.microsoft.com/xml/。文中每一代码段都进行了注释说明。XSLTToGraph.xsl: 

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<!-- 定义XSLT转换后输出的文件的格式,这里输出为XML格式的文件内容 --> 

<xsl:output method="xml" indent="yes" encoding="UTF-8" version="1.0" standalone="no" media-type="image/svg+xml"/> 

<!-- 以下定义全局变量 --> 

<!-- 柱状图每个柱的宽度 --> 

<xsl:variable name="bar_width" select="number(80)"/> 

<!-- 每个柱之间的间隔 --> 

<xsl:variable name="bar_spacing" select="number(10)"/> 

<!-- 图象高度 --> 

<xsl:variable name="graph_height" select="number(500)"/> 

<!-- 图象的左边界 --> 

<xsl:variable name="left_margin" select="number(100)"/> 

<xsl:template match="/"> 

<!-- SVG的主体部分开始 --> 

<svg id="body" viewBox="0 0 -100 {$graph_height + 100}"> 

<!-- 下面的代码实现鼠标的onMouseOver和onMouseOut事件执行的代码,显示或隐藏当月的销售额 --> 

<script type="text/ECMAScript"><![CDATA[ 

function On_MouseOver(evt,HideShow_ID){ 

// 得到目标对象 

var target = evt.getTarget(); 

var doc = target.getOwnerdocument.);

var HideShow = doc.getElementById(HideShow_ID); 

HideShow.setAttribute('style', 'visibility:visible'); 

function On_MouseOut(evt,HideShow_ID){ 

var target = evt.getTarget(); 

var doc = target.getOwnerdocument.); 

var HideShow = doc.getElementById(HideShow_ID); 

HideShow.setAttribute('style', 'visibility:hidden'); 

]]></script> 

<title>月销售纪录</title> 

<!-- 柱状图的主体部分 --> 

<g id="barChart" transform="translate(10, 10)" fill-rule="nonzero" clip-rule="nonzero" stroke="none" class="legend" 

stroke-width="1" stroke-linecap="square" stroke-miterlimit="1" style="text-anchor:start" shape-rendering="crispEdges"> 

<!-- 应用数据模板 --> 

<xsl:apply-templates select="sales_summary"/> 

<text text-anchor="middle" transform="matrix(2 0 0 2 {$left_margin + 150} {$graph_height + 70})">某公司每月产品销售纪录</text> 

</g> 

</svg> 

</xsl:template> 

<!-- 数据模板开始 --> 

<xsl:template match="sales_summary"> 

<!-- 计算月数 --> 

<xsl:variable name="weeks_count" select="count(Month_sales)"/> 

<!-- 计算月最大的销售额 --> 

<xsl:variable name="max_week_sales_value"> 

<xsl:for-each select="Month_sales"> 

<xsl:sort select="sum(product_sales/@value)" data-type="number" order="descending"/> 

<xsl:if test="position() = 1"> 

<xsl:value-of select="sum(product_sales/@value)"/> 

</xsl:if> 

</xsl:for-each> 

</xsl:variable> 

<!-- 柱状图相对高度,圆整为100 --> 

<xsl:variable name="max_graph_height" select="floor(($max_week_sales_value + 99) div 100) * 100"/> 

<!-- 调用模板,画出柱状图的背景及图例文字和边框线 --> 

<xsl:call-template name="draw_graph"> 

<xsl:with-param name="max_graph_height" select="$max_graph_height"/> 

<xsl:with-param name="bar_count" select="$weeks_count"/> 

</xsl:call-template> 

<!-- 调用模板,画出柱状图及图例文字 --> 

<xsl:apply-templates select="Month_sales"> 

<xsl:sort select="@Month_no" data-type="number"/> 

<xsl:with-param name="max_graph_height" select="$max_graph_height"/> 

</xsl:apply-templates> 

</xsl:template> 

<xsl:template name="draw_graph"> 

<xsl:param name="max_graph_height"/> 

<xsl:param name="bar_count"/> 

<xsl:variable name="actual_width" select="($bar_count * ($bar_width + $bar_spacing)) + $bar_spacing"/> 

<g id="GridAndLegend" style="stroke:#00FF00;" shape-rendering="crispEdges" stroke-width="1"> 

<!-- 画出背景颜色和边框线 --> 

<path fill="rgb(255, 235, 205)" stroke="#000099" d="M {$left_margin},{$graph_height + 20} h{$actual_width} v-{$graph_height + 10} h-{$actual_width} v{$graph_height +10}"/> 

<!-- 画出原点和水平线 --> 

<path fill="none" stroke="#FF0000" d="M {$left_margin - 10},{$graph_height + 20} h10"/> 

<text text-anchor="end" baseline-shift="-3" transform="matrix(1 0 0 1 {$left_margin - 15} {$graph_height + 20})">0</text> 

<!-- 画出垂直线和图例文字 --> 

<xsl:call-template name="draw_graph_vertical_legends"> 

<xsl:with-param name="max" select="$max_graph_height"/> 

<xsl:with-param name="legend_threshold" select="$max_graph_height div $graph_height"/> 

<xsl:with-param name="actual_width" select="$actual_width"/> 

</xsl:call-template> 

</g> 

</xsl:template> 

<!-- 递归调用的模板,画出垂直线和图例说明 --> 

<xsl:template name="draw_graph_vertical_legends"> 

<xsl:param name="max"/> 

<xsl:param name="legend_threshold"/> 

<xsl:param name="actual_width"/> 

<!-- 开始数字和步长 --> 

<xsl:param name="start" select="number(100)"/> 

<xsl:param name="step" select="number(100)"/> 

<xsl:param name="prev_marked_start" select="number(0)"/> 

<!-- 计算垂直位置 --> 

<xsl:variable name="prev_vert_posn" select="($prev_marked_start div $max) * $graph_height"/> 

<xsl:variable name="vert_posn" select="($start div $max) * $graph_height"/> 

<!-- 计算本水平线和上一条水平线的间距 --> 

<xsl:variable name="new_marked_start"> 

<xsl:choose> 

<xsl:when test="($vert_posn - $prev_vert_posn) >= $legend_threshold"> 

<xsl:value-of select="$start"/> 

</xsl:when> 

<xsl:otherwise> 

<xsl:value-of select="$prev_marked_start"/> 

</xsl:otherwise> 

</xsl:choose> 

</xsl:variable> 

<!-- 画出间距不小于一个单位的水平线和图例说明文字 --> 

<xsl:if test="$new_marked_start = $start"> 

<path fill="none" stroke="#FF0000" d="M {$left_margin - 10},{$graph_height + 20 - floor($vert_posn)} h{$actual_width + 10}"/> 

<text text-anchor="end" baseline-shift="-3" transform="matrix(1 0 0 1 {$left_margin - 15} {$graph_height + 20 - floor($vert_posn)})"> 

<xsl:value-of select="$start"/> 

</text> 

</xsl:if> 

<!-- 如果没有到达最大值,递归调用本模板 --> 

<xsl:if test="$start < $max"> 

<xsl:call-template name="draw_graph_vertical_legends"> 

<xsl:with-param name="max" select="$max"/> 

<xsl:with-param name="legend_threshold" select="$legend_threshold"/> 

<xsl:with-param name="actual_width" select="$actual_width"/> 

<xsl:with-param name="start" select="$start + $step"/> 

<xsl:with-param name="step" select="$step"/> 

<xsl:with-param name="prev_marked_start" select="$new_marked_start"/> 

</xsl:call-template> 

</xsl:if> 

</xsl:template> 

<!-- 画出每月的销售纪录图 --> 

<xsl:template match="Month_sales"> 

<xsl:param name="max_graph_height"/> 

<!-- 画出每月的销售额柱状图,以下三个变量分别代表:当月销售总额、柱的高度、柱的左边坐标位置 --> 

<xsl:variable name="sales_value" select="sum(product_sales/@value)"/> 

<xsl:variable name="bar_height" select="floor(($sales_value div $max_graph_height) * $graph_height)"/> 

<xsl:variable name="bar_left" select="((position() - 1) * ($bar_width + $bar_spacing)) + $bar_spacing"/> 

<!-- 画出柱,并且添加鼠标事件执行的函数 --> 

<path fill="#0066FF" stroke="none" d="M {$bar_left + $left_margin},{$graph_height + 19} h{$bar_width} v-{$bar_height} h-{$bar_width} v{$bar_height}" 

onmouseover="On_MouseOver(evt,'HideShow_{@Month_no}')" onmouseout="On_MouseOut(evt,'HideShow_{@Month_no}')"/> 

<!-- 画出图示说明 --> 

<text text-anchor="middle" transform="matrix(1.5 0 0 1.5 {$left_margin + $bar_left + ($bar_width div 2)} {$graph_height + 40})"> 

<xsl:value-of select="@Month_no"/> 

<xsl:text>月</xsl:text> 

</text> 

<!-- 创建鼠标移出时的图样,包括直线和文字 --> 

<g id="HideShow_{@Month_no}" style="visibility: hidden;"> 

<!-- 画出水平线 --> 

<path fill="none" stroke="red" d="M {$left_margin - 10},{$graph_height + 20 - $bar_height} h{$bar_left + 10}"/> 

<!-- 写出文字(销售额),并进行格式化 --> 

<text transform="matrix(1 0 0 1 {$left_margin + $bar_left + 2} {($graph_height + 30) - $bar_height})"> 

<xsl:value-of select="format-number($sales_value,'#,##0')"/> 

</text> 

</g> 

</xsl:template> 

</xsl:stylesheet> 

最后,要在页面中看到SVG格式的统计图,有两种办法:一是直接在客户端转换,在Data.xml使用XSL样式单即可;二是利用ASP在服务器端先进行转换,再输出到客户端。我们这里采用ASP来完成,因为,如果有多种统计图样式的话,这样可以让用户进行选择显示,调用不同的XSL文件即可。DataToSVG.asp文件如下: 

<%@ Language="VBScript"%> 

<Meta Name="Author" Content="lht"> 

<Meta Name="WebSite" Content="http://free.cnyys.com/my/freebird/index.asp"> 

<Meta Name="WebSite" Content="http://www.yahoo.com.cn"> 

<Meta Name="CopyRight" Content"> 

<% 

Response.Clear 

Response.Buffer = True 

Dim xmlDom, xslDom, strResult 

Set xmlDom = Server.CreateObject("Msxml2.DOMdocument.quot;) 

Set xslDom = Server.CreateObject("Msxml2.FreeThreadedDOMdocument.quot;) 

xmlDom.async = False 

xslDom.async = False 

xmlDom.load Server.MapPath("Data.xml") 

xslDom.load Server.MapPath("XSLTToGraph.xsl") 

Response.ContentType = "image/svg+xml" 

strResult = xmlDom.transformNode(xslDom) 

' 在不支持UTF-16编码的饿平台上,替换成UTF-8 

strResult = Replace(strResult,"UTF-16","UTF-8") 

Response.Write strResult 

%>

posted @ 2005-12-16 18:45 WJH 阅读(1306) | 评论 (1)编辑 收藏

1、
<body>
  <h2 style="text-align: center">SVG Demonstration</h2>
   <p>A page may have other code besides the SVG image.</p>
    <object type="image/svg+xml" data="MySVG.svg"
                          width="300" height="200">
     <img src="NonSVG.gif" alt="SVG 图像的静态版本" />
  </object>
  <p>Using objects allows the browser to decide what to display.</p>
  </body>
2、
<embed width="640" height="560" type="image/svg-xml" id="svgmapctrl"
pluginspage="http://www.adobe.com/svg/viewer/install/" src="default.svg" ></embed>

posted @ 2005-12-16 18:42 WJH 阅读(512) | 评论 (0)编辑 收藏

获取动态数据显示的柱形图
你们可以看看效果如何,点击柱形还可以改变颜色。
我现在做的系统是VC++编码的,我的这段svg代码也是VC++生成的,我这里的动态数据是随机获得的,但我们的系统要求根据系统中指定的动态变量显示柱形图,我不知道如何使javascript与我的系统通讯获得系统中的动态数据变量,大家出出主意吧!
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" 
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg width="1000" height="1000" xmlns="http://www.w3.org/2000/svg"
                      xmlns:xlink="http://www.w3.org/1999/xlink" onload="setheight()">
<script type="text/javascript">
<![CDATA[
  var svgRoot=document.documentElement;
  var redVal=0;
  var greenVal=0;
  var blueVal=0;
  function  setColor(evt)
    {
     var target=evt.getTarget();
     redVal=Math.round(Math.random()*255);
     greenVal=Math.round(Math.random()*255);
     blueVal=Math.round(Math.random()*255);
     target.setAttribute("fill","rgb("+redVal+","+greenVal+","+blueVal+")");
    }
  function  setheight()
    {
      var rect1,long,long1;
      rect1=svgRoot.getElementById("rect1");
      long=Math.round(Math.random()*200);
      rect1.setAttribute("height",long);
      rect1.setAttribute("y",600-long);
      setTimeout("setheight()",1000);
    }
//]]>
</script>
<g>
 <line x1="100" y1="100" x2="100" y2="600" stroke="rgb(0,0,0)"/>
 <line x1="100" y1="600" x2="600" y2="600" stroke="rgb(0,0,0)"/>
 <line x1="100" y1="350" x2="600" y2="350" />
 <line x1="100" y1="100" x2="600" y2="100" />
 <text x="98" y="105" text-anchor="end"> 1000 </text>
 <text x="98" y="355" text-anchor="end">  500 </text>
 <rect id="rect1" x="105" y="400" height="200" width="40" onclick="setColor(evt)"/>
 <rect x="150" y="200" height="400" width="40" onclick="setColor(evt)"/>
 <rect x="195" y="300" height="300" width="40" onclick="setColor(evt)"/>
 <rect x="240" y="100" height="500" width="40" onclick="setColor(evt)"/>
 <rect x="285" y="120" height="480" width="40" onclick="setColor(evt)"/>
 <rect x="330" y="500" height="100" width="40" onclick="setColor(evt)"/>
 <rect x="375" y="440" height="160" width="40" onclick="setColor(evt)"/>
 <defs>
 <polyline id="polyline" points="97,107 100,100 103,107"/>
 </defs>
 <use xlink:href="#polyline"/>
 <use xlink:href="#polyline" transform="translate(700,500) rotate(90)"/>
</g>
</svg>
如果数据与服务器同一台机,可以将数据存成XML,使用getURL()载入,parseXML()读出。

var svgdoc = ""
function get_url(evt){
 svgdoc = evt.target.ownerDocument
 getURL("test.xml",callback)
}
function callback(data){
 if (data.success){
  new_node = parseXML(data.content,svgdoc)
  //...
 }
}


posted @ 2005-12-16 18:15 WJH 阅读(1188) | 评论 (3)编辑 收藏

一位一年级的女老师最近被他的一个学生所困扰. 老师问:「你怎么了?」
    学生回答说:「我太聪明了,一年级对我来说太简单了。我比我姐姐都聪明,可是她却在3 年级。我觉得我也应该上三年级!」
    老师已经受够他了。於是她把学生带到了校长办公室。
    她向校长解释了一下学生的情况.
    校长建议应该给学生一个测试,如果他答错了任何一个问题,他就应该呆在一年级里. 老师同意了。
    学生被叫进了办公室,老师向他说明了校长的意思,学生也同意了。
    校长:「3 乘3 等於几?」
    学生:「9 」
    校长:「6 乘6 等於几?」
    学生:「36」
    就这样,校长问了很多3 年级的问题,学生都回答正确.
    於是校长对学生的老师说:「我想他可以到3 年级上课了。」
    学生的老师说:「让我问他几个问题吧。」
    校长和学生都同意了。
    老师:「什么东东牛有4 个而我只有2 个?」
    学生:「腿。」
    老师:「什么东东你裤子里有而我的裤子里没有?」(校长对学生老师问的问题感到很奇怪,她为什么要问这些问题,校长想。)
    学生:「口袋。」
    老师:「什么东东以C 开头,T 结尾,上面有很多毛,椭圆型,含有令人陶醉的,乳白色的液体?」校长的眼睛睁着大大的,想阻止老师继续问下去,学生回答说:「椰子(Coconut )。」
    老师:「什么东东进去的时候是即红又硬,而出来的时候是软的、有黏液的 ?」
    学生:「泡泡糖。」
    老师:「什么事情男人要站着做,女人坐着做,狗用三条腿做?」
    学生:「握手。」
    老师想了一想说:「现在我将问你几个\" 你猜我是什么\" 的问题,可以吗?」
    学生:「好的!」
    老师:「你用棍?在我的里面,把我顶上,再把我支起来。而我在这之前就变湿了。」
    学生:「帐篷。」
    老师:「手指会进入我。当你烦躁的时候你会玩弄我。最好的男人一直会有我。」
    学生:「结婚戒指。」
    老师:「进入过我的东东有大有小。当我不舒服的时候,我就会滴下水滴。
    当你吹我的时候,你会感到很舒服。」
    学生:「鼻子。」
    老师:「我有一个坚硬的杆。我的头可以插入到别的东东. 随后,那东东就会全身颤抖。」
    学生:「箭。」
    老师:「什么单词以F 开头,K 结尾,并且有让人兴奋的意思。」
    学生:「救火车(Firetruck )。」
    老师的问题终於问完了,校长松了一口气,擦了擦额头上的汗说:「让学生到五年级吧,刚刚你问的那十道题我都全答错了。」

posted @ 2005-11-06 16:10 WJH 阅读(261) | 评论 (1)编辑 收藏

有个男的爱跳舞(交谊舞)。每次去跳舞都要把皮鞋擦得锃亮。

  有一天,他又去跳舞。在舞厅里请一小姐跳舞,跳着跳着,一低头看见自己锃亮的黑皮鞋映出小姐的内裤,(小姐都穿裙子)于是,轻声对小姐说“你今天穿着一条红色内裤?”小姐大怒,转身离去。


  又请另一位小姐跳舞,跳着跳着,一低头又看见了,轻声对小姐说“小姐今天穿着一条白色内裤。”


  小姐先是一怒,后一想,他老老实实的跳舞怎会知道我穿什么内裤,难道他有特异功能,试一试。于是对男的说,“对不起,我去趟卫生间”


  进到卫生间后,小姐换了一条蓝色内裤。出去继续和那男的跳舞,跳着跳着,那男的说:“小姐你换了一条蓝色内裤。”


  小姐一惊,又转身来到卫生间,心想这次干脆不穿内裤了,看那男的还能看出什么来。于是脱掉内裤,出去又和那男的跳舞。


  那男的跳着跳着,低头一看,惊叫起来,“哎呀,糟了。我的皮鞋裂了一个大口子!”

posted @ 2005-11-06 16:10 WJH 阅读(191) | 评论 (0)编辑 收藏

有一个人叫美国,他自恃肌肉发达,到处作威作福。一日,他趁着与人斗殴后的兴奋,随手强*了一个叫日本的女人,记得那一年是1945年。虽说日本早已不是处女,也先后有过几次性行为,但由于她特有的与生俱来的变态和*荡,居然和美国这小子好上了。至此,各位看官定以为日本和美国应结婚生子白头到老了。可是事实是美国从来是个不负责任的“滥交”主义者,而日本恰恰是一个富有BZ特性的浪荡妇,于是没结婚,但同居着。
  
   话说早在美国强*日本的同时刚好被路过的朝鲜韩国这对双胞胎姐妹撞见了(美国在路上强*了日本)。好色的美国有瞧上姐妹俩了。有一日,美国小儿瞅准了机会强*了韩国。正当他想把魔爪伸向朝鲜时,闻讯赶来的邻居中国大吼一声:“强*犯”,使得美国阳痿,这才使朝鲜免遭欺凌。但由于当时中国势单力薄,遂没与这*魔发生正面冲突。
  
   俗话说:“好人有好报”,但善良的中国没得到好报。他有一个正值花季的女儿叫台湾,相貌姣好,但因为家里穷,本该读书上学的她辍学了。中国很内疚,他没日没夜地工作,希望能攒够了学费给台湾念书。但可怜的中国没想到,由于台湾无所事事,与远近闻名的荡妇日本交上了朋友。*妇日本看着台湾姣好的面容和凹凸有致的身材不由的羡慕起来又有羡慕转向嫉妒,又有嫉妒转向报复。她夸台湾长得好,是块伺候男人的料。在她的煽动下,台湾出于对现实的不满和花季少女特有的虚荣和叛逆,与一天夜里离家与那个荡妇出走了。
  
   不出我们的所料,毒蛇一样的日本把台湾带到了自己的家,并把她介绍给了美国。美国于当晚强行与台湾发生了性关系.
  
   那一夜,有人听到了声嘶力竭的救命声,有人听到了嚣张的笑声。。。。
  
   这一夜,风刮得很大,雨下得很大 .
  
   台湾就在这一夜开始了黑暗的出卖肉体的卖*生活,而他的老父亲还在风雨中加班,不知宝贝女儿已遭蹂躏。不要问我中国找不到女儿的时候怎么样了,有过子女的看官应该能想得到有多么凄惨。。。
  
   过了很多年,中国碰见了自己的女儿。她更成熟了,穿的花枝招展,似乎更漂亮了,只是她的眼神不再那么天真可爱无私,她甚至当作不认识中国,漠然地想从他身边走过。中国紧紧地抓住了她的手无助地望着自己的女儿一声不吭,眼里闪着泪珠。台湾不敢正视自己苍老的父亲的那一双眼睛,恐惧抓住她的父亲粗糙的手,因为这使她想起自己的不堪回首的过去和自己的狠心与自私,她重重地甩开父亲的手,飞快地跑了。中国死命地追,直到看着台湾跑进了一幢别墅, 从窗户看进去,正好看到了美国这*棍。中国似乎恍然间明白了所有的事,激起了所有的恨,他拼命地砸门,喊着女儿湾的名字。门开了,美国依旧那么嚣张,身上长满了毛,可能是滥交的缘故,好像还没进化成人的猿人,左边搂着台湾,右边搂着韩国。台湾仍不敢正视中国,她故意在父亲面前作出*荡的动作,显示与美国的性生活很好。中国知道这是她有意在气他,他不怪她,他只是想好好的尽一个父亲的义务,让她忘了苦难的过去,开始美好的人生,不要在自暴自弃了,美国不是个好东西,日本更是一个彻头彻脸的BZ。此时,忽然闻见一股浓重的恶臭,原来是日本这个BZ生了满下身的性病,还在自慰,差点没让中国呕吐。
  
   “台湾,父亲对不住你,你这么自暴自弃,早晚有一天,会跟日本的下场一样的。我现在有点积蓄了,能让你生活的不错。。。”
  
   说着,美国的手机响了。“喂,伊拉克小姐,你是自己到我床上来,还是。。。。”只听得手机那边一阵骂,美国挂了,小声嘀咕着:“干定你了”
  
   中国知道又有良家妇女要遭殃了,想狠狠揍他娘美国小儿,但来时匆忙没带家伙,愤愤地离开了。那以后,中国一直找台湾,劝导她,可她越劝越于美国亲热,毫不顾忌面前的父亲,有时竟纵恿美国打中国,但中国不放弃。。。
  
   多少年过去了,有巴拿马MM被强*,南联盟MM被强*了,有阿富汗MM也被强*了,最近伊拉克MM又被强*了,然后被美国扔给英国、西班牙他们轮*。。。。
  
   美国的恶行罄竹难书阿。。。。
  
   “而我的女儿还在和他鬼混,还有BZ日本肮脏下体发出的一股又一股的恶臭”,中国越想越紧迫,得设法救出台湾。”
  
   “女儿,你何时体谅一下父亲的心,不要再自暴自弃了,回来吧。。。”

posted @ 2005-11-06 16:09 WJH 阅读(235) | 评论 (0)编辑 收藏

某国进入总统大选,选票拉到了一个很大的城市。一位总统候选人的智囊团对他出主意,让那些妓女也来投票。妓女们纷纷赞成。但是,妓女群体毕竟不同于工会组织之类,大家都怕出差错,特别是在游行时喊口号出错。于是,智囊团建议审查游行口号。
  
  等到游行那一天,城市的各局长负责审理妓女队伍的标语。
1 只见妓女1队伍的标语口号是:“一不偷,二不抢,三不反对执政党。”安全局长见了,高兴地说:“行啦,行啦!” 
2 只见妓女2队伍的标语口号是:“不占地,不占房,只是用了一张床。”国土局长见了,高兴的说:“好咧,好咧!”
3 只见妓女3队伍的标语口号是:“不生女,不添男,不给政府添麻烦。”人口局长见了,高兴的说:“不错,不错!” 
4 只见妓女4队伍的标语口号是:“无噪音,无污染,只是偶尔喊一喊。”环保局长见了,高兴的说:“你们喊吧,你们喊吧!”
5 只见妓女5队伍的标语口号是:“无资金,无贷款,自带设备搞生产。”开发局长见了,高兴的说:“欢迎,欢迎!“
6 只见妓女6队伍的标语口号是:“下岗妹,别流泪,跟我走进夜总会。”社保局长见了,高兴的说:“总会,总会。”
7 只见妓女7队伍的标语口号是:“虽舒服,也劳累,拉动内需创外汇。”经贸局长见了,高兴的说:“拉吧,创吧!“
8 只见妓女8对伍的标语口号是:“灾不招,祸不惹,坚决不当第三者。”妇联主任见了,高兴地说:“省心,省心!” 
9 只见妓女9队伍的标语口号是:“一不偷,二不抢,注重信誉抓市场。”工商局长见了,高兴地说:“提娼,提娼!” 
10  只见妓女10队伍的标语口号是:“丑不嫌,老不怕,培养干部责任大。”组织部长见了,高兴地说:“谢谢,谢谢!” 
11 只见妓女11队伍的标语口号是: 不管老,不管小。坚决实践“三个..”宣传部长看了,高兴地说挺好,挺好!

posted @ 2005-11-06 16:08 WJH 阅读(398) | 评论 (0)编辑 收藏

今天终于从南京回来了,哈哈,考的爽啊!

posted @ 2005-11-06 15:35 WJH 阅读(126) | 评论 (0)编辑 收藏

仅列出标题
共4页: 1 2 3 4