XML+XSLT+xalan-j+svg生成地图

12 篇文章 0 订阅

XML+XSLT+xalan-j+svg生成地图

schema文件:site.xsd

 

[xhtml]  view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">  
  3.     <xs:element name="note">  
  4.         <xs:complexType>  
  5.             <xs:sequence>  
  6.                 <xs:element name="site" maxOccurs="unbounded">  
  7.                     <xs:complexType>  
  8.                         <xs:sequence>  
  9.                             <xs:element name="sitename" type="xs:string"/>  
  10.                             <xs:element name="x" type="xs:decimal"/>  
  11.                             <xs:element name="y" type="xs:decimal"/>  
  12.                             <xs:element name="linksite" maxOccurs="unbounded">  
  13.                                 <xs:complexType mixed="true">  
  14.                                     <xs:attribute name="distance" type="xs:decimal"/>  
  15.                                 </xs:complexType>  
  16.                             </xs:element>  
  17.                         </xs:sequence>  
  18.                     </xs:complexType>  
  19.                 </xs:element>  
  20.             </xs:sequence>  
  21.         </xs:complexType>  
  22.     </xs:element>  
  23. </xs:schema>  

 

xml文件:sitedata.xml

 

[xhtml]  view plain copy
 
  1. <?xml version="1.0" encoding="GB2312"?>  
  2. <?xml-stylesheet type="text/xsl" href="sitetosvgmap.xsl"?>  
  3.   
  4. <note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:/study/xml/map/site.xsd">  
  5.     <site>  
  6.         <sitename>雍和宫</sitename>  
  7.         <x>300.5</x>  
  8.         <y>40.5</y>  
  9.         <linksite distance="200">长城</linksite>  
  10.         <linksite distance="400">天坛</linksite>  
  11.         <linksite distance="200">新街口</linksite>  
  12.     </site>  
  13.     <site>  
  14.         <sitename>长城</sitename>  
  15.         <x>20</x>  
  16.         <y>93</y>  
  17.         <linksite distance="20">雍和宫</linksite>  
  18.         <linksite distance="30">地安门</linksite>  
  19.     </site>  
  20.     <site>  
  21.         <sitename>天坛</sitename>  
  22.         <x>100</x>  
  23.         <y>23</y>  
  24.         <linksite distance="20">雍和宫</linksite>  
  25.         <linksite distance="10">前门</linksite>  
  26.     </site>  
  27.     <site>  
  28.         <sitename>地坛</sitename>  
  29.         <x>200</x>  
  30.         <y>223</y>  
  31.         <linksite distance="20">雍和宫</linksite>  
  32.         <linksite distance="10">地安门</linksite>  
  33.     </site>  
  34.     <site>  
  35.         <sitename>地安门</sitename>  
  36.         <x>200</x>  
  37.         <y>23</y>  
  38.         <linksite distance="10">地坛</linksite>  
  39.     </site>  
  40.       
  41.     <site>  
  42.         <sitename>前门</sitename>  
  43.         <x>100</x>  
  44.         <y>523</y>  
  45.         <linksite distance="20">雍和宫</linksite>  
  46.         </site>  
  47.           
  48. </note>  

 

 

下面这个可是,先贴上代码再说

xslt文件:sitetosvg.xslt

 

[xhtml]  view plain copy
 
  1. <?xml version="1.0" encoding="gb2312"?>  
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  3.     <!--   定义XSLT转换后输出的文件的格式,这里输出为XML格式的文件内容   -->  
  4.     <xsl:output method="xml" indent="yes" encoding="UTF-8" version="1.0" standalone="no" media-type="image/svg+xml"/>  
  5.     <xsl:template match="note">  
  6.         <svg width="100%" height="100%">  
  7.         <xsl:for-each select="site">            
  8.             <!--得到起始站点的坐标x,y并存入变量中-->  
  9.             <xsl:variable name="x" select="x"/>  
  10.             <xsl:variable name="y" select="y"/>  
  11.             <xsl:variable name="sitename" select="sitename"/>           
  12.             <!--根据上面赋值后的变量按坐标输出起始站点的名称-->  
  13.             <text x="{$x}" y="{$y}">  
  14.             <xsl:value-of select="sitename"/>  
  15.             <xsl:value-of select="x"/>  
  16.             <xsl:value-of select="y"/>  
  17.             </text>  
  18.               
  19.             <!--根据上面赋值后的变量按坐标输出圆圈代表起始站点-->  
  20.             <circle cx="{$x}" cy="{$y}" r="4"   
  21.             style="fill:white;stroke-width:2;stroke:black;fill-opacity:0"/>  
  22.               
  23.             <!--查找与起始站点直接相连的站点,这块有点晕!!!!!for-each的select表示当前结点的子结点,也就是linksite-->  
  24.             <xsl:for-each select="./linksite">     
  25.               
  26.             <xsl:variable name="linkname" select="."/><!--还有这块,是查找当前结点所有的linksite-->  
  27.                 
  28.             <xsl:for-each select="/note/site">  
  29.   
  30.             <xsl:if test="sitename=$linkname">               
  31.             <xsl:variable name="lx" select="x"/>  
  32.             <xsl:variable name="ly" select="y"/>  
  33.             <line x1="{$x}" y1="{$y}" x2="{$lx}" y2="{$ly}"  
  34. style="stroke:rgb(99,99,99);stroke-width:2"/>  
  35.             </xsl:if>  
  36.             </xsl:for-each>  
  37.                             
  38.                 
  39.             </xsl:for-each>  
  40.               
  41.             </xsl:for-each>  
  42.                   
  43. <!--     <xsl:for-each select="/note/site">  
  44.   
  45.             <xsl:if test="sitename='雍和宫'">  
  46.             <xsl:variable name="pos" select="position()*30"/>  
  47.                
  48.             <text x="{$pos}" y="400">  
  49.             <xsl:value-of select="sitename"/>  
  50.             </text>  
  51.             </xsl:if>  
  52.               
  53.               
  54.       
  55.               
  56.               
  57.             <xsl:for-each select="/note/site[sitename=$linkname]">  
  58.               
  59.             <text x="{$x+100}" y="{$y+100}">  
  60.             heihei  
  61.             </text>  
  62.              
  63.             <xsl:variable name="lx" select="x"/>  
  64.               
  65.             <text x="300" y="300">  
  66.             <xsl:value-of select="x"/>  
  67.             </text>     
  68.             <xsl:variable name="ly" select="y"/>  
  69.              <text x="400" y="400">  
  70.             <xsl:value-of select="y"/>  
  71.             </text>    
  72.               
  73.             <line x1="{$x}" y1="{$y}" x2="{$lx}" y2="{ly}"  
  74.                style="stroke:rgb(99,99,99);stroke-width:2" mce_style="stroke:#636363;stroke-width:2"/>  
  75.   
  76.               
  77.             <text x="{$lx+30}" y="{$ly+40}">  
  78.             <xsl:value-of select="sitename"/>  
  79.             </text>        
  80.                  
  81.             </xsl:for-each>    
  82.               
  83.               
  84.                   
  85.             </xsl:for-each>  
  86.             </xsl:for-each>-->  
  87.         </svg>  
  88.     </xsl:template>  
  89. </xsl:stylesheet>  

 

如果要把上面的sitetosvg.xslt转换为带有图形格式的可以用浏览器(装有SVGView)显示的svg文件,需要用到两个jar包,分别是xerces.jar和xalan.jar。

网上有下载这两个文件的,下载后需要配置,这样:

1.配置系统环境变量,将D:/Program Files/Java/jdk1.5.0_22/bin加到path中,前提是安装了jdk

2.将上面提到的两个jar包放到D:/Program Files/Java/jdk1.5.0_22/jre/lib/ext中

3.在cmd中运行命令行: java org.apache.xalan.xslt.Process -IN sitedata.xml -XSL sitetosvg.xslt -OUT map.svg

然后会在跟sitedata.xml 、sitetosvg.xslt 相同的目录下生成map.svg文件,直接打开久可以看到地图了。

 

说明:

1.当初不明白怎么用xslt转换成svg,老郁闷了,现在实现了,但是不尽理想。因为我当时是这样想的:写出xslt文件之后(当然此文件里也需要svg来画图),在网页中用javascript来调用xml文件以及xslt文件,但是很遗憾,不知道咋地,图形显示不出来,我已经试了很多方法。

2.用javascript的方法有一个好处是:每次直接打开网页就可以,不用向上述转换的方式还要用java把xslt转换成svg。也就是说如果xml文件或xslt文件有改动的话,还有用java重新转一次,而javascipt方法就不必这么麻烦。所以,还要在想想办法怎么解决这个问题。

3.就是头疼的xslt还有xpath,因为总是搞不清楚当前结点是什么,还有for-each的多层嵌套。不过试了一天,总算是试出来了。

4.还有一点就是站点的连线有直线表示的,因为还有一个用c++写的求最短路径的程序,所以直接用直线的长度代表曲线的长度了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值